PIC24单片机BLINK_PRESSED状态LED常亮不闪烁问题排查求助
问题根本原因分析
1. 核心逻辑错误:BLINK_PRESSED状态的进入条件和循环条件直接冲突
查看STATE_RELEASED4分支的代码:
case STATE_RELEASED4: // 两个跳转逻辑的触发前提都是PB_RELEASED()为真,即按键已经松开 if(PB_RELEASED() && !SW){ e_state = STATE_RELEASED1; } if(PB_RELEASED() && SW){ e_state = BLINK_PRESSED; } break;
也就是说程序进入BLINK_PRESSED状态时,按键必然已经处于松开状态,此时while(PB_PRESSED())的判断条件一开始就为假,循环体一次都不会执行,LED保持进入状态前的常亮状态,和你观测到的现象完全吻合。仿真正常是因为你手动切换状态时绕过了实际的跳转逻辑,直接在进入BLINK_PRESSED状态时把按键设为按下,自然能跑通逻辑。
2. 其他可能的触发问题
- IO配置错误:PIC24的RB13引脚默认可能为模拟输入模式,需要先清零对应ANSEL寄存器位开启数字输入,否则读回的
_RB13值永远是错误的。另外要确认按键上下拉配置和硬件电路匹配,如果你的按键按下时输出高电平,宏定义的高低电平判断就完全写反了。 - 缺少按键消抖:所有按键判断都没有加消抖逻辑,硬件如果没有RC消抖电路,按键抖动会导致状态机跳转过快,出现随机逻辑异常。
- 状态跳转不符合需求:步骤4要求按住按键时闪烁,你当前的逻辑是按键松开才进入闪烁状态,和需求完全相反,需要调整跳转顺序:应该在
STATE_RELEASED4检测到按键按下后直接进入BLINK_PRESSED,而不是等按键松开再进入。
临时修复方案
先修改STATE_RELEASED4的跳转逻辑,把进入BLINK_PRESSED的触发条件改为按键按下:
case STATE_RELEASED4: if(PB_PRESSED() && SW){ e_state = BLINK_PRESSED; } if(PB_PRESSED() && !SW){ e_state = STATE_RELEASED1; } break;
同时给所有按键判断增加10~20ms的消抖延时,确认RB13的数字输入功能已开启,即可解决LED常亮的问题。
内容的提问来源于stack exchange,提问作者Kung Pao
相关产品推荐
相关产品推荐

