关于单片机流水灯左移右移的问题?

有一个单片机流水灯的程序
#include<reg52.h>
unsigned char led;
unsigned char i;
unsigned char a,b;
void delay(void)
{
unsigned char m,n,k;
for(m=20;m>0;m--)
for(n=20;n>0;n--)
for(k=250;k>0;k--);
}
void main(void)
{
while(1)
{
sbit led=0xfe;
P1=led;
delay();
for(i=1;i<8;i++)
{
a=led<<i;
b=led>>(8-i);
P1=a|b;
delay();
}
for(i=1;i>0;i++)
{
a=led>>i;
b=led<<(8-i);
P1=a|b;
delay();
}
}
}
在程序中关于流水灯左移右移的地方,为什么要那样写,请高手解释一下

51单片机的左移右移,首先在开始要调用"intrins.h"的文件包,这个文件包含_cror_(右移),_crol_(左移);然后通过for语句来控制;
for(m=20;m>0;m--)
for(n=20;n>0;n--)
for(k=250;k>0;k--);
理解这三句,第一句是指:m=20;m>0然后m--是真就执行:
for(n=20;n>0;n--)
for(k=250;k>0;k--);
这两句,m--一直减,减一次,里面就执行一次,这里是20次。
流水灯的左右移,第一用"intrins.h"的文件包,第二要要会定义赋值变量,第三延时,这是关键。
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-10-20
没什么为什么 就是保证每次只有一个灯亮 fe>>(8-i)保证了第i位及前为0,且第i位后面的位为1 而fe<<i保证了i位及后为0 i位前为1
第2个回答  2010-10-20
是说这几句吧:
a=led<<i;
b=led>>(8-i);
P1=a|b;

这样写可以防止产生错误吧,就像读数据是要用异或一样的
其实不这样也可以
就写
a=led《i;
P1=a;
不发生特殊情况时和上面一样的本回答被网友采纳
第3个回答  2010-10-21
51单片机内有左移右移命令,何苦自己再写???

关于单片机流水灯左移右移的问题?
流水灯的左右移,第一用"intrins.h"的文件包,第二要要会定义赋值变量,第三延时,这是关键。

关于流水灯左移和右移的程序问题
LED灯右移到最右边后向左移时是这样的:右移一位→第二个延时程序→第一个延时程序→右移右移一位→第二个延时程序→第一个延时程序,这样不断循环,循环到最左边,就开始了右移的程序。这样左移的延迟大一点的!

如何实现51单片机的按键k1按下,LED流水灯向右移动,按键k2被按下,LED...
对控制LED口的寄存器进行位操作,按k1左移,按K2就是右移了。51单片机是对兼容英特尔8051指令系统的单片机的统称。51单片机广泛应用于家用电器、汽车、工业测控、通信设备中。因为51单片机的指令系统、内部结构相对简单,所以国内许多高校用其进行单片机入门教学。51单片机的特点:同样的一段程序,在各个单片机...

流水灯左移速度越来越快右移越来越慢
是逻辑重复的问题。解决方法:0x01会两次,0x80也会两次,cnt到7就归0,cnt到8后归1,cnt到7归0要改判断逻辑。

用51单片机写了一个流水灯程序,有一点问题,请高手解惑
单片机的流水灯程序,因为程序就这么写的,决定了流水灯左移7次,再右移7次,结束两个循环后,才能执行下面的while(!key),按键才有效,而在循环过程中,不执行while(!key),所以按键无效。下图画红框内的两个循环。要想按键随时有效,应该把两个移位函数_cror_,_crol_ 放在主程中,检测key也放在...

单片机流水灯从左到右再从右到左 但是一直显示从左到右看下程序哪里是...
你这句话的意思想要左移亮完八个等吧。最后一句,自减一。但是你又跳转到 RIGHT.请注意。你的第一句是什么。又把R1赋值为8了,那么R1就一直是7,8,7,8。。了。你可以吧MOV R1 ,#08H移到RIGHT的前面。程序是一句句来的,单片机执行的RIGHT。所谓左移。你换一面看就变右移了 ...

流水灯电路板右移左移全亮全灭
流水灯电路板右移左移全亮全灭原因如下:1、电路板有问题。流水的效果只有换一个电气原件已经烧坏。2、转向开关故障。转向灯不亮,是转向开关有故障,可用螺丝刀分别接通转向开关火线与左右灯线的接线柱。3、闪光器继电器损坏或转向灯熔断丝已熔断。

关于单片机流水灯0x7e的控制问题
>>是移位操作,在被操作数是无符号数时,每移动一位,最高位就会被置零,所以当移动8次以后,temp就等于零了,然后是temp再次赋值0x7e,依次循环。如果你想实现的是带进位的循环,可以自己写一个函数,也可以使用库函数_cror_(x,i)(右移)或者_crol_(x,i)(左移),但是如果使用这两个库函数...

51单片机流水灯有句1左移i位的代码1<
这个的意思是Di位为1 要流水的话要对i ++\/-- 还有要延时 我也在学 哈哈 你的程序的意思呢C加到60000是延时,之后i从0加到8,也就是00000001变为10000000的过程,完成一个循环,则i为0,再循环,再次重复i等于几,第几位就为1,其他为零 ...

...两边向中间的流水灯,我用的是两个数分别左移右移后相与实现的,这两...
\/\/ j初始化为0x01,左移初始值 for(i=0;i<8;i++) \/\/ for循环语句,完成8个循环 { P1= ~ j; \/\/ 对变量j 中的值按位取反后,从P1口输出 delay02s( ); \/\/ 延时0.2s j= j<<1; \/\/ 左移1位 } j=0x80; \/\/ 设置右移初始值j为0x80 for (i=0;i>1; \/\/ 右移1...

相似回答