大家都知道“Stop Trying to Reinvent the Wheel”不要重復造輪子,但作為嵌入式程序猿每個項目都難免重復造些輪子。這個系(天)列(坑)會挨個介紹一些我日常用到開源組件,前人栽樹后人乘涼,縮減項目的開發周期好去摸(填)魚(坑)。
第一個組件,我重點推薦MultiButton!
按鍵!幾乎每個MCU級別的嵌入式項目都要用到,這是個天天要用的輪子,所以MultiButton這個組件就是我墻裂推薦的。感謝作者0x1abin
MultiButton 是一個小巧簡單(一個multi_button.c 一個multi_button.h)易用的事件驅動型按鍵驅動模塊,可無限量擴展按鍵,按鍵事件的回調異步處理方式可以簡化你的程序結構,去除冗余的按鍵處理硬編碼,讓你的按鍵業務邏輯更清晰。
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() ,后一個參數設置有效觸發電平
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間隔的定時器循環調用后臺處理函數
while(1) { ... if(g_TimerTicks >= 5) { g_TimerTicks = 0; button_ticks(); } }
特性
MultiButton 使用C語言實現,基于面向對象方式設計思路,每個按鍵對象單獨用一份數據結構管理:
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) 狀態機處理,所以每個按鍵的狀態彼此獨立。
按鍵事件
事件 | 說明 |
PRESS_DOWN | 按鍵按下,每次按下都觸發 |
PRESS_UP | 按鍵彈起,每次松開都觸發 |
PRESS_REPEAT | 重復按下觸發,變量repeat計數連擊次數 |
SINGLE_CLICK | 單擊按鍵事件 |
DOUBLE_CLICK | 雙擊按鍵事件 |
LONG_PRESS_START | 達到長按時間閾值時觸發一次 |
LONG_PRESS_HOLD | 長按期間一直觸發 |
基于LPC系列的移植參考
以下代碼截圖基于NXP官方的LPC804開發板。
實際使用的時候,coder還要去看下multi_button.h里的兩個宏定義,TICKS_INTERVAL默認是5即5mS,這個與它實例間隔5mS是對應的。DEBOUNCE_TICKS默認是3最大是8,用于按鍵消抖。長按和短按的時間靠LONG_TICKS和SHORT_TICKS設置或者說優化,這兩個宏定義也在multi_button.h中。
-
mcu
+關注
關注
146文章
17173瀏覽量
351629 -
嵌入式
+關注
關注
5086文章
19143瀏覽量
306044 -
開源
+關注
關注
3文章
3368瀏覽量
42566
原文標題:避免重復造輪子系列之按鍵組件-MultiButton
文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論