按鍵在我們生活中無處不在,買一塊開發板,按鍵是必備的一個功能。 肯定有人會說:按鍵就一個檢測IO狀態,有什么難度? 你單純的檢測一個按鍵,確實難度很低。但如果檢測單擊、雙擊、三擊,長按、短按等操作呢?如果再將其嵌入到復雜的項目中呢? 有些功能看似很簡單,實際項目中其實不簡單。就好比“LED亮燈”,如果能將“LED點燈”運用在各種不同的項目中,你就能超越很多人了。 今天就來分享一個關于按鍵的開源軟件模塊:MultiButton(事件驅動型按鍵驅動模塊)。
簡介
MultiButton 是一個小巧簡單易用的事件驅動型按鍵驅動模塊,可無限量擴展按鍵,按鍵事件的回調異步處理方式可以簡化你的程序結構,去除冗余的按鍵處理硬編碼,讓你的按鍵業務邏輯更清晰。
開源地址:
https://github.com/0x1abin/MultiButton
1.特性
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 (*hal_button_Level)(void);
BtnCallback cb[number_of_event];
struct Button* next;
};
這樣每個按鍵使用單向鏈表相連,依次進入 button_handler(struct Button* handle) 狀態機處理,所以每個按鍵的狀態彼此獨立。
2.按鍵事件
事件 | 說明 |
---|---|
PRESS_DOWN | 按鍵按下,每次按下都觸發 |
PRESS_UP | 按鍵彈起,每次松開都觸發 |
PRESS_REPEAT | 重復按下觸發,變量repeat計數連擊次數 |
SINGLE_CLICK | 單擊按鍵事件 |
DOUBLE_CLICK | 雙擊按鍵事件 |
LONG_PRESS_START | 達到長按時間閾值時觸發一次 |
LONG_PRESS_HOLD | 長按期間一直觸發 |
使用方法
1.先申請一個按鍵結構
struct Button button1;
2.初始化按鍵對象,綁定按鍵的GPIO電平讀取接口read_button_pin() ,后一個參數設置有效觸發電平。
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間隔的定時器循環調用后臺處理函數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文章
2783瀏覽量
49501 -
驅動
+關注
關注
12文章
1898瀏覽量
86504
原文標題:開源模塊 | 事件驅動型按鍵驅動模塊:MultiButton
文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
AS32X601驅動系列教程 GPIO_按鍵檢測詳解

普華基礎軟件開源車用操作系統迎來全新版本
開源軟件的價值解讀 哈佛商學院和多倫多大學聯合撰寫
第二屆開放原子大賽汽車軟件開源賽圓滿落幕
開源安全領航者!華為云 CodeArts Governance 構建更安全的軟件開發生命周期

【RA-Eco-RA2L1-48PIN-V1.0開發板試用】——移植MultiButton按鍵庫
共建鴻蒙生態,開放原子開源基金會為迅龍軟件授牌

開源能帶我們走向何方
基于狀態機和面向對象的思想設計按鍵檢測模塊

簡儀科技與您相約第九屆開源測控開發者大會
迅龍軟件出席2024開放原子開源生態大會,共謀開源生態繁榮之路

NVIDIA全面轉向開源GPU內核模塊

英偉達將全面轉向開源GPU內核模塊
開啟開源布道新篇章 — LF開源軟件學園誠邀開源精英加入成為OSPO講師

評論