单片机C程序 LED流水灯的 看不懂 求解释。。

#include<reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uint z)
{
uint x,y;
for(x=300;x>0;x--)
for(y=110;y>0;y--);
}
void delay(uint);
void main()
{
uchar a,i,j;
while(1)
{
a=0xfe;
for(j=0;j<8;j++) //这个最外围的for 又是要起什么作用?
{
for(i=0;i<8-j;i++) //这个for 是要完成程序中的哪一步?
{
P1=a;
delay(200);
a=_crol_(a,1);
}
a=_crol_(a,j); //a 已经被赋值了么? 这个地方是不是要说 a左移j个单位?
P1=0xff;
a=a<<1; //这里a 又是要左移1个单位么?? 这到底要移什么的。。。。
}
}
}
程序主要目的是 完成第一次1个灯流水,第二次 2个灯一起,第三次三个灯一起,第四次四个灯一起。。。。。 细节我懂一点但是整个程序的思路我没有搞清楚。。。。。。。

①最外层的 j for循环,用来执行8次流水(第一次、第二次...);
②内层的 i for循环,用来执行每次流水 需要执行多少步(第一次8步,第二次7步...);
③a=_crol_(a,j) 确实如LZ说的,对a 左移 j 位,不过要求带 C 左移,就是循环移位,把a^7移到a^0上,也确实已经对a 进行赋值了;
④a=a<<1,这也是左移一个位,这个移,不带C,就是把a^7踢出去,不要了,a^0补0;这个移的意义在于每次流水都会增加一颗灯,不过它必须是 低电平驱动 的LED 才有效。
执行过程简析如下:当第一次流水完成后(亮完最后一颗灯),第一次 i 循环结束,执行 i 循环内的最后一条语句带C左移,a 又回到第一颗灯状态(0xfe=1111 1110b);执行第③点的左移,此时j=0,相当于不移。再执行第④点的左移,a=0xfc(1111 1100),就变成了2颗灯;
下一个i 循环开始(第二次流水),流水步数为8-j=7(j 已经+1),a现在是2颗灯,7步后亮到最高2颗灯(a=0011 1111),经循环内最后一句带C左移,a=0111 1110,i 循环结束,执行第③点的带C左移,此时 j=1,a=1111 1100,又回到第二次流水时的起始状态。再执行第④点的左移,a=1111 1000,变成了3颗灯,下一个 i 循环开始........一直到8颗灯亮
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-06-11
最外围的是确定一次几个灯亮,在a=a<<1里实现每次多出一个灯。第二层是移位,如第一次a值为:11111110,_crol_(a,n)是将a左移n位,移出的又补回右边了,所以在内层移位时,11111101,1111101…………,内层完了后,a=_crol_(a,j)是将a移回成原来的数,如第一次是0xFE就移回成0XFE,第二次经a=a<<1后,a为0XFC(11111100)了,移6次后就成00111111,移回成11111100。
第2个回答  2013-06-11
内循环你应当能看懂,就是完成灯流水。循环次数取决于外循环,例如第一次外循环(第1个灯)要循环8次、第二次外循环(第1、2个灯)要循环7次。
内循环执行完一遍之后,a回复到了最低位为第一个0的状态,因此要_crol_(a,j)将后续的0也都提上来。最后a = a<<1,是为下一次外循环做准备,即下一次将开始多点一个灯。
第3个回答  2013-06-11
for(j=0;j<8;j++)
{
for(i=0;i<8-j;i++) //这个for 造成灯流水亮
{
P1=a; //i=7,a=0111 1111。 j=1,i=7时,a =0011 1111
delay(200);
a=_crol_(a,1); //此时a=1111 1110。j=1,i=7时,此时a=0111 1110 }
a=_crol_(a,j); //出循环,j=0而不移动,j=1时,a=1111 1100
P1=0xff;
a=a<<1; //j=0时,a 实际变成0xfe,此时0xfe再移一位变成两个灯亮0xfc ,赋给a。j=1时,a=1111 1000三个灯亮 }
}

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网