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