LEDBUF EQU 30H ;显示码缓存区
HOUR EQU 40H
MINUTE EQU 41H
SECOND EQU 42H
C100us EQU 43H
TICK EQU 10000 ;置中断次数
T100us EQU 256-100 ;置定时器初始值
LJMP START ;跳转至主程序
ORG 000BH ;定时器0中断入口
T0INT: PUSH PSW ;状态保护
PUSH ACC
MOV A,C100us+1
JNZ GOON ;计数值是否为0
DEC C100us
GOON: DEC C100us+1
MOV A,C100us
ORL A,C100us+1
JNZ EXIT
MOV C100us,#HIGH(TICK) ;重置计数值
MOV C100us+1,#LOW(TICK)
INC SECOND ;秒值加一
MOV A,SECOND
CJNE A,#60,EXIT ;判断秒值是否为60
MOV SECOND,#0 ;秒值为60,则清0
INC MINUTE ;分值加一
MOV A,MINUTE
CJNE A,#60,EXIT ;判断分值是否为60
MOV MINUTE,#0 ;分值为60,则清0
INC HOUR ;小时值加一
MOV A,HOUR
CJNE A,#24,EXIT ;判断小时值是否为24
MOV HOUR,#0 ;小时值为24,则清0
EXIT: POP ACC
POP PSW
RETI
DELAY: ;延时子程序
MOV R7,#0FFH
DELAYLOOP:
DJNZ R7,DELAYLOOP
DJNZ R6,DELAYLOOP
RET
LEDMAP: DB 3FH,06H,5BH,4FH ;八段数码管显示码
DB 66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH
DB 39H,5EH,79H,71H
DISPLAYLED:
MOV R0,#LEDBUF
MOV R1,#6 ;共6个八段管
MOV R2,#01111111B ;位扫描码初值
LOOP: MOV A,#0
MOV P0,A ;关所有八段管
MOV A,@R0
MOV P0,A
MOV A,R2
MOV P3,A ;显示一位八段管
MOV R6,#01H
CALL DELAY
MOV A,R2 ;显示下一位
RR A
MOV R2,A
INC R0
DJNZ R1,LOOP
RET
T0LED: MOV DPTR,#LEDMAP ;将字段码转换显示码
MOVC A,@A+DPTR
RET
START: MOV TMOD,#02H ;定时器工作方式2
MOV TH0,#T100us ;置定时器初始值
MOV TL0,#T100us
MOV IE,#10000010B ;EA=1,IT0=1
MOV HOUR,#0 ;显示初始值
MOV MINUTE,#0
MOV SECOND,#0
MOV C100us,#HIGH(TICK)
MOV C100us+1,#LOW(TICK)
SETB TR0 ;启动定时器0
MLOOP: MOV A,HOUR ;显示小时值十位
MOV B,#10
DIV AB
CALL T0LED
MOV LEDBUF,A ;将十位值送显示码缓存区
MOV A,B ;显示小时值个位
CALL T0LED
ORL A,#80H ;显示小数点
MOV LEDBUF+1,A ;送显示码缓存区
MOV A,MINUTE ;显示分钟值十位
MOV B,#10
DIV AB
CALL T0LED
MOV LEDBUF+2,A ;将十位值送显示码缓存区
MOV A,B ;显示分钟个位值
CALL T0LED
ORL A,#80H ;显示小数点
MOV LEDBUF+3,A ;送显示码缓存区
MOV A,SECOND
MOV B,#10 ;显示秒十位值
DIV AB
CALL T0LED
MOV LEDBUF+4,A ;送显示码缓存区
MOV A,B
CALL T0LED
MOV LEDBUF+5,A
CALL DISPLAYLED ;调用显示子程序
LJMP MLOOP
END