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)); } }
期望实现:
- 按住按键时仅识别一次点击,不会反复切换背光状态
- 按键按下后背光状态保持稳定,直至再次按下按键切换
问题分析
原代码的核心逻辑错误在于没有区分“按键按下事件”和“按键持续按住状态”:
- 当按键按下时,第一次循环进入
if分支,关闭背光并将lcd_on设为0 - 由于按键按住未释放,下一次循环时
if条件不满足(lcd_on为0),进入else分支重新打开背光并将lcd_on设为1 - 后续循环会重复上述过程,导致背光快速切换,出现“先关又亮”的现象
- 同时缺少按键消抖处理,机械按键的抖动可能加剧误触发
修正方案
需要实现单次按键触发(按下并释放后切换状态),同时加入消抖避免抖动影响。修正后的代码如下:
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
相关产品推荐
相关产品推荐

