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

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

3天内不再提示

日常用到开源组件—MultiButton

恩智浦MCU加油站 来源:恩智浦MCU加油站 作者:恩智浦MCU加油站 2022-08-11 09:04 次阅读

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

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

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

MultiButton 是一个小巧简单(一个multi_button.c 一个multi_button.h)易用的事件驱动型按键驱动模块,可无限量扩展按键,按键事件的回调异步处理方式可以简化你的程序结构,去除冗余的按键处理硬编码,让你的按键业务逻辑更清晰。

License也非常的友好:MIT license

bec1be16-190c-11ed-ba43-dac502259ad0.png

可以去这里下载

0x1abin/MultiButton: Button driver for embedded system (github.com)

https://gitee.com/mirrors_0x1abin/MultiButton

使用方法

1. 先申请一个按键结构

struct Button button1
2.初始化按键对象,绑定按键的GPIO电平读取接口read_button_pin() ,后一个参数设置有效触发电平
button_init(&button1, read_button_pin, 0, 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(g_TimerTicks >= 5) {
        g_TimerTicks = 0;
        button_ticks();
    }
}

特性

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  button_id;
     uint8_t  (*hal_button_Level)(uint8_t  button_id_);
     BtnCallback  cb[number_of_event];
     struct Button* next;
};

这样每个按键使用单向链表相连,依次进入 button_handler(struct Button* handle) 状态机处理,所以每个按键的状态彼此独立。

按键事件

事件 说明
PRESS_DOWN 按键按下,每次按下都触发
PRESS_UP 按键弹起,每次松开都触发
PRESS_REPEAT 重复按下触发,变量repeat计数连击次数
SINGLE_CLICK 单击按键事件
DOUBLE_CLICK 双击按键事件
LONG_PRESS_START 达到长按时间阈值时触发一次
LONG_PRESS_HOLD 长按期间一直触发

基于LPC系列的移植参考

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

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

beda8586-190c-11ed-ba43-dac502259ad0.png

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

    关注

    146

    文章

    16876

    浏览量

    349872
  • 嵌入式
    +关注

    关注

    5058

    文章

    18972

    浏览量

    301909
  • 开源
    +关注

    关注

    3

    文章

    3214

    浏览量

    42303

原文标题:避免重复造轮子系列之按键组件-MultiButton

文章出处:【微信号:NXP_SMART_HARDWARE,微信公众号:恩智浦MCU加油站】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    EMFILE是否包含开源组件

    的问题是“可能”。有人知道这到底是什么意思吗?EMFILE是否包含开源组件?如果是,哪些组件是什么是他们的执照吗?这对我的所有权代码有什么影响?有没有人这么做过?谢谢你的帮助,古斯塔沃
    发表于 08-08 10:47

    经常使用到开源免费软件分享

    工欲善其事,必先利其器。首先介绍下项目开发中个人经常使用到开源免费软件:1、虚拟机虚拟机使用VMware player,个人发现使用Virtualbox ubuntu虚拟机会经常崩溃,选用免费
    发表于 11-04 06:38

    HarmonyOS组件更新,新增700+开源组件

    组件是对数据和方法的简单封装,通过使用现成的组件让应用开发更加简单高效。自HarmonyOS组件开源以来,经两次上线,已开源了700+的Ja
    发表于 11-18 11:17

    嵌入式常用开源库是什么

    阅读目录 linux/嵌入式常用开源库列表其他资料参考资料linux下/嵌入式常用开源库名字及简介,使用文档和教程可以自己百度 (自己整理,不定时完善) linux/嵌入式
    发表于 12-24 06:53

    介绍一个事件驱动型按键驱动模块MultiButton

    MultiButton MultiButton,一个小巧简单易用的事件驱动型按键驱动模块,作者 0x1abin,目前收获 222 个star,遵循 MIT 开源许可。这个项目非常精简,只有两个文件
    发表于 01-10 07:28

    MultiButton使用步骤和代码的问题

    单片机系统一个非常实用的按键处理框架MultiButton前言一、MultiButton 是什么?2. 使用步骤和代码的问题2.1 使用步骤2.2 按键库的问题2.3 按键库一些默认参数的配置3.
    发表于 01-21 06:03

    什么是Ardunio?常用组件有哪些?

    什么是Ardunio?常用组件有哪些?
    发表于 01-24 06:44

    日常我们用到的JTAG和SWD两种模式的接口是怎样的

    我们常用到的有哪几种模式的接口?日常我们用到的JTAG和SWD两种模式的接口是怎样的?
    发表于 02-23 07:14

    超精简的按键组件MultiButton概括

    Growing up’s a funny thing. Sneaks up on you.长大是件很有趣的事,不经意间就发生了。一、概括项目的仓库大佬的超精简的软件定时器multi_timer已经让人眼前一亮,如今这个按键组件MultiButton更令我折服。把按键的各种
    发表于 02-28 11:19

    【中科昊芯Start_DSC28027勇士开发板试用体验】开源MultiButton移植

    一、开源MultiButton介绍MultiButton 是一个小巧简单易用的事件驱动型按键驱动模块,可无限量扩展按键,按键事件的回调异步处理方式可以简化你的程序结构,去除冗余的按键处理硬编码,让
    发表于 07-01 23:04

    日常生活中常用到的接口介绍

    日常使用手机、电脑以及其他电子产品,免不了要跟各种接口打交道。周末花了些时间查了些资料,并总结自己的实际使用经验,跟大家聊一聊我们日常使用手机、iPad、电脑、外设中常用到的接口。
    发表于 10-22 16:27 4172次阅读

    HarmonyOS新增开源组件概览

    组件是对数据和方法的简单封装,通过使用现成的组件让应用开发更加简单高效。自HarmonyOS组件开源以来,经两次上线,已开源了700+的Ja
    的头像 发表于 11-22 10:46 2351次阅读
    HarmonyOS新增<b class='flag-5'>开源</b><b class='flag-5'>组件</b>概览

    常用日常电路图汇总

    常用日常电路图汇总
    发表于 12-06 13:57 134次下载

    2022 OpenHarmony组件大赛,共建开源组件

    原标题:共建开源组件生态 2022 OpenHarmony组件大赛等你来 2022年4月15日,2022 OpenHarmony组件大赛(下称“大赛”)报名通道正式开启,开发者登录
    的头像 发表于 04-26 17:31 1516次阅读
    2022 OpenHarmony<b class='flag-5'>组件</b>大赛,共建<b class='flag-5'>开源</b><b class='flag-5'>组件</b>

    【中科昊芯Start_DSC28027勇士开发板试用体验】开源MultiButton移植

    本文来源电子发烧友社区,作者:xiaopeng, 帖子地址: https://bbs.elecfans.com/jishu_2290815_1_1.html 一、开源MultiButton介绍
    的头像 发表于 11-21 11:06 513次阅读
    【中科昊芯Start_DSC28027勇士开发板试用体验】<b class='flag-5'>开源</b>库<b class='flag-5'>MultiButton</b>移植