0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

strongerHuang 来源:芯片之家 作者:晓宇 2021-11-17 15:25 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

按键在我们生活中无处不在,买一块开发板,按键是必备的一个功能。 肯定有人会说:按键就一个检测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)  {  }}

责任编辑:haq
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模块
    +关注

    关注

    7

    文章

    2822

    浏览量

    52788
  • 驱动
    +关注

    关注

    12

    文章

    1927

    浏览量

    88184

原文标题:开源模块 | 事件驱动型按键驱动模块:MultiButton

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    NVIDIA宣布开源Aerial软件

    NVIDIA 开源其 Aerial 软件,并将 NVIDIA Sionna 研究套件和 Aerial 测试平台引入 NVIDIA DGX Spark 平台,为研究人员提供强大的工具和便捷的访问途径,以加速 AI 原生无线创新。
    的头像 发表于 11-03 15:14 560次阅读

    关于区分光模块拉环

    模块
    光模块厂家TTL电平
    发布于 :2025年09月26日 10:05:38

    普华基础软件亮相2025 CCF中国开源大会

    近日,由中国计算机学会(CCF)主办的2025 CCF中国开源大会在上海召开。本届大会以“蓄势引领、众行致远”为主题,重点聚焦开源操作系统、开源芯片、开源大模型、
    的头像 发表于 08-11 09:21 911次阅读

    开源项目!FourThirdsEye 开源 M4/3 相机模块

    FourThirdsEye 是一个开源相机板,专为树莓派5 (Raspberry Pi 5) 和树莓派计算模块4 (Raspberry Pi Compute Module 4) 设计,采用微型
    发表于 07-30 13:43

    普华基础软件荣膺优秀开源项目奖

    近日,2025上海开源创新菁英奖评选结果正式揭晓。普华基础软件开源安全车控操作系统小满EasyXMen凭借在开源技术创新与产业应用实践方面的突出表现,荣获“优秀
    的头像 发表于 07-28 16:48 713次阅读

    迅龙软件亮相2025开放原子开源生态大会,共绘AI+开源智能图景

    7月23日,2025开放原子开源生态大会在北京举行。大会由开放原子开源基金会主办,以“开源赋能产业,生态共筑未来”为主题,旨在展示中国开源生态“创新发展+开放协作”的成果,汇聚全球
    的头像 发表于 07-25 18:15 1020次阅读
    迅龙<b class='flag-5'>软件</b>亮相2025开放原子<b class='flag-5'>开源</b>生态大会,共绘AI+<b class='flag-5'>开源</b>智能图景

    请问EZ-Serial固件是否使用任何OSS(开源软件)库或软件

    EZ-Serial 固件是否使用任何 OSS(开源软件)库或软件
    发表于 07-02 08:14

    AS32X601驱动系列教程 GPIO_按键检测详解

    在嵌入式系统开发中,GPIO(通用输入输出端口)是实现硬件与软件交互的关键组件。本节主要利用的时GPIO的输入采集功能,本节的主要功能为,读取板载按键,当按键按下时,对应led亮起,抬起按键
    的头像 发表于 05-23 16:44 639次阅读
    AS32X601驱动系列教程 GPIO_<b class='flag-5'>按键</b>检测详解

    普华基础软件开源车用操作系统迎来全新版本

    近日,普华基础软件开源车用操作系统媒体发布会在上海中国汽车会客厅召开——全球首个开源智能驾驶操作系统微内核龘EasyAda、开源安全车控操作系统小满EasyXMen全新版本正式发布。现
    的头像 发表于 04-25 16:18 793次阅读

    【CW32模块使用】双轴按键摇杆模块

    双轴按键游戏摇杆模块,采用 PS2游戏手柄上金属按键摇杆电位器。模块特设二路模拟输出和一路数字输出接口、输出值分别对应(X、Y)双轴偏移量、其类型为模拟量、
    的头像 发表于 03-29 17:23 777次阅读
    【CW32<b class='flag-5'>模块</b>使用】双轴<b class='flag-5'>按键</b>摇杆<b class='flag-5'>模块</b>

    开源软件的价值解读 哈佛商学院和多伦多大学联合撰写

    “  周末分享一篇关于开源软件价值的论文,由哈佛商学院和多伦多大学联合撰写,量化地阐述了开源软件对经济及企业的影响。  ” 原文在这里,大家
    的头像 发表于 03-24 11:11 798次阅读

    第二届开放原子大赛汽车软件开源赛圆满落幕

    2月14日,由开放原子开源基金会、重庆市经济和信息化委员会共同主办的第二届开放原子大赛——汽车软件开源赛在重庆圆满落幕。颁奖典礼上,24支参赛队伍荣获奖项,展现了开源技术在汽车
    的头像 发表于 02-15 14:45 1187次阅读

    开源安全领航者!华为云 CodeArts Governance 构建更安全的软件开发生命周期

    华为云 CodeArts Governance开源治理服务是针对软件研发提供的一站式开源软件治理平台,从合法合规、网络安全、供应安全等维度消减开源
    的头像 发表于 02-12 16:50 3007次阅读
    <b class='flag-5'>开源</b>安全领航者!华为云 CodeArts Governance 构建更安全的<b class='flag-5'>软件</b>开发生命周期

    【RA-Eco-RA2L1-48PIN-V1.0开发板试用】——移植MultiButton按键

    MultiButton是一个国外的大神开发的按键库,支持所有的嵌入式按键软件开发,支持单击,双击,长按,短按等等所有复杂功能! 本次测评就来讲解一下
    发表于 01-23 17:41

    共建鸿蒙生态,开放原子开源基金会为迅龙软件授牌

    12月20至21日,以“一切为了开发者”为主题的“2024开放原子开发者大会暨首届开源技术学术大会”在武汉举办。本届大会由开放原子开源基金会、中国通信学会联合主办,旨在贯彻落实国家软件发展战略,加速
    的头像 发表于 01-08 17:36 995次阅读
    共建鸿蒙生态,开放原子<b class='flag-5'>开源</b>基金会为迅龙<b class='flag-5'>软件</b>授牌