大家都知道“Stop Trying to Reinvent the Wheel”不要重復(fù)造輪子,但作為嵌入式程序猿每個項目都難免重復(fù)造些輪子。這個系(天)列(坑)會挨個介紹一些我日常用到開源組件,前人栽樹后人乘涼,縮減項目的開發(fā)周期好去摸(填)魚(坑)。
第一個組件,我重點推薦MultiButton!
按鍵!幾乎每個MCU級別的嵌入式項目都要用到,這是個天天要用的輪子,所以MultiButton這個組件就是我墻裂推薦的。感謝作者0x1abin
MultiButton 是一個小巧簡單(一個multi_button.c 一個multi_button.h)易用的事件驅(qū)動型按鍵驅(qū)動模塊,可無限量擴展按鍵,按鍵事件的回調(diào)異步處理方式可以簡化你的程序結(jié)構(gòu),去除冗余的按鍵處理硬編碼,讓你的按鍵業(yè)務(wù)邏輯更清晰。
License也非常的友好:MIT license
可以去這里下載到
0x1abin/MultiButton: Button driver for embedded system (github.com)
https://gitee.com/mirrors_0x1abin/MultiButton
使用方法
1. 先申請一個按鍵結(jié)構(gòu)
struct Button button12.初始化按鍵對象,綁定按鍵的GPIO電平讀取接口read_button_pin() ,后一個參數(shù)設(shè)置有效觸發(fā)電平
button_init(&button1, read_button_pin, 0, 0);3. 注冊按鍵事件
button_attach(&button1, SINGLE_CLICK, Callback_SINGLE_CLICK_Handler); button_attach(&button1, DOUBLE_CLICK, Callback_DOUBLE_Click_Handler); ....
4.啟動按鍵
button_start(&button1);
5.設(shè)置一個5ms間隔的定時器循環(huán)調(diào)用后臺處理函數(shù)
while(1) { ... if(g_TimerTicks >= 5) { g_TimerTicks = 0; button_ticks(); } }
特性
MultiButton 使用C語言實現(xiàn),基于面向?qū)ο蠓绞皆O(shè)計思路,每個按鍵對象單獨用一份數(shù)據(jù)結(jié)構(gòu)管理:
struct Button { uint16_t ticks; uint8_t repeat: 4; uint8_t event : 4; uint8_t state : 3; uint8_t debounce_cnt : 3; uint8_t active_level : 1; uint8_t button_level : 1; uint8_t button_id; uint8_t (*hal_button_Level)(uint8_t button_id_); BtnCallback cb[number_of_event]; struct Button* next; };
這樣每個按鍵使用單向鏈表相連,依次進(jìn)入 button_handler(struct Button* handle) 狀態(tài)機處理,所以每個按鍵的狀態(tài)彼此獨立。
按鍵事件
事件 | 說明 |
PRESS_DOWN | 按鍵按下,每次按下都觸發(fā) |
PRESS_UP | 按鍵彈起,每次松開都觸發(fā) |
PRESS_REPEAT | 重復(fù)按下觸發(fā),變量repeat計數(shù)連擊次數(shù) |
SINGLE_CLICK | 單擊按鍵事件 |
DOUBLE_CLICK | 雙擊按鍵事件 |
LONG_PRESS_START | 達(dá)到長按時間閾值時觸發(fā)一次 |
LONG_PRESS_HOLD | 長按期間一直觸發(fā) |
基于LPC系列的移植參考
以下代碼截圖基于NXP官方的LPC804開發(fā)板。
實際使用的時候,coder還要去看下multi_button.h里的兩個宏定義,TICKS_INTERVAL默認(rèn)是5即5mS,這個與它實例間隔5mS是對應(yīng)的。DEBOUNCE_TICKS默認(rèn)是3最大是8,用于按鍵消抖。長按和短按的時間靠LONG_TICKS和SHORT_TICKS設(shè)置或者說優(yōu)化,這兩個宏定義也在multi_button.h中。
-
mcu
+關(guān)注
關(guān)注
146文章
16813瀏覽量
349461 -
嵌入式
+關(guān)注
關(guān)注
5054文章
18917瀏覽量
300986 -
開源
+關(guān)注
關(guān)注
3文章
3190瀏覽量
42254
原文標(biāo)題:避免重復(fù)造輪子系列之按鍵組件-MultiButton
文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論