按鍵在我們生活中無處不在,買一塊開發(fā)板,按鍵是必備的一個功能。 肯定有人會說:按鍵就一個檢測IO狀態(tài),有什么難度? 你單純的檢測一個按鍵,確實難度很低。但如果檢測單擊、雙擊、三擊,長按、短按等操作呢?如果再將其嵌入到復雜的項目中呢? 有些功能看似很簡單,實際項目中其實不簡單。就好比“LED亮燈”,如果能將“LED點燈”運用在各種不同的項目中,你就能超越很多人了。 今天就來分享一個關于按鍵的開源軟件模塊:MultiButton(事件驅動型按鍵驅動模塊)。
簡介
MultiButton 是一個小巧簡單易用的事件驅動型按鍵驅動模塊,可無限量擴展按鍵,按鍵事件的回調異步處理方式可以簡化你的程序結構,去除冗余的按鍵處理硬編碼,讓你的按鍵業(yè)務邏輯更清晰。
開源地址:
https://github.com/0x1abin/MultiButton
1.特性
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 (*hal_button_Level)(void);
BtnCallback cb[number_of_event];
struct Button* next;
};
這樣每個按鍵使用單向鏈表相連,依次進入 button_handler(struct Button* handle) 狀態(tài)機處理,所以每個按鍵的狀態(tài)彼此獨立。
2.按鍵事件
事件 | 說明 |
---|---|
PRESS_DOWN | 按鍵按下,每次按下都觸發(fā) |
PRESS_UP | 按鍵彈起,每次松開都觸發(fā) |
PRESS_REPEAT | 重復按下觸發(fā),變量repeat計數(shù)連擊次數(shù) |
SINGLE_CLICK | 單擊按鍵事件 |
DOUBLE_CLICK | 雙擊按鍵事件 |
LONG_PRESS_START | 達到長按時間閾值時觸發(fā)一次 |
LONG_PRESS_HOLD | 長按期間一直觸發(fā) |
使用方法
1.先申請一個按鍵結構
struct Button button1;
2.初始化按鍵對象,綁定按鍵的GPIO電平讀取接口read_button_pin() ,后一個參數(shù)設置有效觸發(fā)電平。
button_init(&button1, read_button_pin, 0);
3.注冊按鍵事件4.啟動按鍵button_attach(&button1, SINGLE_CLICK, Callback_SINGLE_CLICK_Handler);
button_attach(&button1, DOUBLE_CLICK, Callback_DOUBLE_Click_Handler);
...
button_start(&button1);
5.設置一個5ms間隔的定時器循環(huán)調用后臺處理函數(shù)while(1) {
...
if(timer_ticks == 5) {
timer_ticks = 0;
button_ticks();
}
}
實例
參考實例
struct Button btn1;
uint8_t read_button1_GPIO()
{
return HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin);
}
void BTN1_PRESS_DOWN_Handler(void* btn)
{
//do something...
}
void BTN1_PRESS_UP_Handler(void* btn)
{
//do something...
}
int main()
{
button_init(&btn1, read_button1_GPIO, 0);
button_attach(&btn1, PRESS_DOWN, BTN1_PRESS_DOWN_Handler);
button_attach(&btn1, PRESS_UP, BTN1_PRESS_UP_Handler);
button_attach(&btn1, PRESS_REPEAT, BTN1_PRESS_REPEAT_Handler);
button_attach(&btn1, SINGLE_CLICK, BTN1_SINGLE_Click_Handler);
button_attach(&btn1, DOUBLE_CLICK, BTN1_DOUBLE_Click_Handler);
button_attach(&btn1, LONG_PRESS_START, BTN1_LONG_PRESS_START_Handler);
button_attach(&btn2, LONG_PRESS_HOLD, BTN1_LONG_PRESS_HOLD_Handler);
button_start(&btn1);
//make the timer invoking the button_ticks() interval 5ms.
//This function is implemented by yourself.
__timer_start(button_ticks, 0, 5);
while(1)
{
}
}
-
模塊
+關注
關注
7文章
2722瀏覽量
47572 -
驅動
+關注
關注
12文章
1844瀏覽量
85367
原文標題:開源模塊 | 事件驅動型按鍵驅動模塊:MultiButton
文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論