按键在我们生活中无处不在,买一块开发板,按键是必备的一个功能。 肯定有人会说:按键就一个检测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文章
2822浏览量
52788 -
驱动
+关注
关注
12文章
1927浏览量
88184
原文标题:开源模块 | 事件驱动型按键驱动模块:MultiButton
文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
NVIDIA宣布开源Aerial软件
普华基础软件亮相2025 CCF中国开源大会
开源项目!FourThirdsEye 开源 M4/3 相机模块
普华基础软件荣膺优秀开源项目奖
迅龙软件亮相2025开放原子开源生态大会,共绘AI+开源智能图景
AS32X601驱动系列教程 GPIO_按键检测详解
普华基础软件开源车用操作系统迎来全新版本
开源软件的价值解读 哈佛商学院和多伦多大学联合撰写
第二届开放原子大赛汽车软件开源赛圆满落幕
开源安全领航者!华为云 CodeArts Governance 构建更安全的软件开发生命周期
【RA-Eco-RA2L1-48PIN-V1.0开发板试用】——移植MultiButton按键库
共建鸿蒙生态,开放原子开源基金会为迅龙软件授牌

关于按键的开源软件模块MultiButton
评论