qq_36222117 2022-06-06 00:12 采纳率: 50%
浏览 79
已结题

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亮灭左右移动

  • 写回答

2条回答 默认 最新

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月14日
  • 已采纳回答 6月6日
  • 创建了问题 6月6日

悬赏问题

  • ¥15 目详情-五一模拟赛详情页
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line