查看: 3378|回复: 5

避免重复造轮子系列之按键组件-MultiButton

[复制链接]
  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3875

    主题

    7479

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    39287
    最后登录
    2025-7-22
    发表于 2022-8-12 09:29:49 | 显示全部楼层 |阅读模式
    避免重复造轮子系列之按键组件-MultiButton

    大家都知道“Stop Trying to Reinvent the Wheel”不要重复造轮子,但作为嵌入式程序猿每个项目都难免重复造些轮子。这个系(天)列(坑)会挨个介绍一些我日常用到开源组件,前人栽树后人乘凉,缩减项目的开发周期好去摸(填)鱼(坑)。

    第一个组件,我重点推荐MultiButton!

    按键!几乎每个MCU级别的嵌入式项目都要用到,这是个天天要用的轮子,所以MultiButton这个组件就是我墙裂推荐的。感谢作者0x1abin

    MultiButton 是一个小巧简单(一个multi_button.c 一个multi_button.h)易用的事件驱动型按键驱动模块,可无限量扩展按键,按键事件的回调异步处理方式可以简化你的程序结构,去除冗余的按键处理硬编码,让你的按键业务逻辑更清晰。
    License也非常的友好:MIT license
    11.png
    可以去这里下载到
    0x1abin/MultiButton: Button driver for embedded system (github.com)
    https://gitee.com/mirrors_0x1abin/MultiButton

    使用方法
    1.  先申请一个按键结构
    1. struct Button button1
    复制代码
    2.    初始化按键对象,绑定按键的GPIO电平读取接口read_button_pin() ,后一个参数设置有效触发电平
    1. button_init(&button1, read_button_pin, 0, 0);
    复制代码
    3.    注册按键事件
    1. button_attach(&button1, SINGLE_CLICK, Callback_SINGLE_CLICK_Handler);
    2. button_attach(&button1, DOUBLE_CLICK, Callback_DOUBLE_Click_Handler);
    3. ....
    复制代码
    4.    启动按键
    1. button_start(&button1);
    复制代码
    5.    设置一个5ms间隔的定时器循环调用后台处理函数
    1. while(1) {
    2.     ...
    3.     if(g_TimerTicks >= 5) {
    4.         g_TimerTicks = 0;
    5.         button_ticks();
    6.     }
    7. }
    复制代码
    特性
    MultiButton 使用C语言实现,基于面向对象方式设计思路,每个按键对象单独用一份数据结构管理:
    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  button_id;
    10.      uint8_t  (*hal_button_Level)(uint8_t  button_id_);
    11.      BtnCallback  cb[number_of_event];
    12.      struct Button* next;
    13. };
    复制代码
    这样每个按键使用单向链表相连,依次进入 button_handler(struct Button* handle) 状态机处理,所以每个按键的状态彼此独立。

    按键事件
    12.png
    基于LPC系列的移植参考

    以下代码截图基于NXP官方的LPC804开发板。

    实际使用的时候,coder还要去看下multi_button.h里的两个宏定义,TICKS_INTERVAL默认是5即5mS,这个与它实例间隔5mS是对应的。DEBOUNCE_TICKS默认是3最大是8,用于按键消抖。长按和短按的时间靠LONG_TICKS和SHORT_TICKS设置或者说优化,这两个宏定义也在multi_button.h中。
    14.jpg

    qiandao qiandao
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    10 小时前
  • 签到天数: 2373 天

    连续签到: 82 天

    [LV.Master]伴坛终老

    84

    主题

    1万

    帖子

    3

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    21985
    最后登录
    2025-7-22
    发表于 2022-8-12 13:49:09 | 显示全部楼层
    我就喜欢造轮子
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-6-10 23:03
  • 签到天数: 1502 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    97

    主题

    4688

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    10080
    最后登录
    2025-7-2
    发表于 2022-8-14 20:11:02 | 显示全部楼层
    话说为什么要使用单向链表。
    直接使用数组固定内存,毕竟按键数依硬件设计已经确定了呀
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    10 小时前
  • 签到天数: 2373 天

    连续签到: 82 天

    [LV.Master]伴坛终老

    84

    主题

    1万

    帖子

    3

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    21985
    最后登录
    2025-7-22
    发表于 2022-8-15 11:55:25 | 显示全部楼层
    jobszheng5 发表于 2022-8-14 20:11
    话说为什么要使用单向链表。
    直接使用数组固定内存,毕竟按键数依硬件设计已经确定了呀 ...

    有可能动态添加不
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-6-10 23:03
  • 签到天数: 1502 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    97

    主题

    4688

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    10080
    最后登录
    2025-7-2
    发表于 2022-8-15 14:08:54 | 显示全部楼层
    流水源 发表于 2022-8-15 11:55
    有可能动态添加不

    也只能这样解释了
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    帖子

    0

    新手上路

    Rank: 1

    积分
    38
    最后登录
    2023-3-22
    发表于 2022-8-17 22:33:37 | 显示全部楼层
    轮子可以参考
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-22 20:57 , Processed in 0.163725 second(s), 27 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表