为什么第二次的死循环跳不出来了?

2019-07-18 10:40发布

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

void DelayMS(uint x)
{
uchar i;
while(x--)
{
  for(i=0;i<120;i++);
}
}
//主涵
void main()
{
uchar i;
P1=0xfe;
while(1) //第一个死循环
         {
           i=0;i++;
           if(i<2)
               { for(i=0;i<7;i++)
                 {
                    P1=_crol_(P1,1); //P1 左循环
                    DelayMS(100);
                   }
                       for(i=0;i<7;i++)
                  {
                    P1=_cror_(P1,1); //P1 右循环
                   DelayMS(100);       
                                    }
    }
           if (i>=2)                  //第一个死循环跳出
               {
                      uchar j;
                      P1=0xff;
                      while(1)             //第二个死循环
                      {
                            j=0;j++;
                        if(j<7)
                          {P1=~P1;
                          DelayMS(150);
                          }
                        if(j>=7)         //第二个死循环       跳不出
                          { P1=0xff;       
                              }
               }
                           }
                         }
}

小弟是刚刚学的C程序应用,以上是一个8LED循环练习,我的想法是这样的,LED来回流水一次后全部闪烁7次,然后跳出,LED保持全部亮,试验结果是流水一次后开始闪烁,之后就一直在闪烁了。我看了一下程序,第一次进入While语句在我设的if条件跳出了,但是第二次我再用的时候就跳不出来了,这是为什么?是哪里出问题了呢?          还有一个问题就是,我想闪烁七次后又再次自动开始循环之前的步骤又应该怎么改,或者要用到什么语句?各位大神提示一下就可以了。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
me860
2019-07-18 14:05
if (i>=2)              
{
         uchar j;
         P1=0xff;
         while(1) //这的While(1)一直为真,就真是死循环了,只有括号里为“假”时才退出这个循环
          {          //这个循环为什么不沿用上面的for循环呢,
                    j=0;j++;         
                    if(j<7)
                    {P1=~P1;
                     DelayMS(150);
           }
这里
i=0;i++;
while(1) //第一个死循环               这里的i变量不会按你想象中的变化
         {
           i=0;i++;
           if(i<2)
               { for(i=0;i<7;i++) //在这里 i变量经过循环后被赋值成了7,
P1=_crol_(P1,1); //P1 左循环
                    DelayMS(100);
                   }
                       for(i=0;i<7;i++)  //在这开始被赋值为0,经过循环后又变为7 ,之后直接跳过if(i<2),直奔下个if语言,最终停在了while循环
                  {
                    P1=_cror_(P1,1); //P1 右循环

一周热门 更多>