为什么我的单片机c语言中for循环有问题呢,如下

想让八个二极管从左到右依次闪烁,在从右到左依次闪烁。重复两次
出错程序如下
for(a=2;a>0;a--){
for(P1=0XFE;P1!=0X7F;P1=left(P1));
for(P1=0XFF;P1!=0XFE;P1=right(P1));}
其中left和right分别是左移和右移函数没有发现问题
uint left(uint P1){
_crol_(P1,1);
delay();
return P1;
}

uint right(uint P1){
_cror_(P1,1);
delay();
return P1;
}
为什么不能成功呢,求高人指点。。

这个是不会成功的.因为单片机中的P1不是变量,是端口.给P1赋值是把对应值输出到端口,读取P1是读取端口.两个是完全无关的操作.

for(P1=0XFE;P1!=0X7F;P1=left(P1));中P1!=0xF7就对端口P1进行了读取,left(P1)又读取,P1=这样的是输出到端口P1. 读取的情况就不能确定了,如果外围电路没有变化,那么P1端口就没有变化,读取到的值也不变,当然循环就永远进行下去或者只进行一次;如果外围电路变化,那么电路的变化也不会和循环移位有关,所以循环也不确定.

可以增加一个变量,改为

unsigned char b;
for(a = 2; a > 0; a--)
{
    for(b = 0XFE; b != 0X7F; b = left(b))
        P1 = b;
    for(b = 0X7F; b != 0XFE; b = right(b))//原来是从FF开始的,我猜是输入时候误操作了,所以改成了7F(FF又不能结束了)
        P1 = b;
}

 最好左右移函数中P1也改掉,因为理解上容易混淆.

追问

谢谢你的帮助,ff改7f那个地方确实是我疏忽了,不过按照你说的新增变量后for循环色问题还是没有解决啊,P1总是停在了0xfe,不知道怎么办才好

追答

是我疏忽了。观察不到现象是因为速度太快的问题。可以进行单步调试(如果支持的话);或者加上延迟程序,如下:

unsigned char b;

void delay(int n)
{
    int i;
    for (i = 0; i < n; i++);
}

for(a = 2; a > 0; a--)
{
    for(b = 0XFE; b != 0X7F; b = left(b))
    {
        P1 = b;
        delay(10000);
    }
    for(b = 0X7F; b != 0XFE; b = right(b))
    {
        P1 = b;
        delay(10000);
    }
}

 最终肯定还是停在0xFE上,因为for(a = 2; a > 0; a--)就做两次可以考虑改为while(1),那么就会无限循环下去。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-09-30
delay();的时间不够吧...
如果太小,不会看到灯的停顿.
同样在2个FOR间,也要有停顿.追问

不是这个原因,不过谢谢你的提醒,我在for中间都加delay()了。不过结果还是一样,P1停在了0xfe

第2个回答  2013-09-30
P1端口不是变量不能进行运算,可以改用以下程序试试
int a;
unsigned char temp;
P1=0xfe;
temp=P1;
for(a=2;a>0;a--)
{
P1=0xfe;
temp=P1;
delay();
while(temp!=0x7f)
{
P1=temp;
temp=left(temp);
delay();
}
P1=0x7f;
temp=P1;
delay();
while(temp!=0xfe)
{
P1=temp;
temp=right(temp);
delay();
}
}
相似回答