关于单片机流水灯的问题,求高手求解

在主函数中:
void main()
{
unsigned char i;
P1=0xfe;
for(i<0;i<8;i++)
{
delay(50000);
P1<<1;
P1=P1|0x01;
}
在该程序中, P1=P1|0x01;这个代码,为什么要将P1端口的最低位置1,其余位不变。
而且在右移时,要将其与0x80按位或,使最高位置1,其余位不变?

首先我不明白你的i是什么参数,i<0;i<8,这个循环是什么逻辑含义?然后,你的程序是想实现流水灯先循环左移吗?如果是的话,在开始,P1已经设置成0xfe了,也就是最低位的灯是亮着的,设想一下,要是没有P1|0X01,那么,在第一次左移之后,P1=1111 1100 ,因为P1<<=1之后最低位变成0,而不是1,所以要P1|0X01。在第二次移位之后,P1=1111 1010,此时也要|0x01,则P1=1111 1011。依次循环。当右移的时候|0x80其实是一样的,只是因为左右顺序变了,所以0x01变成了0x80。
我只能解释这么清楚了,希望你能懂。再说一个,你要是想以后找单片机工作的话,还是去北京上海,要是不不是这两个城市的话,还是学好自己专业,不然你会觉得现实很残忍!
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-04-08
其实就是想保证左移完,最低位是1,感觉可以用循环左移或者循环右移来实现,让代码看起来更清爽,
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

void main()
{
unsigned char i;
P1=0xfe;
for(i<0;i<8;i++)
{
delay(50000);
P1 = _crol_(P1,1);//循环右移

}本回答被网友采纳
第2个回答  2013-04-08
移到第八次的时候,不执行按位或,应该就不会有灯亮了,移到CY位去吧。
相似回答