51单片机流水灯 单片机 流水灯的问题 C51程序

来源:百度知道 编辑:UC知道 时间:2024/07/04 12:14:43
本人在单片机学习的过程中遇到一个问题 ,源程序如下,但是确不能完全理解下面三条语句的作用;
a=_crol_(a,j);
P1=0xff;
a=a<<1;

另请帮忙分析 ,外层循环和内层循环的作用;
其实我主要是不明白如果实现P0 = a;的循环次数,如何达到题目那种效果的,这个问题困扰了我差不多一周了。不知如何解决,麻烦知道的帮忙解释下,非常感谢;逻辑应该很清晰,就是这个语句实现有些看不明白;最好把for中的语句详细说明下~

题目:间隔300ms第一次一个管亮流动一次,第二次两个管亮流动,依次到8个管亮,然后重复整个过程。

#include<reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
uchar a,i,j;
while(1)
{
a=0xfe;
for(j=0;j<8;j++)
{
for(i=0;i<8-j;i++)
{
P1=a;
delay(200);
a=_crol_(a,1);
}
a=_crol_(a,j);
P1=0xff;
a=a<<1;
}
}
}
楼下说的都非常精彩 我自己编写的程序只和源程序差一行 a = _crol_(a, j); 这条语句~ 结果在执行前两次的时候没问题,到执行第三次的时候程

while(1)
{
a = 0xfe;
for(j=0;j<8;j++) //外循环8次
{
//--------------------------------------------
for(i=0;i<8-j;i++) //内循环8、7、6...0次
{
P1=a; //第一次,只有右边1个发光
delay(200);
a=_crol_(a,1); //左移一位
}
//以上单个LED发光,移位8、7、6...次
//----------------------------------------
a = _crol_(a, j); //左移,第一次,移动0位,以后渐多
//前面的内循环,移位次数逐减,这里逐增,合到一起,仍然是移动8位

P1 = 0xff; //关闭显示
a = a << 1; //左移一位,右边添0,这样,就会有两个发光

} //到前边去循环,显示两个发光;
//再循环,有三个发光;
//……
}

我想说~程序加一行和不加一行是很大差别的
首先你要明白a = _crol_(a, j); 这条指令时什么意思
a = _crol_(a, j); 只能在头文件intrins.h里调用
意思是向左移j位 例如:a = _crol_(a, 1);就是向左移一位,a = _crol_(a, 2);就是向左移两位,如此类推
如果你需要向右移则需要用a = _cror_(a, j);指令,原理是一样的
首先我看你的程序
a=_crol_(a,j); 你加了这个指令 即代表j随for(j=0;j<8;j++)这个函数控制,里面的