蓝桥杯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吗?所以会出现这种情况。我也是找到了解决办法。
- 第一种:加一个条件判断
while(count--)
{
P2=(P2&0x1f)|0x80;P0=0xff;P2&=0x1f;
Delay300ms();
P2=(P2&0x1f)|0x80;P0=0x00;P2&=0x1f;
Delay300ms();
}
if(count) count=5;
- 第二种:
for(count=5;count>0;count--)
{
P2=(P2&0x1f)|0x80;P0=0xff;P2&=0x1f;
Delay300ms();
P2=(P2&0x1f)|0x80;P0=0x00;P2&=0x1f;
Delay300ms();
}
这两种方法亲测可以,希望和我一样奋战蓝桥杯的朋友们一起加油!!!