汇编
思路:循环:左→右,按位向左循环;右→左,按位向右循环
ORG 0000H
MAIN: MOV A,#01H; 主循环程序
MOV R1,#07H
L0: MOV P2,A; 进行0->7的循环点亮
LCALL DELAY; 延时0.5s
RL A
DJNZ R1,L0
MOV R1,#07H
L1: MOV P2,A; 进行7->0的循环点亮
LCALL DELAY
RR A
DJNZ R1,L1
LJMP MAIN
ORG 0200H
DELAY:MOV R2,#10; 延时子程序,晶振频率为12M,一个机器周期是1us
D0: MOV R3,#100
D1: MOV R4,#250
DJNZ R4,$; 2*250个机器周期
DJNZ R3,D1; 100*(1+2*250+2)个机器周期
DJNZ R2,D0; 10*[1+100(1+2*250+2)+2]个机器周期,约为0.5s
RET
END
C语言
思路:用一维数组设置亮灯的8种情况,再添加一个亮灯顺序标志位k(=1,从前往后亮;=0从后往前亮);循环数组实现亮灯,每次循环将k取反,即下次就是按照相反的顺序来亮灯
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
int a[8]={1,2,4,8,16,32,64,128}; //设置跑马灯亮灯的8种情况
void DelayMS(uint x) //延时xms
{
uchar i;
while(x--)
{
for(i=0;i<120;i++);
}
}
void main()
{
int i,k=1;
while(1)
{ if(k) //k为1,亮灯顺序从前往后;k为0,亮灯顺序从后往前
for(i=0;i<8;i++)
{ P2=a[i];
DelayMS(400);
}
else
for(i=7;i>=0;i--)
{ P2=a[i];
DelayMS(400);
}
k=!k; //调整亮灯顺序
}
}