📄 2.txt
字号:
;电脑时钟 文件名:clockBCD.ASM
;!开始执行程序前在监控状态,把时钟初值输入到时钟计数单元
;输入BCD码不要超过合理的时间范围!
;以下六个单元为显示缓冲单元
SECDISL EQU 30H ;秒的个位
SECDISH EQU 31H ;秒的十位
;以下四个单元为实时时钟计数单元
MSCONU EQU 36H ;毫秒计数单元
SECCONU EQU 37H ;秒计数单元
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:SETB IT0
MOV MSCONU,#00H ;毫秒计数单元
MOV P1,#0F0H
MOV SECCONU,#10
MOV R5,#01H
MOV SP,#5FH ;主程序
MOV TMOD,#01H ;T0方式1,定时100毫秒
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
SETB ET0
SETB EX0
SETB EA
M1: ACALL DISRDY
;显示准备,把计数单元的值转换为显示缓冲器的值
ACALL DISPLAY
;刷新显示,把显示缓冲单元的值送到LED显示器上
SJMP M1
;T0定时100毫秒中断服务子程序
MOV TH0,#3CH ;TO方式1,重新输入初值
T0INT: PUSH ACC
MOV TL0,#0B0H
MOV A,MSCONU
CJNE A,#10,T01 ;100毫秒计数到十次否?
MOV MSCONU,#00H ;到十次,毫秒计数单元清零
DEC SECCONU
MOV A,SECCONU
MOV B,#0AH
DIV AB
SWAP A
ANL A,#0F0H
MOV @R0 ,A
MOV A,B
ANL A,#0FH
ORL A,@R0
MOV @R1,A
MOV A,SECCONU
CJNE A,#00H,T05 ;秒计数到0否?
MOV A,R5
L1: CJNE A,#04H,L2
MOV SECCONU,#10
MOV P1,#0F0H
MOV P3,#0FFH
MOV R5,#01H
SJMP T05
L2: MOV A,R5
CJNE A,#01H,L3
MOV SECCONU,#3
MOV P1,#0F5H
MOV P3,#0FEH
MOV R5,#02H
SJMP T05
L3: MOV A,R5
CJNE A,#02H,L4
MOV SECCONU,#15
MOV P1,#0FH
MOV P3,#0FFH
MOV R5,#03H
SJMP T05
L4: MOV SECCONU,#5
MOV P1,#0AFH
MOV P3,#0FDH
MOV R5,#04H
SJMP T05
;如有日期、星期在此处给相应的单元加1
T01: INC MSCONU ;100毫秒计数未到十次,相应单元加1
SJMP T05
T05:
POP ACC
RETI
;把计数单元的值分解为两BCD码,同时计数数据送入显示缓冲区,
DISRDY:
MOV R0,#SECDISL
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
RET
;显示缓冲区的内容送到数码显示器上显示,执行时间约6毫秒
DISPLAY:MOV R0,#SECDISL
MOV R1,#0DCH ;0DCH:字形口地址,ODDH:字位口地址
MOV R2,#2 ;共2个字节
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,#2 ;延时子程序,约2毫秒
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
N01: PUSH ACC
MOV SECCONU,#20
MOV A,SECCONU
CJNE A, #00H,T06
T06: MOV P1, #0F0H
MOV P3,#0FFH
MOV R5,#01H
POP ACC
CLR IE0
RETI
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -