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

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…

  • 8
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是详细的步骤: 1. 打开 STM32CubeMX,选择 STM32F030K6 号,创建一个新的工程。 2. 在 Pinout & Configuration 选项卡中,选择一个GPIO引脚作为按键输入引脚,例如 PA0。将它设置为输入模式,上拉或下拉。 3. 在 Configuration 选项卡中,打开 NVIC 配置,启用 EXTI0_IRQn 中断。 4. 在 Code Generator 选项卡中,选择生成代码的语言和工具链。 5. 在 STM32CubeMX 中生成代码,并在 IDE 中打开。 6. 在 main.c 文件中,定义两个全局变量: ``` uint32_t buttonState = 0; uint32_t buttonTimer = 0; ``` buttonState 用于保存按键状态,buttonTimer 用于保存按键按下的时间。 7. 在 main 函数中调用 HAL_GPIO_EXTI_Callback 函数,处理按键中断: ``` void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == GPIO_PIN_0) { uint32_t now = HAL_GetTick(); if (buttonState == 0) { // 按键第一次按下 buttonState = 1; buttonTimer = now; } else if (buttonState == 1) { // 按键第二次按下 if (now - buttonTimer < 500) { // 双击 } buttonState = 2; } } } ``` 如果 buttonState 等于 0,说明是按键第一次按下,将 buttonState 设为 1,并记录按键按下的时间。如果 buttonState 等于 1,说明是按键第二次按下,如果按键按下的时间小于 500 毫秒,说明是双击,否则是按。将 buttonState 设为 2。 8. 在 main 函数中添加一个死循环,在循环中检测按键状态: ``` while (1) { uint32_t now = HAL_GetTick(); if (buttonState == 1 && now - buttonTimer > 1000) { // buttonState = 3; } if (buttonState == 2 || buttonState == 3) { // 双击buttonState = 0; } } ``` 如果 buttonState 等于 1,说明是按键第一次按下,如果按键按下的时间超过 1 秒,说明是按,将 buttonState 设为 3。如果 buttonState 等于 2 或 3,说明是双击按,将 buttonState 设为 0。 9. 至此,我们已经实现了基于中断的按键输入实现单击双击按功能。你可以根据需要,在双击按的代码块中添加相应的操作代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

觉皇嵌入式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值