以下是一个简单的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”标记的位置,可以添加相应的操作代码。

写一个stm32 检测按键长按 短按 双击的程序

原文地址: https://www.cveoy.top/t/topic/by2m 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录