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

    文章

    113

    浏览量

    21086
  • 组件
    +关注

    关注

    1

    文章

    551

    浏览量

    18927
  • GitHub
    +关注

    关注

    3

    文章

    484

    浏览量

    18424

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    按键消抖的方法

    程序就会收到影响,如果想做动态的界面,这种情况就会使得界面不那么丝滑。 数电中提到一种方法,运用基本SR锁存器消除机械开关触点抖动引起的脉冲输出,如下图 Q为输出 事实上,软件上也可以使用这种“锁存
    发表于 11-27 06:12

    start openocd timeout 的一种解决方式

    在使用Nuclei Studio进行开发时,下载程序时提示“start openocd timeout”,但是之前下载时从没有出现过这种情况。 各种方法尝试了后(包括重建工程,重启软件等),都无济于事,最后在电脑上把调试器更换了个USB口,程序就能正确进行下载了。。
    发表于 10-27 06:34

    指令集测试的一种纠错方法

    本文描述在进行指令集测试的一种纠错方法 1.打开测试指令集对应的dump文件 dump文件是指由汇编文件进行反汇编之后,可以供人阅读指令的反汇编文件。其包含了每条指令的具体操作的信息。指令集测试
    发表于 10-24 14:04

    键盘薄膜高弹UV胶则是一种特殊改性的UV固化胶,用于薄膜键盘按键弹性体的部分或高弹性密封

    薄膜键盘是一种常见的键盘类型,它使用薄膜作为按键的触发器。而键盘薄膜高弹UV胶则是一种特殊改性的UV固化胶,用于薄膜键盘按键弹性体的部分或高弹性密封。薄膜键盘的优点如下:1.薄膜键盘相
    的头像 发表于 08-26 10:03 699次阅读
    键盘薄膜高弹UV胶则是<b class='flag-5'>一种</b>特殊改性的UV固化胶,用于薄膜键盘<b class='flag-5'>按键</b>弹性体的部分或高弹性密封

    一种新的无刷直流电机反电动势检测方法

    无位置传感器无刷直流电机的控制算法是近年来研究的热点之,有霍尔位置信号直流电机根据霍尔状态来确定通断功率器件。利用无刷直流电机的数学模型,根据反电动势检测原理,提出了一种新的线反电动势检测方法
    发表于 08-07 14:29

    BitsButton嵌入式按键处理框架

    BitsButton 、简介? ​​BitsButton是款针对嵌入式系统优化的按键检测框架​​。通过创新的二进制位序列技术,它能高效处理单键、组合键(如Ctrl+C)和复杂
    发表于 08-02 11:24

    一种无序超均匀固体器件的网格优化方法

    近日,天津大学精密仪器与光电子工程学院的光子芯片实验室研发了一种无序超均匀固体器件的网格优化方法,成果获中国发明专利(ZL202410659505.2)授权。
    的头像 发表于 07-28 16:10 738次阅读
    <b class='flag-5'>一种</b>无序超均匀固体器件的网格优化<b class='flag-5'>方法</b>

    汉思新材料取得一种PCB板封装胶及其制备方法的专利

    汉思新材料取得一种PCB板封装胶及其制备方法的专利汉思新材料(深圳市汉思新材料科技有限公司)于2023年取得了项关于PCB板封装胶及其制备方法的发明专利(专利号:CN20231015
    的头像 发表于 06-27 14:30 452次阅读
    汉思新材料取得<b class='flag-5'>一种</b>PCB板封装胶及其制备<b class='flag-5'>方法</b>的专利

    基于RV1126开发板的按键测试方法与例程

    RV1126开发板的按键测试方法与例程详细描述
    的头像 发表于 04-15 17:03 831次阅读
    基于RV1126开发板的<b class='flag-5'>按键</b>测试<b class='flag-5'>方法</b>与例程

    一种永磁电机用转子组件制作方法

    一种永磁电机所使用的转子组件,是由磁钢与芯轴组装而成,产品工作转速80 000 r /mi n,磁钢相对于芯轴的同轴度要小于O.015 mm。现有的装配方法是:先在芯轴两端面制作中心孔,然后直接
    发表于 03-25 15:20

    一种无刷直流电机霍耳信号与定子绕组关系自学习方法

    的关系。提出了一种无刷直流电机霍耳信号与定子绕组关系自学习方法,该方法通过不同的绕组通电组合将电机转子依次转到6个不同的位置并记录对应的霍耳信号,然后得出霍耳信号与定子绕组的对应关系。所提出的
    发表于 03-25 15:15

    请问DLP3010 Light Control EVM有没有一种便捷的方式投影图片?

    你好,请问DLP3010 Light Control EVM有没有一种便捷的方式投影图片,如同在DLP® Display and Light Control EVM GUI Tool 软件中的方式,选择
    发表于 02-25 06:24

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

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

    串口通讯异常处理方法 串口设备连接方式

    串口通信异常处理方法 1. 异常检测 在串口通信中,首先需要能够检测到异常情况。异常检测可以通过以下几种方式实现: 硬件检测 :利用串口硬件的中断和状态寄存器来检测异常,如接收到错误帧、奇偶校验错误
    的头像 发表于 12-27 09:53 5495次阅读

    一种降低VIO/VSLAM系统漂移的新方法

    本文提出了一种方法,通过使用点到平面匹配将VIO/VSLAM系统生成的稀疏3D点云与数字孪生体进行对齐,从而实现精确且全球致的定位,无需视觉数据关联。所提方法为VIO/VSLAM系
    的头像 发表于 12-13 11:18 1183次阅读
    <b class='flag-5'>一种</b>降低VIO/VSLAM系统漂移的新<b class='flag-5'>方法</b>