;**************************************************************
; 延时显示乘法口决程序
; 每延时1S显示一句口决,中间间隔2S显示
; Create by :逸飞 12MHZ晶振
;**************************************************************
;**************************************************************
; 伪定义
;**************************************************************
DISPBUF EQU 30H;定义显示缓冲区首址,
; 从30H到35H都定义为显示缓冲区
JI_GE EQU 36H
JI_SHI EQU 37H
DENGYU EQU 38H
SHU2 EQU 39H
DIAN EQU 3AH
SHU1 EQU 3BH
;**************************************************************
; 主 程 序
;**************************************************************
ORG 0000H ;程序执行开始地址
LJMP START ;跳到标号START执行
ORG 000BH ;定时器T0中断程序入口
LJMP INTT0 ;跳至INTTO执行
ORG 0040H
START:
MOV R0,#30H ;清30H-3BH共11个内存单元
MOV R1,#0CH ;
CLEARDISP: MOV @R0,#00H ;
INC R0 ;
DJNZ R1,CLEARDISP ;
MOV DIAN,#10
MOV DENGYU,#11
MOV SHU1,#1
MOV SHU2,#1
MOV A,SHU1
MOV B,SHU2
MUL AB
MOV B,#10
DIV AB
MOV JI_SHI,A
MOV JI_GE,B
MOV 30H,36H ;送显示缓冲区
MOV 31H,37H
MOV 32H,38H
MOV 33H,39H
MOV 34H,3AH
MOV 35H,3BH
MOV TMOD,#11H ;设T016位定时器
MOV TL0,#0B0H ;50MS定时初值(T0计时用)
MOV TH0,#3CH ;50MS定时初值
SETB EA ;总中断开放
SETB ET0 ;允许T0中断
SETB TR0 ;开启T0定时器
MOV R4,#14H ;1秒定时用初值(50MS×20)
START1: LCALL DISPLAY ;调用显示子程序
SJMP START1 ;P3.7口为1时跳回START1
;**************************************************************
; 延时1S显示下一句子程序
;**************************************************************
;T0中断服务程序
INTT0: PUSH ACC ;累加器入栈保护
PUSH PSW ;状态字入栈保护
CLR ET0 ;关T0中断允许
CLR TR0 ;关闭定时器T0
MOV TL0,#0B0H ;50MS定时初值(T0计时用)
MOV TH0,#3CH ;50MS定时初值
DJNZ R4, OUTT0 ;20次中断未到中断退出
ADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值
CALL ADD_1
OUTT0:
POP PSW ;恢复状态字(出栈)
POP ACC ;恢复累加器
SETB ET0 ;开放T0中断
SETB TR0 ;开启定时器T0
RETI ;中断返回
;**************************************************************
; 加1生成下一句子程序
;**************************************************************
ADD_1:
CLR CY
MOV A,#1
ADD A,SHU1
MOV SHU1,A
CJNE A,SHU2,PD
AJMP XD
PD: JNC SHU1_OUT
XD: MOV A,SHU1
MOV B,SHU2
MUL AB
MOV B,#10
DIV AB
MOV JI_SHI,A
MOV JI_GE,B
MOV 30H,36H ;送显示缓冲区
MOV 31H,37H
MOV 32H,38H
MOV 33H,39H
MOV 34H,3AH
MOV 35H,3BH
AJMP ADD_OUT
SHU1_OUT: MOV A,#1
ADD A,SHU2
MOV SHU2,A
MOV SHU1,#0
CJNE A,#10,ADD_OUT
MOV SHU2,#0
MOV SHU1,#0
ADD_OUT:
RET
;**************************************************************
; 显示程序
;**************************************************************
; 琍0口输出段码数据,P2口作扫描控制,每个LED数码管亮1MS时间再逐位循环。
DISPLAY: MOV R1,#DISPBUF ;指向显示数据首址
MOV R5,#0FEH ;扫描控制字初值
PLAY: MOV A,R5 ;扫描字放入A
MOV P2,A ;从P2口输出
MOV A,@R1 ;取显示数据到A
MOV DPTR,#TAB ;取段码表地址
MOVC A,@A+DPTR ;查显示数据对应段码
MOV P0,A ;段码放入P1口
LCALL DELAY1MS ;显示1MS
INC R1 ;指向下一地址
MOV A,R5 ;扫描控制字放入A
JNB ACC.5,ENDOUT ;扫到第六位时结束
RL A ;A中数据循环左移
MOV R5,A ;放回R5内
AJMP PLAY ;跳回PLAY循环
ENDOUT: SETB P2.5 ;一次显示结束,P2口复位
MOV P0,#0FFH ;P0口复位
RET ;子程序返回
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,7FH,0B7H,0FFH
;共阳段码表 "0""1""2" "3""4""5""6""7" "8""9"".""=""不亮"
;
;**************************************************************
; 延时程序
;**************************************************************
;
;1MS延时程序,LED显示程序用
DELAY1MS: MOV R6,#2
DL1: MOV R7,#248
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
END ;程序结束