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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3044|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:68814 發(fā)表于 2019-9-14 19:51 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
帖子來自芯片之家公眾號

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


MultiButton 是一個小巧簡單易用的事件驅(qū)動型按鍵驅(qū)動模塊,可無限量擴(kuò)展按鍵,按鍵事件的回調(diào)異步處理方式可以簡化你的程序結(jié)構(gòu),去除冗余的按鍵處理硬編碼,讓你的按鍵業(yè)務(wù)邏輯更清晰。

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


特性
MultiButton 使用C語言實(shí)現(xiàn),基于面向?qū)ο蠓绞皆O(shè)計(jì)思路,每個按鍵對象單獨(dú)用一份數(shù)據(jù)結(jié)構(gòu)管理:
  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. };
復(fù)制代碼


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

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


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. }
復(fù)制代碼

全部資料51hei下載地址:
KeySand.zip (2.6 KB, 下載次數(shù): 45)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:451441 發(fā)表于 2019-9-15 08:46 | 只看該作者
好東西謝謝分享
回復(fù)

使用道具 舉報(bào)

板凳
ID:85865 發(fā)表于 2019-9-15 09:15 | 只看該作者
這個可以有,用EC11更方便
回復(fù)

使用道具 舉報(bào)

地板
ID:281879 發(fā)表于 2019-9-15 12:00 | 只看該作者
好想法 謝謝分享 學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

5#
ID:71505 發(fā)表于 2020-2-14 14:17 | 只看該作者
附件的的代碼與舉例對不上~~~~~~~~~~~~~
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精色 | 国内精品免费久久久久软件老师 | 五月婷婷在线视频 | 成人午夜在线 | 特级丰满少妇一级aaaa爱毛片 | 精品欧美乱码久久久久久 | 亚洲综合伊人 | 久久中文字幕一区 | 日日精品 | 综合精品久久久 | 久久久国产精品入口麻豆 | 日韩精品成人在线 | 国产精品一区在线观看 | 日韩在线视频一区二区三区 | 国产精品免费小视频 | 毛片国产| 国产精品99久久久久久大便 | 四虎最新地址 | 久久久69 | 久久天天综合 | 蜜桃一区| 精品一区二区三区在线观看 | 欧美电影网 | 久久久一区二区三区四区 | 精品久久久久久久久久久久久久 | 大香在线伊779 | 久久亚洲综合 | 欧美一区二区三区的 | 日操夜操 | 中文字幕成人av | 国产精品国产精品国产专区不片 | 国产在线精品一区二区三区 | 亚洲三区在线观看 | 色播久久 | 国产精品久久久久久久粉嫩 | 成人精品国产 | 亚洲第一成年免费网站 | 99re6在线视频精品免费 | 精品美女久久久久久免费 | 亚洲精品电影网在线观看 | 一区二区在线视频 |