stm32按键双击实现
时间: 2025-02-24 14:23:33 浏览: 77
### STM32实现按键双击功能
在STM32微控制器中实现按键的双击功能涉及几个关键部分:按键扫描、消抖处理、时间间隔判断以及相应的事件响应。下面提供了一种具体方法来实现在STM32上的按键双击检测。
#### 初始化配置
首先,在初始化阶段设置好GPIO端口用于连接外部按键,并开启定时器中断服务程序以便于精确计时两次点击之间的时间差[^1]。
```c
// 配置 GPIO 和 TIM 定时器
void HAL_MspInit(void){
__HAL_RCC_GPIOA_CLK_ENABLE(); // 开启 PA 口时钟
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* 配置PA0作为输入 */
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
```
#### 按键扫描函数
定义一个`key_scan()`函数用来读取当前按键状态并返回其值给主循环中的其他模块使用。此过程中还需要加入简单的软件去抖动措施以提高稳定性[^2]。
```c
#define KEY_DOWN_LEVEL 0 // 键按下电平低有效
uint8_t key_scan(uint8_t mode) {
static uint8_t key_up_cnt = 0;
if (mode == 0){ // 扫描模式
if(KEY_DOWN_LEVEL != HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)){
key_up_cnt++;
if(key_up_cnt >= 20){
key_up_cnt = 0;
return 1; // 返回松开标志位
}
}else{
key_up_cnt=0;
}
if((KEY_DOWN_LEVEL==HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)) &&(key_up_cnt>=20)){
delay_ms(20); // 延迟一段时间再次确认是否真的被按下
if(KEY_DOWN_LEVEL==HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0))
return 2; // 返回按下标志位
}
return 0;
}
}
```
#### 主循环逻辑
最后,在主循环里持续调用上述创建好的按键扫描函数,当检测到一次有效的单次点击后启动定时器等待可能到来的新的一次点击;如果在这段时间内确实发生了第二次点击,则认为是一组完整的双击动作[^3]。
```c
#include "stm32f1xx_hal.h"
#include <stdint.h>
volatile uint8_t click_flag = 0;
extern void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
int main(void)
{
...
while (1)
{
switch(click_flag){
case 1:// 单击
// 处理单击事件...
break;
case 2:// 双击
// 进行双击后的操作...
break;
default:
break;
}
click_flag = 0;
if(key_scan(0)==2){
click_flag = 1;
start_timer();
}
if(is_double_click()){
stop_timer();
click_flag = 2;
}
}
}
void start_timer(){
htim->Instance->ARR = 500-1 ; // 设置自动重装载寄存器值为500ms
htim->Instance->CR1 |=TIM_CR1_CEN;// 启动定时器
}
bool is_double_click(){
if(htim->Instance->SR&TIM_SR_UIF)// 判断更新中断标志位是否发生翻转
return false;
else if(key_scan(0)==2){
return true;
}
return false;
}
void stop_timer(){
htim->Instance->CR1 &=~TIM_CR1_CEN; // 关闭定时器
}
```
阅读全文
相关推荐



















