stm32cubemx实现按键输入的单击双击和长按功能及程序
时间: 2024-05-05 14:22:25 浏览: 130
在使用STM32CubeMX实现按键输入的单击、双击和长按功能时,需要先配置GPIO口为输入模式并使能中断。然后在中断服务函数中判断按键事件类型,根据不同的事件类型执行相应的操作。
下面是一个示例代码,实现了PA0口的单击、双击和长按事件:
```
#include "main.h"
#define DEBOUNCE_TIME 20 // 消抖时间,单位ms
#define LONG_PRESS_TIME 1000 // 长按时间,单位ms
GPIO_TypeDef* KEY_PORT = GPIOA;
uint16_t KEY_PIN = GPIO_PIN_0;
volatile uint32_t press_time = 0; // 按键按下时间
volatile uint32_t release_time = 0; // 按键释放时间
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == KEY_PIN) {
if (HAL_GPIO_ReadPin(KEY_PORT, KEY_PIN) == GPIO_PIN_RESET) { // 按键按下
press_time = HAL_GetTick();
} else { // 按键释放
release_time = HAL_GetTick();
uint32_t duration = release_time - press_time;
if (duration < DEBOUNCE_TIME) { // 消抖处理
return;
}
if (duration < LONG_PRESS_TIME) { // 短按
// 执行单击或双击操作
// 双击的判断方法是在两次单击之间的时间小于一定值
} else { // 长按
// 执行长按操作
}
}
}
}
int main(void)
{
// 初始化代码省略
// ...
// 配置PA0为输入模式
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = KEY_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(KEY_PORT, &GPIO_InitStruct);
// 使能PA0中断
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
while (1) {
// 主循环代码省略
// ...
}
}
void EXTI0_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(KEY_PIN);
}
```
需要注意的是,在使用HAL库的情况下,需要在`stm32xx_it.c`文件中手动添加`EXTI0_IRQHandler`函数的实现。
阅读全文