You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32F407-DISC1按键切换LCD背光异常问题求助

STM32F407按键切换LCD背光问题解决

问题描述

使用STM32F407-DISC1开发板,按下蓝色按键时希望切换16x2 LCD背光,但按下瞬间背光会先关闭随即又亮起。原任务代码如下:

void btn_Task(void *pvParameters)
{
    uint8_t lcd_on = 1;
    while(1){

        if(HAL_GPIO_ReadPin(GPIOA, BTN_PIN) && lcd_on)
        {
           HD44780_NoBacklight();
           lcd_on = 0;
        }
        else
        {
            HD44780_Backlight();
            lcd_on = 1;
        }
        vTaskDelay(pdMS_TO_TICKS(50));
    }
}

期望实现:

  • 按住按键时仅识别一次点击,不会反复切换背光状态
  • 按键按下后背光状态保持稳定,直至再次按下按键切换

问题分析

原代码的核心逻辑错误在于没有区分“按键按下事件”和“按键持续按住状态”:

  1. 当按键按下时,第一次循环进入if分支,关闭背光并将lcd_on设为0
  2. 由于按键按住未释放,下一次循环时if条件不满足(lcd_on为0),进入else分支重新打开背光并将lcd_on设为1
  3. 后续循环会重复上述过程,导致背光快速切换,出现“先关又亮”的现象
  4. 同时缺少按键消抖处理,机械按键的抖动可能加剧误触发

修正方案

需要实现单次按键触发(按下并释放后切换状态),同时加入消抖避免抖动影响。修正后的代码如下:

void btn_Task(void *pvParameters)
{
    uint8_t lcd_on = 1;
    uint8_t prev_btn_state = HAL_GPIO_ReadPin(GPIOA, BTN_PIN); // 记录按键初始状态
    HD44780_Backlight(); // 初始开启背光

    while(1){
        uint8_t curr_btn_state = HAL_GPIO_ReadPin(GPIOA, BTN_PIN);

        // 按键消抖:状态变化时等待稳定后再确认
        if(curr_btn_state != prev_btn_state){
            vTaskDelay(pdMS_TO_TICKS(20));
            curr_btn_state = HAL_GPIO_ReadPin(GPIOA, BTN_PIN);
            if(curr_btn_state != prev_btn_state){
                prev_btn_state = curr_btn_state;
                // 检测按键按下动作(根据硬件配置调整电平,此处假设按下为高电平)
                if(curr_btn_state == 1){
                    // 等待按键释放,避免按住时重复触发
                    while(HAL_GPIO_ReadPin(GPIOA, BTN_PIN) == 1){
                        vTaskDelay(pdMS_TO_TICKS(10));
                    }
                    // 释放后切换背光状态
                    lcd_on = !lcd_on;
                    if(lcd_on){
                        HD44780_Backlight();
                    }else{
                        HD44780_NoBacklight();
                    }
                }
            }
        }
        vTaskDelay(pdMS_TO_TICKS(10));
    }
}

关键改进点

  • 消抖处理:状态变化时延迟20ms再次读取,确认按键状态稳定,避免机械抖动误判
  • 单次触发:仅在按键按下并释放后切换状态,按住期间不会重复触发
  • 状态管理:通过prev_btn_state跟踪按键状态变化,准确识别边沿事件

内容的提问来源于stack exchange,提问作者Ashking007

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 16:49:51