蓝桥杯while(count--)出现的无限循环问题

蓝桥杯while(count–)出现的无限循环问题

** 最近再用keil 4写代码的时候突然出现了问题。话不多说,先上代码!*!
 while(count--)
 {
    P2=(P2&0x1f)|0x80;P0=0xff;P2&=0x1f;
    Delay300ms();
	P2=(P2&0x1f)|0x80;P0=0x00;P2&=0x1f;
	Delay300ms();
 }
   这是代码功能的一小部分,目的是让LED灯全亮,然后隔300ms再让LED全灭循环5次,然后执行下面的代码。整个过程是循化执行的。然而呢,我发现执行到第二遍的时候,突然不对了,他一直在那闪啊闪,不是原先代码中写的五次。通过IAP15的仿真功能,找到了原因。
  我设置的count变量是unsigned int型的,范围是0~65536,当它减到0再减的时候就会变成65535.原因如下:
  // unsigned char的范围0到65536,0再减一就会溢出到65536.
  0-1=-1,由于我设置的是无符号的变量,-1会用补码来显示
  0000 0000 0000 0001的补码不正是1111 1111 1111 1110吗?所以会出现这种情况。我也是找到了解决办法。
  1. 第一种:加一个条件判断
while(count--)
{
	P2=(P2&0x1f)|0x80;P0=0xff;P2&=0x1f;
	Delay300ms();
	P2=(P2&0x1f)|0x80;P0=0x00;P2&=0x1f;
	Delay300ms();
}
 if(count) count=5;
  1. 第二种:
  for(count=5;count>0;count--)
  {
	P2=(P2&0x1f)|0x80;P0=0xff;P2&=0x1f;
	Delay300ms();
	P2=(P2&0x1f)|0x80;P0=0x00;P2&=0x1f;
	Delay300ms();
  }

这两种方法亲测可以,希望和我一样奋战蓝桥杯的朋友们一起加油!!!

发布了5 篇原创文章 · 获赞 9 · 访问量 1379

猜你喜欢

转载自blog.csdn.net/qq_33685823/article/details/86104379