STM32CubeMX | MultiButton:一个小巧简单易用的事件驱动型按键驱动模块实现按键单机、双击、多击、长按

STM32CubeMX | MultiButton:一个小巧简单易用的事件驱动型按键驱动模块实现按键单机、双击、多击、长按


目录

  • STM32CubeMX | MultiButton:一个小巧简单易用的事件驱动型按键驱动模块实现按键单机、双击、多击、长按
      • 简介
      • STM32基础工程生成
      • 移植使用
      • 效果测试


开发测试环境:

  • WIN10
  • STM32F103RB
  • STM32CubeMX

本章博客涉及代码,关注以下公众号,回复关键字stm32key获取下载链接!


简介

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

这是作者写的简介,目前作者已经收获五百多个star,该源码非常小巧且很易于理解,可以实现按键单机、双击、长按、长按保持、按键按下时的事件、按键弹起时的事件等,使用起来非常方便,附上源码下载链接:

源码下载:https://gitcode.net/mirrors/0x1abin/MultiButton


STM32基础工程生成

本博客基于STM32使用STM32CubeMX生成基础代码。

时钟配置:

按键配置(我的按键是按下为低电平):

调试打印串口配置:

最后生成代码即可:


移植使用

MultiButton移植起来也是非常的简单,就只有一个头文件和源文件,将这两个文件加入我们的工程即可:

需要首先定义一个按键句柄:

struct Button button1;

定义获取按键状态的函数:

uint8_t read_button_pin(void)
{return HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_SET ? 1 : 0;
}

接下来就是实现按键事件的回调函数:

/// 读取按键状态
uint8_t read_button_pin(void)
{return HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_SET ? 1 : 0;
}/// 单击事件
void button_single_click_callback(void* arg)
{printf("%s\r\n", __FUNCTION__);
}/// 双击事件
void button_double_click_callback(void* arg)
{printf("%s\r\n", __FUNCTION__);
}/// 连击,如连续按3下
void button_press_repeat_callback(void* arg)
{struct Button* bt =  (struct Button *)arg;printf("%s:%d\r\n", __FUNCTION__, bt->repeat);  // repeat是变量用来记录按下的次数的
}/// 长按触发
void button_press_start_callback(void* arg)
{printf("%s\r\n", __FUNCTION__);
}/// 保持长按时一直触发
void button_press_hold_callback(void* arg)
{printf("%s\r\n", __FUNCTION__);
}

然后需要初始化并注册事件:

	// 初始化button_init(&button1, read_button_pin, 0);// 注册按键事件button_attach(&button1, SINGLE_CLICK, button_single_click_callback);button_attach(&button1, DOUBLE_CLICK, button_double_click_callback);button_attach(&button1, PRESS_REPEAT, button_press_repeat_callback);button_attach(&button1, LONG_PRESS_START, button_press_start_callback);button_attach(&button1, LONG_PRESS_HOLD, button_press_hold_callback);// 启动按键监测button_start(&button1);while (1){button_ticks();             // 按键轮训,每TICKS_INTERVALms查询一次HAL_Delay(TICKS_INTERVAL);    }

按键检测时长可以根据自己的需求进行更改,在头文件中的宏定义:


效果测试


ends…


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部