#define LED P0
char LED_B=0x00; //补位
while (1) //循环这个过程
{
//初始化灯,全灭
LED=0;
LED_B=0;
for (i=7;i>0;i++) //因为补了1再移动,所以只需要移动7次
{
LED|=0X01; //第一次补1,用于向高位移动的灯
for (j=i;j>0;j--) //实现流水灯部分,每次先填入1后用位移向高位移动,并或稳亮即可得到结果,因为要
{
LED=(LED<<1)|LED_B; //移动后,补稳亮
Delay(10);
}
LED_B=(LED_B>>1)|0X80; //一次流水后,稳亮向地位扩充
}
}
0000 0000
分成两部分组成,一部分是正常的流水灯,一部分是稳定亮的灯,每当移动到最后,稳定灯就多一个,所以流水灯的位置就少一个,先将流水灯部分位移(先或入1后左移动J次,当移动了J次后,到了尽头,那么路径又短了1,所以取J=i,i循环后会--的,路径依次减断为7865321),
LED_B是一个1字节变量,用于保存稳亮的灯,因为当位移的时候,高位数据丢失,所以,位移后或LED_B即可保持稳亮,但是每次流水过后,就会产生一个稳亮的灯,所以,内循环过后,LED_B往低位移动补1
1000 0000->1100 0000
运算过程:
LED=0000 0001填1
LEF_B=0000 0000
LED=(0000 0010)|0000 0000位移后或稳亮
....
LED_B=1000 0000第一个稳亮产生
LED=1000 0001填1
LED=(0000 0001)|(1000 0000)=(1000 0001)位移或稳亮
...