本文主要是介绍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…
这篇关于STM32CubeMX | MultiButton:一个小巧简单易用的事件驱动型按键驱动模块实现按键单机、双击、多击、长按的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!