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

    文章

    109

    浏览量

    20178
  • 组件
    +关注

    关注

    1

    文章

    504

    浏览量

    17799
  • GitHub
    +关注

    关注

    3

    文章

    466

    浏览量

    16381

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    基于FPGA实现按键消抖处理

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

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

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

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

    电子发烧友网站提供《电容式触摸按键按键扩展方法.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 797次阅读
    两<b class='flag-5'>种</b>常见的硬件消抖实现<b class='flag-5'>方式</b>

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

    一种利用wireshark对远程服务器/路由器网络抓包方法
    的头像 发表于 09-21 08:03 1949次阅读
    <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 314次阅读
    <b class='flag-5'>一种</b>无透镜成像的新<b class='flag-5'>方法</b>

    rup是一种什么模型

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

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

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

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

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

    单片机的GPIO如何实现触摸按键的功能呢?

    单片机的GPIO如何实现触摸按键的功能呢? 触摸按键一种使用触摸电容技术实现的按键,它通过利用人体的电容来实现按键的检测和触发。在单片机中
    的头像 发表于 12-07 11:43 3798次阅读

    一种产生激光脉冲新方法

    等离子体中脉冲压缩的概念 英国和韩国的科学家提出了一种产生激光脉冲的新方法,其功率是现有激光脉冲的1000多倍。 科学家们使用计算机模拟联合研究,展示了一种压缩光的新方法,以充分提高光
    的头像 发表于 12-07 06:32 466次阅读
    <b class='flag-5'>一种</b>产生激光脉冲新<b class='flag-5'>方法</b>

    请问AD9643BCPZ-250属于哪一种管脚定义方式

    从数据手册看,AD9643芯片有两管脚定义方式, 平行的LVDDS 和 多氧化(日/日/日/日)LVDS 。请问AD9643BCPZ-250属于哪一种管脚定义方式
    发表于 12-06 06:54

    一种大功率PCB散热管理的方法

    一种大功率PCB散热管理的方法
    的头像 发表于 12-05 14:28 562次阅读
    <b class='flag-5'>一种</b>大功率PCB散热管理的<b class='flag-5'>方法</b>