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

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

3天内不再提示

一种按键的处理方法方式:MultiButton

Q4MP_gh_c472c21 来源:嵌入式技术开发 作者:嵌入式技术开发 2022-04-28 14:58 次阅读

今天来分享一种按键的处理方法方式:MultiButton。

1.Multi_Button简介

MultiButton 是Github上的一个开源的按键处理组件,作者0x1abin。

GIthub地址:https://github.com/0x1abin/MultiButton

d79ab164-c6a9-11ec-bce3-dac502259ad0.png

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

按键支持的事件包括:

d7b39f8a-c6a9-11ec-bce3-dac502259ad0.png

2.Multi_Button的使用

模块只有两个文件multi_button.c和multi_button.h,使用时,将.c文件添加到工程中。这里以STM32为例。

2.1.包含头文件#include“multi_button.h”

2.2.定义按键结构体和按键ID,这里定义了2个按键:

Button button1;Button button2;

#define btn1_id

1#define btn2_id 2

2.3.编写一个读取按键GPIO电平的函数:

uint8_t read_button_GPIO(uint8_t button_id){

// you can share the GPIO read function with multiple Buttons switch(button_id)

{

case btn1_id:

return HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin);

break;

case btn2_id:

return HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin);

break;

default:

return 0;

break;

}}

2.4.初始化按键对象:

button_init(&button1, read_button_GPIO, 0, btn1_id);button_init(&button2, read_button_GPIO, 0, btn2_id);

在button_init函数中:

第一个参数为2.2中定义的按键结构体指针。

第二个参数为绑定的2.3中编写的读取按键GPIO电平的函数。

第三个参数为按键的有效电平,0代表低电平有效,1代表高电平有效。

第四个参数为按键ID。

2.5.绑定按键回调函数:

button_attach(&button1, PRESS_DOWN,

BTN_PRESS_DOWN_Handler);button_attach(&button1, PRESS_UP,

BTN_PRESS_UP_Handler);button_attach(&button1, PRESS_REPEAT,

BTN_PRESS_REPEAT_Handler);button_attach(&button1,

SINGLE_CLICK,

BTN_SINGLE_Click_Handler);button_attach(&button1,

DOUBLE_CLICK,

BTN_DOUBLE_Click_Handler);button_attach(&button1,

LONG_PRESS_START,

BTN_LONG_PRESS_START_Handler);button_attach(&button1,

LONG_PRESS_HOLD,

BTN_LONG_PRESS_HOLD_Handler);

button_attach(&button2,

PRESS_DOWN,

BTN_PRESS_DOWN_Handler);button_attach(&button2,

PRESS_UP,

BTN_PRESS_UP_Handler);button_attach(&button2,

PRESS_REPEAT,

BTN_PRESS_REPEAT_Handler);button_attach(&button2,

SINGLE_CLICK,

BTN_SINGLE_Click_Handler);button_attach(&button2,

DOUBLE_CLICK,

BTN_DOUBLE_Click_Handler);button_attach(&button2,

LONG_PRESS_START,

BTN_LONG_PRESS_START_Handler);button_attach(&button2,

LONG_PRESS_HOLD,

BTN_LONG_PRESS_HOLD_Handler);

这里绑定了所有的按键功能,用户可根据实际需求进行删减。不同的按键回调函数可以相同,以按键按下的回调函数为例,函数如下:

void BTN_PRESS_DOWN_Handler(void* btn){

Button *temp_button = (Button *)btn;

switch(temp_button-》button_id)

{

case btn1_id:

printf(“btn1 press down

”);

break;

case btn2_id:

printf(“btn2 press down

”);

break;

default:

break;

}}

2.6.调用启动函数:

button_start(&button1);button_start(&button2);

2.7.最后,需要在一个定时任务中循环调用按键扫描函数:

void scan_key(){

if(key_tick 《 TICKS_INTERVAL)return;

key_tick = 0;

button_ticks();}

需要注意的是,按键的扫描周期、长按、短按、双击的时间定义可以在.h文件中修改:

//According to your need to modify the constants.#define TICKS_INTERVAL

10

//ms#define DEBOUNCE_TICKS

3

//MAX 8#define SHORT_TICKS

(300 /TICKS_INTERVAL)#define LONG_TICKS

(1000 /TICKS_INTERVAL)

最后来测试一下效果,按键的按下、弹起、单击、双击、长按等都能被检测到,用起来还是挺方便的。

d7c54028-c6a9-11ec-bce3-dac502259ad0.png

这个开源按键模块的源代码只有200行左右,有兴趣的朋友可以自己研究一下。

测试工程链接:

链接:https://pan.baidu.com/s/1e33eN0Sbc2Pz8VnNjShjfw

提取码:ijqz

审核编辑 :李倩

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

    关注

    1

    文章

    110

    浏览量

    20215
  • 组件
    +关注

    关注

    1

    文章

    512

    浏览量

    17815
  • GitHub
    +关注

    关注

    3

    文章

    469

    浏览量

    16428

原文标题:开源按键组件Multi_Button的使用,含测试工程

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    一种创新的动态轨迹预测方法

    本文提出了一种动态轨迹预测方法,通过结合历史帧和历史预测结果来提高预测的稳定性和准确性。它引入了历史预测注意力模块,以编码连续预测之间的动态关系,并通过三重因子注意力模块实现了最先进的性能。本方法能够生成准确且稳定的未来轨迹,这
    的头像 发表于 10-28 14:34 398次阅读
    <b class='flag-5'>一种</b>创新的动态轨迹预测<b class='flag-5'>方法</b>

    一种简单高效配置FPGA的方法

    本文描述了一种简单高效配置FPGA的方法,该方法利用微处理器从串行外围接口(SPI)闪存配置FPGA设备。这种方法减少了硬件组件、板空间和成
    的头像 发表于 10-24 14:57 558次阅读
    <b class='flag-5'>一种</b>简单高效配置FPGA的<b class='flag-5'>方法</b>

    基于FPGA实现按键消抖处理

    引言: 按键在电子产品中经常用到,由于按键的机械特性,按键在闭合或松开的瞬间伴随着连串的抖动,这样的抖动将直接影响设计系统的稳定性。因此,必须对抖动进行
    的头像 发表于 10-24 14:54 227次阅读
    基于FPGA实现<b class='flag-5'>按键</b>消抖<b class='flag-5'>处理</b>

    BitEnergy AI公司开发出一种新AI处理方法

    BitEnergy AI公司,家专注于人工智能(AI)推理技术的企业,其工程师团队创新性地开发了一种名为线性复杂度乘法(L-Mul)的AI处理方法。该
    的头像 发表于 10-22 15:15 388次阅读

    电容式触摸按键按键扩展方法

    电子发烧友网站提供《电容式触摸按键按键扩展方法.pdf》资料免费下载
    发表于 09-27 11:43 0次下载
    电容式触摸<b class='flag-5'>按键</b>的<b class='flag-5'>按键</b>扩展<b class='flag-5'>方法</b>

    常见的硬件消抖实现方式

    由于机械按键在操作过程中会产生抖动现象,这种抖动信号如果不加以处理,就可能导致单片机等电子设备误判按键状态,从而引发错误操作。本文将详细介绍两常见的硬件消抖实现
    的头像 发表于 09-25 16:54 1144次阅读
    两<b class='flag-5'>种</b>常见的硬件消抖实现<b class='flag-5'>方式</b>

    一种利用wireshark对远程服务器/路由器网络抓包方法

    一种利用wireshark对远程服务器/路由器网络抓包方法
    的头像 发表于 09-21 08:03 2736次阅读
    <b class='flag-5'>一种</b>利用wireshark对远程服务器/路由器网络抓包<b class='flag-5'>方法</b>

    EmbeddedButton,嵌入式按键处理框架

    EmbeddedButton,嵌入式按键处理框架 项目链接 ? 简介 EmbeddedButton是个轻量级简单易用的嵌入式按键处理框架
    发表于 08-08 00:15

    一种无透镜成像的新方法

    使用OAM-HHG EUV光束对高度周期性结构进行成像的EUV聚光显微镜 为了研究微电子或光子元件中的纳米级图案,一种基于无透镜成像的新方法可以实现近乎完美的高分辨率显微镜。 层析成像是一种强大的无
    的头像 发表于 07-19 06:20 374次阅读
    <b class='flag-5'>一种</b>无透镜成像的新<b class='flag-5'>方法</b>

    rup是一种什么模型

    RUP(Rational Unified Process,统建模语言)是一种软件开发过程模型,它是一种迭代和增量的软件开发方法。RUP是由Rational Software公司(现为
    的头像 发表于 07-09 10:13 1245次阅读

    按键式和蓝牙时控开关的设置方法

    按键式和蓝牙时控开关的设置方法  在现代家居设计中,安装款高质量的开关系统对于实现智能化控制是至关重要的步。在这篇文章中,我们将详细讨论按键
    的头像 发表于 02-05 11:32 1148次阅读

    触摸按键的工作原理是什么

    触摸按键技术是现代电子设备中常见的一种交互方式,它允许用户通过触摸屏幕上的虚拟按键来控制设备的功能。这种技术的发展和应用已经深入到我们生活的方方面面,从智能手机、平板电脑到家用电器等,
    的头像 发表于 02-04 14:27 6971次阅读

    一种简单易行的可编程振荡器构建方法

    本文介绍一种简单易行的可编程振荡器构建方法,其中振荡频率和幅度可以通过使用digiPOT来彼此独立地调节。
    发表于 01-15 10:05 236次阅读
    <b class='flag-5'>一种</b>简单易行的可编程振荡器构建<b class='flag-5'>方法</b>

    介绍一种使用2D材料进行3D集成的新方法

    美国宾夕法尼亚州立大学的研究人员展示了一种使用2D材料进行3D集成的新颖方法
    的头像 发表于 01-13 11:37 1061次阅读

    一种锂电池内水去除工艺方法

    一种锂电池内水去除工艺方法
    的头像 发表于 01-04 10:23 482次阅读
    <b class='flag-5'>一种</b>锂电池内水去除工艺<b class='flag-5'>方法</b>