📄 1.txt
字号:
;电脑时钟 文件名:clockBCD.ASM
;!开始执行程序前在监控状态,把时钟初值输入到时钟计数单元
;输入BCD码不要超过合理的时间范围!
;以下六个单元为显示缓冲单元
SECDISL EQU 30H ;秒的个位
SECDISH EQU 31H ;秒的十位
MINDISL EQU 32H ;分的个位
MINDISH EQU 33H ;分的十位
HOUDISL EQU 34H ;时的个位
HOUDISH EQU 35H ;时的十位
;以下四个单元为实时时钟计数单元
MSCONU EQU 36H ;毫秒计数单元
SECCONU EQU 37H ;秒计数单元
MINCONU EQU 38H ;分钟计数单元
HOUCONU EQU 39H ;小时计数单元
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP T0INT
DISTAB: DB 0C0H,0F9H,0A4H,0B0H; 字型代码表
DB 99H,92H,82H,0F8H
DB 80H,90H,88H,83H
DB 0C6H,0A1H,86H,8EH
ORG 0030H
MAIN: MOV SP,#5FH ;主程序
MOV TMOD,#01H ;T0方式1,定时100毫秒
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
SETB ET0
SETB EA
M1: ACALL DISRDY ;显示准备,把计数单元的值转换为显示缓冲器的值
ACALL DISPLAY ;刷新显示,把显示缓冲单元的值送到LED显示器上
SJMP M1
;T0定时100毫秒中断服务子程序
T0INT: PUSH ACC
MOV TH0,#3CH ;TO方式1,重新输入初值
MOV TL0,#0B0H
MOV A,MSCONU
CJNE A,#10,T01 ;100毫秒计数到十次否?
MOV MSCONU,#00H ;到十次,毫秒计数单元清零
MOV A,#01H
ADD A,SECCONU ;秒计数单元加1,BCD码加法
DA A
MOV SECCONU,A
CJNE A,#60H,T02 ;秒计数到60否?
MOV SECCONU,#00H ;到60秒,秒计数单元清零
MOV A,#01H
ADD A,MINCONU ;分计数单元加1,BCD码加法
DA A
MOV MINCONU,A
CJNE A,#60H,T03 ;分计数到60否?
MOV MINCONU,#00H ;到60分,分计数单元清零
MOV A,#01H
ADD A,HOUCONU ;时计数单元加1,BCD码加法
DA A
MOV HOUCONU,A
CJNE A,#24H,T04 ;时计数到24否?
MOV HOUCONU,#00H ;到24小时,时计数单元清零
SJMP T05
;如有日期、星期在此处给相应的单元加1
T01: INC MSCONU ;100毫秒计数未到十次,相应单元加1
SJMP T05
T02: MOV A,#01H
ADD A,SECCONU ;秒计数未到60次,相应单元加1
DA A
MOV SECCONU,A
SJMP T05
T03: MOV A,#01H
ADD A,MINCONU ;分计数未到60次,相应单元加1
DA A
MOV MINCONU,A
SJMP T05
T04: MOV A,#01H
ADD A,HOUCONU ;时计数未到24次,相应单元加1
DA A
MOV HOUCONU,A
T05: POP ACC
RETI
;把计数单元的值分解为两BCD码,同时计数数据送入显示缓冲区,
DISRDY: MOV R0,#SECDISL
MOV R1,#SECCONU
MOV R2,#3
DR1: MOV A,@R1
ANL A,#0FH
MOV @R0,A
INC R0
MOV A,@R1
ANL A,#0F0H
SWAP A
MOV @R0,A
INC R0
INC R1
DJNZ R2,DR1
RET
;显示缓冲区的内容送到数码显示器上显示,执行时间约6毫秒
DISPLAY: MOV R0,#SECDISL
MOV R1,#0DCH ;0DCH:字形口地址,ODDH:字位口地址
MOV R2,#6 ;共六个字节
MOV R4,#01H ;先显示低位,即字位初始码
MOV DPTR,#DISTAB;字形表首地址
DPY1: MOV A,@R0
INC R0
MOVC A,@A+DPTR
MOVX @R1,A ;送显示字形码
INC R1 ;修正地址,指向字位口地址
MOV A,R4 ;R4中是字位码
MOVX @R1,A ;送字位码
DEC R1 ;地址改回到字形口地址
RL A ;准备显示下一位
MOV R4,A
ACALL DELAY ;延时子程序
DJNZ R2,DPY1 ;共六位
RET
;延时自程序,约2毫秒
DELAY: MOV R6,#15 ;延时子程序,约15毫秒
DLY1: DJNZ R7,DLY1
DJNZ R6,DLY1
RET
;LED上“8”循环显示程序
LED8: MOV R0,#0DCH ;指向字形口
MOV A,#80H ;确定字形代码
MOVX @R0,A ;输出字形代码
MOV R1,#0DDH ;指向字位口
MOV A,#20H ;从最高位开始
LEDO: MOVX @R1,A ;输出字位代码
MOV R2,#20 ;确定延时常数
ACALL DEYS ;调延时子程序
RL A ;左移一位
SJMP LEDO ;循环演示
;========================
DEYS: MOV R7,#0FFH ;延时子程序
DEY0: DJNZ R7,DEY0
DJNZ R2,DEYS
RET ;返回
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -