用C啊,我想想:
1、和硬件有点儿关系,这个你清楚么?
2、假设LED连接到P1口吧。第一个灯接到P1.0。阴极接IO,阳极接5V。
#include
bit SecFlag;
unsigned char mS;
void Display(unsigned char num,unsigned char sec)
{
num%=8;
P1=~(1<
{
TR0=1;
while(SecFlag==0);SecFlag=0;
TR0=0;
}
}
main()
{
unsigned char i;
TMOD=1;IE=0x82;
while(1)
{
Display( (i++)%8,1);
}
}
void ISRT0(void) interrupt 1
{
TH0=(-50000)>>8;TL0=-50000;
mS++;
if(mS>20){mS=0;SecFlag=1;}//12MHz, 50mS定时中断,1秒计时。
}
你很容易扩展出任意要求的闪烁流水灯啦。
Display(2,1);
Display(1,1);
Display(3,2);
Display(1,2);
……放到while里面就好了。祝你玩得开心。
ORG 0000H
AJMP START
ORG 000BH
AJMP TIME0
ORG 30H
START:
MOV P1, #0FFH;Note:Hex立即数前必须补0
MOV 35H, #07FH
MOV 30H, #00H
MOV TMOD, #01H
MOV TH0, #0D5H;更改此处可以更改定时器高位,调节以实现1s
MOV TL0, #9FH;更改此处更改定时器地位,调节以实现1s(两者共同作用以实现1s)
SETB EA
SETB ET0
SETB TR0
LOOP:
AJMP LOOP
TIME0:
PUSH ACC
PUSH PSW
INC 30H
MOV A, 30H
CJNE A, #10, T_RET
T_L1:
MOV A, 35H;Note:必须移到ACC中才可以右移
RR A
MOV 35H, A
MOV P1, A
MOV 30H,#0
T_RET:
MOV TH0, #0D5H
MOV TL0, #9FH
POP PSW
POP ACC
RETI
END
gvgvfghv2 这位仁兄的答案可以,只是我不喜欢在中断里面处理事情,因为中断时间总是很急的嘛,那就得注重效率咯,还有一种最愚蠢的方法,就是延时1s啊(一个效率最低的方法哈)
//选择12MHz晶振
//由P0.0~P0.7分别接8个LED,采用共阳极接法。
#include
#define uchar unsigned char
uchar time=0;
void timer0_init()
{
TMOD=0X01;
TL0=0XAF;
TH0=0X3C;
ET0=1;
EA=1;
}
void main()
{
timer0_init();
TR0=1;
P0=0XFE;
while(1)
{
if(time>=20)
{
time=0;
P0=(P0<<1)|1;
if(P0==0XFF)P0=0XFE;
}
}
}
void TIMER0_ISR() interrupt 1
{
TL0=0XAF;
TH0=0X3C;
time++;
}
//选择12MHz晶振
//由P0.0~P0.7分别接8个LED,采用共阳极接法。
#include
#define uchar unsigned char
void timer0_init()
{
TMOD=0X01;
TL0=0XAF;
TH0=0X3C;
ET0=1;
EA=1;
}
void main()
{
timer0_init();
TR0=1;
P0=0XFE;
while(1);
}
void TIMER0_ISR() interrupt 1
{
static uchar time=0;
TL0=0XAF;
TH0=0X3C;
time++;
if(time>=20)
{
time=0;
P0=(P0<<1)|1;
if(P0==0XFF)P0=0XFE;
}
}