问题遇到的现象和发生背景
单片机入门,用独立按键控制LED灯左右亮灭两个IF函数,其中一个IF满足条件执行后,另一个IF永远不进入(即使条件满足)。现象为,复位后,要么按了左移按键后,LED可以左移,但再按右移按键不能右移(左移仍功能正常)。要么按了右移按键后,LED可以右移,但再按左移按键没反应,同样右移功能仍然正常。
问题相关代码,请勿粘贴截图
#include <REGX52.H>
//下面是51单片机按独立按键LED灯左右移的代码
void Delay(unsigned int xms) //消抖用延时函数
//@12.000MHz unsigned int--Ҥ`э xms--ҤĻؖ
{
while(xms--)//xms--表示执行一次后xms-1返回
{
unsigned char i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void main()
{
unsigned char LEDNum=0;//声明变量LEDNum
P2=~0x01;//P2是LED灯寄存器
while(1)
{
if(P3_1==0)//P3_1左按键寄存器,按下为0
{
Delay(20);//消抖延迟20ms
while(P3_1==0);
Delay(20);//松开消抖,防止没安紧还没松开就开灯
while(P3_1==1);//消抖后再次判断是否松开,关键在于此循环,如果将此程序删去,代码正运行。
LEDNum++;//
if(LEDNum>=8)//移8相当于不移
{LEDNum=0;
}
P2=~(0x01<<LEDNum);
}
if(P3_0==0)//P3_0右按键寄存器,按下为0
{
Delay(20);//消抖延迟20ms
while(P3_0==0);
Delay(20);//松开消抖,防止没安紧还没松开就开灯
while(P3_0==1);//消抖后再次判断是否松开,关键在于此循环,如果将此程序删去,代码正运行。
if(LEDNum==0)//移到0,再移,相当于反向移7
LEDNum=7;
else
LEDNum--;
P2=~(0x01<<LEDNum);// 计算顺序0000 0001 先左移LEDNum位,再取反,再赋值
}
}
}
运行结果及报错内容
我的解答思路和尝试过的方法
while(P3_1==1);while(P3_0==1);写此循环的用意是可以在延时消抖后,再次确认按钮的状态是否松开。删除这两个循环后代码正常工作,影响if函数的原因是什么?
我想要达到的结果
用独立按键控制LED亮灭左右移动