按鍵在我們生活中無處不在,買一塊開發板,按鍵是必備的一個功能。 肯定有人會說:按鍵就一個檢測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文章
2837瀏覽量
53294 -
驅動
+關注
關注
12文章
1956瀏覽量
88547
原文標題:開源模塊 | 事件驅動型按鍵驅動模塊:MultiButton
文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
熱點推薦
進迭時空 debug upstream | 取之于開源,貢獻于開源
秉承“取之于開源,貢獻于開源”的理念,進迭時空在Debug軟件的開發與維護中,始終堅持UpstreamFirst原則,積極將優化與修復反饋至開源上游,與全球開發者共同推動RISC-V生
NVIDIA宣布開源Aerial軟件
NVIDIA 開源其 Aerial 軟件,并將 NVIDIA Sionna 研究套件和 Aerial 測試平臺引入 NVIDIA DGX Spark 平臺,為研究人員提供強大的工具和便捷的訪問途徑,以加速 AI 原生無線創新。
普華基礎軟件亮相2025 CCF中國開源大會
近日,由中國計算機學會(CCF)主辦的2025 CCF中國開源大會在上海召開。本屆大會以“蓄勢引領、眾行致遠”為主題,重點聚焦開源操作系統、開源芯片、開源大模型、
BitsButton嵌入式按鍵處理框架
;
} bits_btn_ring_buffer_t;
SPSC(單生產者單消費者)線程安全模型;
無鎖設計+原子操作;
緩沖區溢出檢測與統計;
輕量化處理(RAM <20字節/按鍵);
?4.??模塊化架構
模塊
發表于 08-02 11:24
潤和軟件亮相2025開放原子開源生態大會
7月23-24日,2025開放原子開源生態大會在北京國家會議中心盛大舉辦。作為由開放原子開源基金會主辦的年度開源盛會,本屆大會以“開源賦能產業,生態共筑未來”為主題,匯聚政府領導、專家
普華基礎軟件亮相2025開放原子開源生態大會
此前,7月23日-24日,以“開源賦能產業,生態共筑未來”為主題的2025開放原子開源生態大會在北京舉辦。工業和信息化部副部長熊繼軍、北京市人民政府副秘書長許心超出席大會并致辭。普華基礎軟件作為開放
開源項目!FourThirdsEye 開源 M4/3 相機模塊
FourThirdsEye 是一個開源相機板,專為樹莓派5 (Raspberry Pi 5) 和樹莓派計算模塊4 (Raspberry Pi Compute Module 4) 設計,采用微型
發表于 07-30 13:43
普華基礎軟件榮膺優秀開源項目獎
近日,2025上海開源創新菁英獎評選結果正式揭曉。普華基礎軟件開源安全車控操作系統小滿EasyXMen憑借在開源技術創新與產業應用實踐方面的突出表現,榮獲“優秀
迅龍軟件亮相2025開放原子開源生態大會,共繪AI+開源智能圖景
7月23日,2025開放原子開源生態大會在北京舉行。大會由開放原子開源基金會主辦,以“開源賦能產業,生態共筑未來”為主題,旨在展示中國開源生態“創新發展+開放協作”的成果,匯聚全球
AS32X601驅動系列教程 GPIO_按鍵檢測詳解
在嵌入式系統開發中,GPIO(通用輸入輸出端口)是實現硬件與軟件交互的關鍵組件。本節主要利用的時GPIO的輸入采集功能,本節的主要功能為,讀取板載按鍵,當按鍵按下時,對應led亮起,抬起按鍵
普華基礎軟件開源車用操作系統迎來全新版本
近日,普華基礎軟件開源車用操作系統媒體發布會在上海中國汽車會客廳召開——全球首個開源智能駕駛操作系統微內核龘EasyAda、開源安全車控操作系統小滿EasyXMen全新版本正式發布。現
開源軟件的價值解讀 哈佛商學院和多倫多大學聯合撰寫
“ ?周末分享一篇關于開源軟件價值的論文,由哈佛商學院和多倫多大學聯合撰寫,量化地闡述了開源軟件對經濟及企業的影響。? ” 原文在這里,大家
關于按鍵的開源軟件模塊MultiButton
評論