📄 clock.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;实例七:时钟 clock
;
;现象:当系统上电复位时,时钟开始走时
;
;作者:杨欣,刘长焕,张延强 电路飞翔网 eedesign@163.com
;
; http://www.circuitfly.com
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 00H ; 起始地址00H
JMP MAIN ; 跳转到MAIN
ORG 0BH ; Timer 0中断向量地址
JMP TIM0 ; 跳转到TIM0
; 这里是主程序段,使能中断、装载计数初始值等
MAIN:
MOV IE, #82H ; 使能Timer 0中断
MOV TMOD, #01H ; 使用Timer 0工作在模式1下
MOV TH0, #0F0H ; 装载计数初始值,每4ms中断一次
MOV TL0, #60H ;
MOV R0, #00H ; Timer 0的中断计数器
MOV 30H, #00H ; 秒的计数器
MOV 31H, #00H ; 分的计数器
MOV 32H, #00H ; 时的计数器
MOV R1, #00H ; 6位七段数码管扫描计数器
SETB TR0 ; 启动Timer 0中断
JMP $
; 这里是Timer 0中断服务子程序,用于秒、分、时计时及扫描显示
TIM0:
PUSH ACC ; ACC压栈
CJNE R0, #250, SCAN ; 如果R0≠250,即不到1秒,跳到SCAN
MOV A, 30H ; 如果到1秒,将30H中的"秒"载入ACC
ADD A, #1 ; ACC加1
DA A ; 十进制调整
MOV 30H, A ; "秒"存回30H
CJNE A, #60H, INC_SEC ; 如R1≠60,说明不到1分钟,跳到INC_SEC
MOV A, 31H ; 如果到1分钟,将31H中的"分"载入ACC
ADD A, #1 ; ACC加1
DA A ; 十进制调整
MOV 31H, A ; "分"存回ACC
CJNE A, #60H, INC_MIN ; 如R2≠60,说明不到1小时,跳到INC_MIN
MOV A, 32H ; 如果到1小时,将32H中的"时"载入ACC
ADD A, #1 ; ACC加1
DA A ; 十进制调整
MOV 32H, A ; "时"存回ACC
CJNE A, #24H, INC_HR ; 如A≠24,说明不到24个小时,跳到INC_HR
MOV 30, #00H ; 如果到24小时,则"秒"、"分"、"时"清0
MOV 31, #00H ;
MOV 32, #00H ;
INC_SEC:
JMP INC_TIM ; 跳到INC_TIM
INC_MIN:
MOV 30H, #00H ; "秒"清0
JMP INC_TIM ; 跳到INC_TIM
INC_HR:
MOV 30H, #00H ; "秒"清0
MOV 31H, #00H ; "分"清0
INC_TIM:
MOV R0, #00H ; R0清0
; 以下程序段是扫描6位七段数码管的程序
SCAN:
CJNE R1, #6, DISPLAY ; 如果扫描计数器R1≠6,则跳到DISPLAY
MOV R1, #00H ; 如果R1=6,说明已经扫描完6位
JMP SCAN ; 跳到SCAN
DISPLAY:
CJNE R1, #0, CHK_1 ; 如果R1≠0,跳到CHK_1
; 如果R1=0,选中的是最低位的数码管D1
MOV A, 30H ; 将"秒"载入ACC
MOV P0, #01H ;
JMP RELOAD ; 跳到RELOAD
CHK_1:
CJNE R1, #1, CHK_2 ; 如果R1≠1,跳到CHK_2
; 如果R1=1,选中的是七段数码管D2
MOV A, 30H ; 将"秒"载入ACC
SWAP A ; ACC的高、低位字节交换
MOV P0, #02H ;
JMP RELOAD ; 跳到RELOAD
CHK_2:
CJNE R1, #2, CHK_3 ; 如果R1≠2,跳到CHK_3
; 如果R1=2,选中的是七段数码管D3
MOV A, 31H ; 将"分"载入ACC
MOV P0, #04H ;
JMP RELOAD ; 跳到RELOAD
CHK_3:
CJNE R1, #3, CHK_4 ; 如果R1≠3,跳到CHK_4
; 如果R1=3,选中的是七段数码管D4
MOV A, 31H ; 将"分"载入ACC
SWAP A ; ACC的高、低位字节交换
MOV P0, #08H ;
JMP RELOAD ; 跳到RELOAD
CHK_4:
CJNE R1, #4, CHK_5 ; 如果R1≠4,跳到CHK_5
; 如果R1=4,选中的是七段数码管D5
MOV A, 32H ; 将"时"载入ACC
MOV P0, #10H ;
JMP RELOAD ; 跳到RELOAD
CHK_5:
CJNE R1, #5, RELOAD ; 如果R1≠5,跳到RELOAD
; 如果R1=5,选中的是最高位的数码管D6
MOV A, 32H ; 将"时"载入ACC
SWAP A ; ACC的高、低位字节交换
MOV P0, #20H ;
RELOAD:
MOV P2, A ; ACC数据从P1口送出显示
INC R0 ; 4ms延时计数器加1
INC R1 ; 扫描计数器R1加1
MOV TH0, #0F0H ; 装载计数初始值,4ms延时
MOV TL0, #60H ;
POP ACC ; ACC弹栈
RETI ; 返回主程序
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -