一个C语言程序,有几个地方不明白,请教下,谢谢了:

/*******************************************************************/
/*
间隔300ms第一次一个管亮流动一次,
第二次两个管亮流动,依次到8个管亮,
然后重复整个过程。
*/
/*********************************************************/
#include<reg52.h> //52单片机头文件
#include <intrins.h> //包含有左右循环移位子函数的库
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
void delay(uint z) //延时函数,z的取值为这个函数的延时ms数,如delay(200);大约延时200ms.
{ //delay(500);大约延时500ms.
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++) //左移//这里的i<8-j不怎么明白,请解释一下谢谢了i
{
P1=a; //点亮小灯
delay(200); //延时200毫秒
a=_crol_(a,1); //将a变量循环左移一位
}
a=_crol_(a,j); //这里的也不是真明白,解释下谢谢 补齐,方便下面的左移一位
P1=0xff; //全部关闭
a=a<<1; //左移一位让多一个灯点亮
}
}
}

首先我猜想:
P1的各个端口:0表示打开,1表示关闭。
另外:a=_crol_(a,1);和a=a<<1;的不同在于前者左移之后补1,后者左移之后补0,
这样a=0xfe;(也就是11111110)经过a=_crol_(a,1);之后就变成了0xfd(也就是11111101),形成了流动。
而11111110经过a=a<<1;之后却变成了11111100(两盏灯),再次a=_crol_(a,1);之后,就变成了
11111001(两盏灯的流动),以此类推,实现需求的功能。

原则就是灯数越多,流动次数越少,所以“i<8-j”。
而“a=_crol_(a,j);”则是为了让流动点回到原点,以便下一轮循环。

没仔细看,大概是这个样子。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-23
无意中看到的,没说错的话是单片机的流水灯程序吧!
for(j=0;j<8;j++)
for(i=0;i<8-j;i++) //左移//这里的i<8-j不怎么明白,请解释一下谢谢了i
知道这里为什么要有两个循环吗?没说错的话,应该有2*8一共16个LED吧,一个用于控制连续扫,一个用于控制第几个灯。
a=_crol_(a,j); //这里的也不是真明白,解释下谢谢 补齐,方便下面的左移一位
这个地方调用一个函数,也可以吧,不过我以前用a<<j的时候多数,不太好解释,就是一个实现流水灯效果的,建议把这个注释掉再看效果就行了
第2个回答  2011-06-24
i<8-j; 的意思是,每增加一个点亮的灯循环次数就减少一次。
a=_crol_(a,j); 的意思是回到本次循环a的原始值,这是为了下一步的左移一位。例如第2次循环时a=0xfc;此时j=1;循环左移7次后变为0x7e;执行a=_crol_(a,j); 后回到初值0xfc;
第3个回答  2011-06-23
for(i=0;i<8-j;i++)位循环体内for(j=0;j<8;j++)的子循环;j的值每变化一次,就要重复一次子循环,8-j的值变化一次,i<8-j是子循环的判断条件,也就是子循环判断条件变化一次。

a=_crol_(a,j); //将a变量左移j位,j的值是for(j=0;j<8;j++)当前循环时变量j的值,与8-j中j的值一致
第4个回答  2011-06-23
有点难啊
相似回答