ORG 0000H
LJMP START
ORG 000BH
LJMP TM0_ISR ;定时器0中断程序入口
ORG 0030H
START:
ACALL TM0_INIT
MOV DPTR, #TAB1
MOV R1 , #01H ;用于选择显示的表
SETB EA
MAIN:
ACALL XZTAB ;选择显示的字形码表
ACALL DTSEG ;动态数码管显示
AJMP MAIN
TM0_INIT:
ANL TMOD, #0F0H ;初始化定时器0
ORL TMOD, #01H ;设置定时器0工作方式1
MOV TL0 , #00H ;?设置定时器初值 50ms
MOV TH0 , #4CH ;设置定时器初值
CLR TF0 ;清除TF0标志
SETB TR0 ;定时器0开始计时
SETB ET0 ;开启T0溢出中断
RET
XZTAB:
XZTAB1:
CJNE R1 , #1 , XZTAB2 ;根据R1的值选择字形码表
MOV DPTR, #TAB1
RET
XZTAB2:
CJNE R1 , #2 , XZTAB_RET
MOV DPTR, #TAB2
XZTAB_RET:
RET
DTSEG:
MOV R2 , #0 ;R2清0
FOUR:
ANL P2 , #0E3H ;P2.2 P2.3 P2.4置0
ORL P2 , #1CH ;选择左边第1位数码管显示
MOV A , R2
MOVC A , @A+DPTR
MOV P0 , A ;字形码输出到数码管
LCALL DELAY100US
MOV P0 , #00H ;消影
THREE:
INC R2
ANL P2 , #0E3H
ORL P2 , #18H
MOV A , R2
MOVC A , @A+DPTR
MOV P0 , A
LCALL DELAY100US
MOV P0 , #00H;
TWO:
INC R2
ANL P2 , #0E3H
ORL P2 , #14H
MOV A , R2
MOVC A , @A+DPTR
MOV P0 , A
LCALL DELAY100US
MOV P0 , #00H;
ONE:
INC R2
ANL P2 , #0E3H
ORL P2 , #10H
MOV A , R2
MOVC A , @A+DPTR
MOV P0 , A
LCALL DELAY100US
MOV P0 , #00H;
RET
TM0_ISR:
MOV TL0 , #00H ;重装定时器初值50ms
MOV TH0 , #4CH ;重装定时器初值
INC R0
CJNE R0 , #20 ,RETURN
MOV R0 , #0
INC R1
CJNE R1 , #3 ,RETURN ;1~3循环
MOV R1 , #1
RETURN:
RETI
DELAY100US:
PUSH 30H
MOV 30H,#41
NEXT100US:
DJNZ 30H,NEXT100US
POP 30H
RET
TAB1:
DB 79H,31H,31H,40H,79H,31H,31H,40H
TAB2:
DB 00H,00H,00H,00H,00H,00H,00H,00H
END;
运行结果如下: