第2个回答 2011-05-19
;假定晶振频率12M
;假定P1口对应接8个LED,且高电平有效
;MCU:8051系列
CONT_DISP EQU 30H ;定义查表的计数变量,用于8个LED灯的显示状态
CONT_INT EQU 31H ;定义中断间隔的计数变量,用于控制20个中断为1秒的时间间隔
ORG 00H
AJMP GO
ORG 0BH
AJMP INT0_1 ;定时器0,工作方式1
GO:
MOV SP,#60H
MOV P1,#00H ;P1口初始全部关闭
MOV CONT_DISP,#8 ;查表取LED点亮状态,注意此处为了减少变量,查表采用从尾到首的顺序,所以初始值为表末位数
MOV TMOD,#01H ;定时器工作方式1
MOV TH0,#0BH
MOV TL0,#3CH ;计数器初始设定,中断间隔为50ms
SETB TR0
SETB ET0
SETB EA ;计数器开始工作
LOOP: ;以下几句为不断为P1口送值,点亮相应的LED
MOV A,CONT_DISP
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A
AJMP LOOP
;----------------以下为中断处理程序---------------
INT0_1:
PUSH ACC ;保护现场
MOV TH0,#0BH
MOV TL0,#3CH ;定时器初值重装
DJNZ CONT_INT,RETINT
MOV CONT_INT,#20 ;20个中断判定
DJNZ CONT_DISP,RETINT ;每20个中断,即1秒,查表数减1
MOV CONT_DISP,#8 ;到1再循环
RETINT:
POP ACC
RETI
TAB:
NOP
DB 00H,0FFH,0AAH,55H,0A0H,50H,0AH,05H ;注意此表为从尾倒查式, 上面一句NOP不可少.
END