按键在我们生活中无处不在,买一块开发板,按键是必备的一个功能。 肯定有人会说:按键就一个检测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.hstruct 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) { }}
你知道使用直方图技术测量A / D转换器噪声么?
ios10.3安装时间太长,我们帮你解决
中国彩电市场遇冷 电视巨头突围海外
2017性价比最高的手机挑选攻略,如何才能购买质优价廉Android手机
无人驾驶需要5G,高通C-V2X让无人驾驶梦想成真
关于按键的开源软件模块MultiButton
TI杯2022年省级大学生电子设计竞赛7月联赛参考赛题已发布
电子产品中气压传感器的主要作用
RISE-6G使可编程控制和整形无线传播环境成为可能
拼多多百亿补贴上架华为Mate40 Pro
DIO3、单晶圆超晶圆及其混合半导体清洗方法
赛普拉斯推出全新ExcelonF-RAM的非易失性存储器
中国万亿级智慧城市市场令人垂涎
Xilinx Zynq UltraScale+ MPSoC多核异构架构设计详解
高光谱成像光谱仪的目的是什么
触摸传感器QST108与PIC单片机的接口设计
LED具有整流功能吗
智能魔镜显示屏,一面会说话的不可思议的镜子
开关电源影响输出电压的18个指标形式
锂金属电解质的高压与高温稳定性探究