久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3075|回復: 4
收起左側

完全由C語言編寫,高度可移植,超級牛逼的按鍵驅動機制!

[復制鏈接]
ID:68814 發表于 2019-9-14 19:51 | 顯示全部樓層 |閱讀模式
帖子來自芯片之家公眾號

作為一個搞電子嵌入式的你來說,按鍵驅動相信絕對不陌生,比如讓你實現一些按鍵按下,按鍵松開,單擊、雙擊、長按等不同的機制,你是否有一個很好的程序框架?前幾天芯片之家1群里有個朋友(備注名:北京-單片機-順順)在群里分享了GitHub上一個很不錯的按鍵驅動機制(作者:liu2guang),看了確實不錯,移植很方便,并且附帶RT-Thread的例子,這里分享給大家!


MultiButton 是一個小巧簡單易用的事件驅動型按鍵驅動模塊,可無限量擴展按鍵,按鍵事件的回調異步處理方式可以簡化你的程序結構,去除冗余的按鍵處理硬編碼,讓你的按鍵業務邏輯更清晰。

使用方法
1.先申請一個按鍵結構
struct Button button1;
2.初始化按鍵對象,綁定按鍵的GPIO電平讀取接口read_button_pin() ,后一個參數設置有效觸發電平
button_init(&button1, read_button_pin, 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間隔的定時器循環調用后臺處理函數
  1. while(1) {
  2.   ...
  3.   if(timer_ticks == 5) {
  4.       timer_ticks = 0;
  5.       
  6.       button_ticks();
  7.   }
  8. }
復制代碼


特性
MultiButton 使用C語言實現,基于面向對象方式設計思路,每個按鍵對象單獨用一份數據結構管理:
  1. struct Button {
  2. uint16_t ticks;
  3. uint8_t  repeat: 4;
  4. uint8_t  event : 4;
  5. uint8_t  state : 3;
  6. uint8_t  debounce_cnt : 3;
  7. uint8_t  active_level : 1;
  8. uint8_t  button_level : 1;
  9. uint8_t  (*hal_button_Level)(void);
  10. BtnCallback  cb[number_of_event];
  11. struct Button* next;
  12. };
復制代碼


這樣每個按鍵使用單向鏈表相連,依次進入 button_handler(struct Button* handle) 狀態機處理,所以每個按鍵的狀態彼此獨立。

按鍵事件
事件                                         說明
PRESS_DOWN                     按鍵按下,每次按下都觸發
PRESS_UP                          按鍵彈起,每次松開都觸發
PRESS_REPEAT                  重復按下觸發,變量repeat計數連擊次數
SINGLE_CLICK                   單擊按鍵事件
DOUBLE_CLICK                 雙擊按鍵事件
LONG_RRESS_START        達到長按時間閾值時觸發一次   
LONG_PRESS_HOLD         長按期間一直觸發


Examples
  1. #include "button.h"

  2. struct Button btn1;

  3. int read_button1_GPIO()
  4. {
  5. return HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin);
  6. }

  7. int main()
  8. {
  9. button_init(&btn1, read_button1_GPIO, 0);
  10. button_attach(&btn1, PRESS_DOWN,       BTN1_PRESS_DOWN_Handler);
  11. button_attach(&btn1, PRESS_UP,         BTN1_PRESS_UP_Handler);
  12. button_attach(&btn1, PRESS_REPEAT,     BTN1_PRESS_REPEAT_Handler);
  13. button_attach(&btn1, SINGLE_CLICK,     BTN1_SINGLE_Click_Handler);
  14. button_attach(&btn1, DOUBLE_CLICK,     BTN1_DOUBLE_Click_Handler);
  15. button_attach(&btn1, LONG_RRESS_START, BTN1_LONG_RRESS_START_Handler);
  16. button_attach(&btn2, LONG_PRESS_HOLD,  BTN1_LONG_PRESS_HOLD_Handler);
  17. button_start(&btn1);

  18. //make the timer invoking the button_ticks() interval 5ms.
  19. //This function is implemented by yourself.
  20. __timer_start(button_ticks, 0, 5);

  21. while(1)
  22. {}
  23. }

  24. void BTN1_PRESS_DOWN_Handler(void* btn)
  25. {
  26. //do something...
  27. }

  28. void BTN1_PRESS_UP_Handler(void* btn)
  29. {
  30. //do something...
  31. }
復制代碼

全部資料51hei下載地址:
KeySand.zip (2.6 KB, 下載次數: 45)
回復

使用道具 舉報

ID:451441 發表于 2019-9-15 08:46 | 顯示全部樓層
好東西謝謝分享
回復

使用道具 舉報

ID:85865 發表于 2019-9-15 09:15 | 顯示全部樓層
這個可以有,用EC11更方便
回復

使用道具 舉報

ID:281879 發表于 2019-9-15 12:00 | 顯示全部樓層
好想法 謝謝分享 學習了
回復

使用道具 舉報

ID:71505 發表于 2020-2-14 14:17 | 顯示全部樓層
附件的的代碼與舉例對不上~~~~~~~~~~~~~
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91新视频| 91麻豆精品国产91久久久更新资源速度超快 | 九九av| 天堂网中文 | 一区二区三区免费 | 91精品国产欧美一区二区 | 精品国产一区二区三区久久久蜜月 | 一级网站 | 91欧美激情一区二区三区成人 | 久久久久亚洲精品 | 日韩欧美在线播放 | 色小姐综合网 | 天堂久久一区 | 97超碰免费 | 黄色免费看 | 亚洲精品一区二区另类图片 | 中文字幕在线观看精品 | 99在线观看视频 | 午夜激情视频 | 人人干在线视频 | 91精品久久久久久久99 | 嫩草国产 | 激情欧美一区二区三区 | 久久大陆 | 99爱在线免费观看 | 精品二区| 欧美一区二区久久 | 在线播放国产一区二区三区 | 午夜日韩精品 | 国产丝袜一区二区三区免费视频 | 亚洲精品1 | 亚洲精品视频在线 | 久久久成人免费一区二区 | 91久久久久 | 色www精品视频在线观看 | 天天搞夜夜操 | 亚洲天堂一区 | 天啪| 中日韩欧美一级片 | 欧美一级在线观看 | 国产亚洲欧美另类一区二区三区 |