写一个stm32 检测按键长按 短按 双击的程序
以下是一个简单的stm32检测按键长按、短按、双击的程序:
#include "stm32f4xx.h"
#define DEBOUNCE_DELAY_MS 50 // 消除抖动的延迟时间
#define LONG_PRESS_DELAY_MS 1000 // 长按的延迟时间
#define DOUBLE_CLICK_DELAY_MS 300 // 双击的延迟时间
uint32_t button_last_state = GPIO_PIN_RESET; // 按钮上一次的状态
uint32_t button_current_state = GPIO_PIN_RESET; // 按钮当前的状态
uint32_t button_press_time = 0; // 按钮按下的时间
uint32_t button_release_time = 0; // 按钮松开的时间
uint32_t button_last_click_time = 0; // 上一次单击的时间
void delay_ms(uint32_t ms) {
uint32_t i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 20000; j++);
}
}
void EXTI0_IRQHandler(void) {
if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0) != RESET) {
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0); // 清除中断标志位
button_current_state = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
if (button_current_state == GPIO_PIN_SET && button_last_state == GPIO_PIN_RESET) {
// 按钮按下
button_press_time = HAL_GetTick();
} else if (button_current_state == GPIO_PIN_RESET && button_last_state == GPIO_PIN_SET) {
// 按钮松开
button_release_time = HAL_GetTick();
if (button_release_time - button_press_time < DEBOUNCE_DELAY_MS) {
// 消除抖动
return;
}
if (button_release_time - button_press_time > LONG_PRESS_DELAY_MS) {
// 长按
// TODO: 执行长按的操作
} else {
if (HAL_GetTick() - button_last_click_time < DOUBLE_CLICK_DELAY_MS) {
// 双击
// TODO: 执行双击的操作
button_last_click_time = 0;
} else {
// 单击
// TODO: 执行单击的操作
button_last_click_time = HAL_GetTick();
}
}
}
button_last_state = button_current_state;
}
}
int main(void) {
HAL_Init();
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = { 0 };
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
while (1) {
// 程序主循环
delay_ms(10);
}
}
该程序使用外部中断检测按键的状态变化,通过记录按键按下和松开的时间来判断是长按、短按还是双击。需要注意的是,为了消除按键抖动的影响,程序中加入了一个延迟时间,同时需要对单击和双击之间的时间间隔进行判断。在“TODO”标记的位置,可以添加相应的操作代码。
原文地址: https://www.cveoy.top/t/topic/by2m 著作权归作者所有。请勿转载和采集!