鴻蒙Hi3861開發板實現按鍵“按下事件”和“釋放事件”的通用框架
在帖子 《鴻蒙開發板外設控制》直播圖文版(2020.10.28) 中我們提到過:“開發板上的按鍵也可以看作一種 GPIO 外設。” 因此,要捕捉按鍵的狀態(按下或釋放)必須操作對應的 GPIO 端口,具體步驟如下:
- 確定目標按鍵對應的 GPIO 引腳(可通過設備文檔找到對應關系)
- 重新定義 GPIO 引腳的功能,數據傳輸方向設置為輸入(WIFI_IOT_GPIO_DIR_IN)
- 設置按鍵事件觸發方式(電平觸發或邊沿觸發),并注冊回調函數
示例代碼如下:
代碼說明:
- WIFI_IOT_IO_NAME_GPIO_8 端口連接了按鍵,若需要捕獲按鍵事件需要調用 IoSetFunc() 函數重定義端口功能
- 調用 IoSetPull() 函數將端口初始電平拉高(Pull Up)
- 調用 GpioRegisterIsrFunc() 函數設置按鍵事件為邊沿觸發方式,具體為下降沿觸發
- 將自定義的 OnButtonPressed() 函數注冊為按鍵回調函數,即:按鍵被按下時調用此函數
綜上可知,每個下降沿對應著按鍵按下,那么上升沿顯然對應這按鍵釋放;因此,可設置上升沿觸發按鍵事件,即:按鍵釋放時調用注冊的回調函數。
代碼如下:
GpioRegisterIsrFunc(WIFI_IOT_IO_NAME_GPIO_8,
WIFI_IOT_INT_TYPE_EDGE,
WIFI_IOT_GPIO_EDGE_RISE_LEVEL_HIGH,
OnButtonReleased, NULL);
0K! 接下來我們思考一個問題:如果同時需要捕獲按鍵按下和釋放兩個事件,如何寫代碼實現?即:按鍵按下時 OnButtonPressed() 被調用,按鍵釋放時 OnButtonReleased() 被調用。
也許有同學的第一想法會是:注冊兩次不就完事了嗎!!!
用代碼描述就是:
這看起來似乎合情合理,但,這么做是不行滴!!!因為,就目前來說,每個 GPIO 口只能注冊一個回調函數;所以,第二次注冊的信息將覆蓋第一次的注冊信息;說得更直白些:這么寫,只會在上升沿觸發回調 OnButtonReleased() !
那么是不是就沒法同時捕獲按鍵按下和釋放兩個事件呢?
那到不是,我們可以采用下面的方法實現。
對應代碼如下:
初始回調注冊:
回調函數中切換注冊:
看到這里,相信大家已經掌握了同時捕獲按下事件和釋放事件的方法了。然而,即便如此,當程序中需要使用多個按鍵時,我們不得不反復的編寫幾乎一模一樣的代碼。。。這并不是一件有趣的事,我們的時間應該花在更有創造性的工作上!所以,我把上面的方法封裝到兩個獨立的文件(dt_btn_util.h和dt_btn_util.c)中,方便大家需要時一鍵調用!
示例代碼如下:
是不是很簡單?!一行代碼即可同時捕獲按下事件和釋放事件。
示例代碼和封裝好的文件在附件中開箱即用。
相關代碼附件可以前往原文進行下載:https://harmonyos.51cto.com/posts/1512