想让八个二极管从左到右依次闪烁,在从右到左依次闪烁。重复两次
出错程序如下
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;最好左右移函数中P1也改掉,因为理解上容易混淆.
追问谢谢你的帮助,ff改7f那个地方确实是我疏忽了,不过按照你说的新增变量后for循环色问题还是没有解决啊,P1总是停在了0xfe,不知道怎么办才好
追答是我疏忽了。观察不到现象是因为速度太快的问题。可以进行单步调试(如果支持的话);或者加上延迟程序,如下:
unsigned char b; 最终肯定还是停在0xFE上,因为for(a = 2; a > 0; a--)就做两次可以考虑改为while(1),那么就会无限循环下去。
不是这个原因,不过谢谢你的提醒,我在for中间都加delay()了。不过结果还是一样,P1停在了0xfe