STM32CubeMX | MultiButton:一个小巧简单易用的事件驱动型按键驱动模块实现按键单机、双击、多击、长按
开发测试环境:
- 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…