良许Linux教程网 干货合集 开源模块 | 事件驱动型按键驱动模块:MultiButton

开源模块 | 事件驱动型按键驱动模块:MultiButton

按钮在我们的生活中无处不在。如果我们购买一个开发板,按钮就是一个必备的功能。

有人可能会说:“按钮只是用来检测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.注册按键事件

button_attach(&button1, SINGLE_CLICK, Callback_SINGLE_CLICK_Handler);
button_attach(&button1, DOUBLE_CLICK, Callback_DOUBLE_Click_Handler);
...

4.启动按键

button_start(&button1);

5.设置一个5ms间隔的定时器循环调用后台处理函数

while(1) {
    ...
    if(timer_ticks == 5) {
        timer_ticks = 0;

        button_ticks();
    }
}

实例

参考实例

#include "button.h"

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)
  {
  }
}

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部