stm32f1按键双击触发
时间: 2025-05-30 09:43:39 浏览: 18
### 实现STM32F1系列单片机按键双击触发功能
为了实现在STM32F1系列单片机上的按键双击触发功能,可以采用时间戳和计数的方法来区分单击和双击事件。下面是一个详细的实现方案以及相应的代码示例。
#### 按键状态处理逻辑
当检测到一次有效的按下动作时记录当前的时间戳,在设定时间内再次接收到相同的按下信号则认为是一次双击;如果超过规定间隔仍未有第二次点击,则视为单击[^3]。
```c
#include "stm32f1xx_hal.h"
#define DEBOUNCE_TIME 20 // 去抖动延时(ms)
#define DOUBLE_CLICK_TIME 300 // 判断双击的最大时间窗口(ms)
static uint32_t last_click_time = 0;
static volatile uint8_t click_count = 0;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
static uint32_t debounce_timer = 0;
if (HAL_GetTick() - debounce_timer >= DEBOUNCE_TIME){
debounce_timer = HAL_GetTick();
if(GPIO_ReadInputPin(KEY_BUTTON_PORT, KEY_BUTTON_PIN) == RESET){ // 当按钮被按下
if((HAL_GetTick()-last_click_time)<DOUBLE_CLICK_TIME){
++click_count;
if(click_count==2){
/* 执行双击操作 */
LED_Breathe(); // 调用呼吸灯函数
click_count=0; // 清零计数器以便下次检测新的序列
}
}else{
click_count=1; // 单击重置计数
if(HAL_GetTick()-last_click_time>=DOUBLE_CLICK_TIME){
/* 执行单击操作 */
LED_Toggle(); // 控制LED切换亮灭
}
}
last_click_time = HAL_GetTick();
}
}
}
```
此段程序利用了外部中断服务例程`HAL_GPIO_EXTI_Callback()` 来响应按键输入的变化,并通过全局变量 `click_count` 记录连续发生的次数。每当发生有效按压后都会更新最近的一次按压时刻 `last_click_time` 。根据两次相邻按压之间经过的时间长短决定是执行单击还是双击对应的回调函数[^4]。
阅读全文
相关推荐


















