加入星計劃,您可以享受以下權益:

  • 創(chuàng)作內容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
  • 推薦器件
  • 相關推薦
  • 電子產業(yè)圖譜
申請入駐 產業(yè)圖譜

基于狀態(tài)機和面向對象的思想,設計一個通用的按鍵檢測模塊

06/05 09:49
3445
閱讀需 7 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

物理按鍵,在很多嵌入式產品里面應用得非常廣泛,很多嵌入式軟件工程師在剛剛開始入門的時候,點完燈之后就開始學習按鍵輸入檢測。按鍵輸入可以說是繼點燈之后,又一經典的嵌入式入門必學內容之一。

在很多嵌入式入門學習的教程里面,按鍵原理普遍被認為是“很簡單”的知識點之一,按鍵輸入檢測的原理,無非就是通過CPU不斷掃描按鍵引腳電平狀態(tài),或者采用單片機引腳外部中斷方式,然后在死循環(huán)或者中斷服務程序里面處理按鍵被按下后的邏輯。

然而,在這個“很簡單的高低電平檢測”的原理背后,通過產品經理給物理按鍵各個動作賦予的(難以理解的)意義,一個小小的物理按鍵開始變得復雜起來,這些動作包括:按下、抬起、單擊、雙擊、點動、長按、組合按鍵。。。等等。

以上這些復雜的按鍵動作,已經不是一個“簡單的高低電平檢測”所能描述清楚的了,成熟的單片機按鍵檢測模塊,必須能很好地處理以上按鍵動作,并且具有很高的內聚度,與單片機的底層引腳盡量低耦合,且能提供靈活的應用層調用接口。

采用嵌入式 C 語言面向對象的思想,通過狀態(tài)機和回調函數(shù)的方式,我們來編寫一個通用的按鍵檢測模塊,以更好地覆蓋單片機的物理按鍵應用場合。
以下是物理按鍵模塊的設計過程。

1、這個通用的物理按鍵模塊,主要是由4個源代碼文件組成,key_driver.c和key_driver.h主要是驅動層接口,主要面向不同的單片機引腳適配。key_module.c和key_module.h主要是面向應用層接口,與芯片硬件引腳無關。

2、key_driver.c 和 key_driver.h主要是用來適配不同的單片機GPIO外設的,在key_driver.h里面,聲明了一個key_driver_t類型的結構體,主要提供GPIO引腳初始化接口以及引腳電平讀取接口,如下圖所示。

3、在key_driver.c里面,主要是對初始化接口和引腳電平讀取接口的具體實現(xiàn),比如,引腳初始化接口_init()函數(shù)和電平讀取接口_read_pin_state(),其具體實現(xiàn)如下圖所示。

4、在key_driver.c里面,定義了一個key_driver結構體變量,記住這個變量,很重要,后面會被key_module進行調用,key_driver的具體內容如下圖所示。

5、在key_module.h里面,主要是聲明了兩個重要的結構體,key_t結構體是面向單個按鍵對象的,主要是包括按鍵ID以及按鍵狀態(tài)枚舉,還有一些變量是用來進行按鍵檢測過程的,key_manager_t結構體主要是用來管理多個按鍵對象的,包括各個按鍵動作的函數(shù)接口,還有按鍵引腳的驅動程序,如下圖所示。

6、按鍵模塊還對外提供了多個外部調用接口,包括模塊初始化,按鍵模塊時間更新,按鍵模塊的時基更新,按鍵模塊的按鍵動作回調函數(shù)處理,如下圖所示。

7、在key_module.c里面,主要是對以上外部接口的具體實現(xiàn),比如,key_module_init()主要是對按鍵模塊的各個參數(shù)初始化,以及注冊按鍵模塊的引腳驅動程序,代碼如下圖所示。

8、在key_module_update()函數(shù)里面,主要是以狀態(tài)機和回調函數(shù)的方式,處理各個按鍵狀態(tài)和動作,按鍵狀態(tài)有KEY_IDLE、KEY_PRESSED、KEY_RELEASED、KEY_SINGLE_CLICK、KEY_DOUBLE_CLICK、KEY_LONG_PRESS。代碼如下圖所示。

9、在各個不同的狀態(tài)里面,通過回調函數(shù)的方式,分別對按下、抬起、單擊、雙擊、長按、等按鍵動作進行處理,限于篇幅,這里只列出部分代碼,具體實現(xiàn)請參考具體源碼和注釋。

10、按鍵模塊需要對其提供系統(tǒng)時基,通常以1毫秒或者10毫秒作為時間基準,key_module_ticks_update()主要是在外部定時器或者外部1毫秒線程中被調用,key_module_set_event_handler()主要是用來設置各個按鍵狀態(tài)的回調函數(shù),如下圖所示。

11、如何使用key_module?假如項目采用RT-Thread進行調度,在main()函數(shù)里面,先創(chuàng)建一個key_module_thread()線程,然后在該線程里面先對按鍵管理器進行初始化,然后注冊各種按鍵狀態(tài)的回調函數(shù),最后在while循環(huán)里面,更新按鍵管理器的時基以及狀態(tài)更新函數(shù),線程主體以1毫秒的間隔進行調度,如下圖所示。

12、以上,就是一個通用的單片機按鍵模塊具體設計,通過這個按鍵檢測模塊,可以很好地處理各種按鍵狀態(tài)事件,并且該按鍵模塊在設計上遵循設備與驅動分離的原則,盡量做到了高內聚低耦合,具體很好的移植性和單片機平臺適配性。

13、美中不足的是,這個模塊還沒有加入組合按鍵處理,感興趣的讀者,可以下載該模塊的源碼,對其進行修改和擴展。

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據手冊 ECAD模型 風險等級 參考價格 更多信息
SST49LF008A-33-4C-WHE 1 Microchip Technology Inc 1M X 8 FLASH 3V PROM, 120 ns, PDSO32, 8 X 14 MM, ROHS COMPLIANT, MO-142BA, TSOP1-32

ECAD模型

下載ECAD模型
$5.86 查看
SN74LVCH32373ANMJR 1 Texas Instruments 32-bit transparent D-type latch with 3-state outputs 96-NFBGA -40 to 85

ECAD模型

下載ECAD模型
$52.41 查看
SN74LVC1G06DCKT 1 Texas Instruments Single 1.65-V to 5.5-V inverter with open-drain outputs 5-SC70 -40 to 125

ECAD模型

下載ECAD模型
$2.11 查看

相關推薦

電子產業(yè)圖譜