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