大家都知道“Stop Trying to Reinvent the Wheel”不要重復造輪子,但作為嵌入式程序猿每個項目都難免重復造些輪子。這個系(天)列(坑)會挨個介紹一些我日常用到開源組件,前人栽樹后人乘涼,縮減項目的開發(fā)周期好去摸(填)魚(坑)。
第一個組件,我重點推薦MultiButton!
按鍵!幾乎每個MCU級別的嵌入式項目都要用到,這是個天天要用的輪子,所以MultiButton這個組件就是我墻裂推薦的。感謝作者0x1abin
MultiButton 是一個小巧簡單(一個multi_button.c 一個multi_button.h)易用的事件驅動型按鍵驅動模塊,可無限量擴展按鍵,按鍵事件的回調(diào)異步處理方式可以簡化你的程序結構,去除冗余的按鍵處理硬編碼,讓你的按鍵業(yè)務邏輯更清晰。
License也非常的友好:MIT license

可以去這里下載到
0x1abin/MultiButton: Button driver for embedded system (github.com)
https://gitee.com/mirrors_0x1abin/MultiButton
使用方法
1. 先申請一個按鍵結構
struct Button button12.初始化按鍵對象,綁定按鍵的GPIO電平讀取接口read_button_pin() ,后一個參數(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.設置一個5ms間隔的定時器循環(huán)調(diào)用后臺處理函數(shù)
while(1) {
...
if(g_TimerTicks >= 5) {
g_TimerTicks = 0;
button_ticks();
}
}
特性
MultiButton 使用C語言實現(xiàn),基于面向對象方式設計思路,每個按鍵對象單獨用一份數(shù)據(jù)結構管理:
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;
};
這樣每個按鍵使用單向鏈表相連,依次進入 button_handler(struct Button* handle) 狀態(tài)機處理,所以每個按鍵的狀態(tài)彼此獨立。
按鍵事件
| 事件 | 說明 |
| PRESS_DOWN | 按鍵按下,每次按下都觸發(fā) |
| PRESS_UP | 按鍵彈起,每次松開都觸發(fā) |
| PRESS_REPEAT | 重復按下觸發(fā),變量repeat計數(shù)連擊次數(shù) |
| SINGLE_CLICK | 單擊按鍵事件 |
| DOUBLE_CLICK | 雙擊按鍵事件 |
| LONG_PRESS_START | 達到長按時間閾值時觸發(fā)一次 |
| LONG_PRESS_HOLD | 長按期間一直觸發(fā) |
基于LPC系列的移植參考
以下代碼截圖基于NXP官方的LPC804開發(fā)板。
實際使用的時候,coder還要去看下multi_button.h里的兩個宏定義,TICKS_INTERVAL默認是5即5mS,這個與它實例間隔5mS是對應的。DEBOUNCE_TICKS默認是3最大是8,用于按鍵消抖。長按和短按的時間靠LONG_TICKS和SHORT_TICKS設置或者說優(yōu)化,這兩個宏定義也在multi_button.h中。

-
mcu
+關注
關注
147文章
18924瀏覽量
398059 -
嵌入式
+關注
關注
5198文章
20443瀏覽量
333990 -
開源
+關注
關注
3文章
4204瀏覽量
46129
原文標題:避免重復造輪子系列之按鍵組件-MultiButton
文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
EMFILE是否包含開源組件?
經(jīng)常使用到的開源免費軟件分享
HarmonyOS組件更新,新增700+開源組件
介紹一個事件驅動型按鍵驅動模塊MultiButton
MultiButton使用步驟和代碼的問題
超精簡的按鍵組件MultiButton概括
【中科昊芯Start_DSC28027勇士開發(fā)板試用體驗】開源庫MultiButton移植
日常生活中常用到的接口介紹
HarmonyOS新增開源組件概覽
2022 OpenHarmony組件大賽,共建開源組件
【中科昊芯Start_DSC28027勇士開發(fā)板試用體驗】開源庫MultiButton移植
日常用到開源組件—MultiButton
評論