C语言很基础的问题,但是搞不懂。两个IF函数,其中一个IF满足条件执行后,另一个IF永远不进入(即使条件满足),请问是什么原因。

问题遇到的现象和发生背景

单片机入门,用独立按键控制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位,再取反,再赋值
    }
    
}

}

运行结果及报错内容

img

img

img

我的解答思路和尝试过的方法
while(P3_1==1);while(P3_0==1);写此循环的用意是可以在延时消抖后,再次确认按钮的状态是否松开。删除这两个循环后代码正常工作,影响if函数的原因是什么?
我想要达到的结果

用独立按键控制LED亮灭左右移动

while(P3_0==1);//消抖后再次判断是否松开,关键在于此循环,如果将此程序删去,代码正运行。
 if(LEDNum==0)//移到0,再移,相当于反向移7
        LEDNum=7;
    else
        LEDNum--;

如果加上循环语句,我复制的这一段为一条语句,表示的含义是只要不松手,就不停做if语句,但if语句之后的内容不会执行,LED的状态改变语句未执行,因此没有发生亮灭改变,可以加花括号,把亮灭改变也包含在内,试试效果

因为你的while陷入死循环了