📄 clock.asm
字号:
sec data 51h ;定义秒计数器使用内存区。
min data 53h ;定义分计数器使用内存区。
hou data 55h ;定义时计数器使用内存区。
;***************************************************
org 0000h
ajmp main
org 000bh
ljmp time ;调用计时中断子程序
org 0100h
main: mov sp,#60h ;初始化堆栈
mov tmod,#01h ;使用tr0的十六位无分频模式
mov th0,#04h ;初始化定时器的溢出时间为50ms
mov tl0,#00h
setb ea ;启用全局中断
setb et0 ;启用定时器0中断
setb tr0 ;启用定时器0
mov r0,#14h ;初始化定时计数为20
mov r1,#00h
mov r6,#0ah
mov r7,#0ah
;cpl p1.1
mov sec,#00h ;初始化秒钟计数器
mov min,#00h ;初始化分钟计数器
mov hou,#00h ;初始化时钟计数器
;******************************************************
dusp: ;扫描并显示秒钟的个位
mov dptr,#tab1 ;获得表1首地址
mov a,sec ;提取当前秒数
movc a,@a+dptr ;查表找字符
mov p0,a ;输出
mov p2,#11111110b ;关闭其他位,点亮秒钟个位
lcall ysh2s ;延时(如果显示抖动,则时间应继续减小)
;扫描并显示秒钟的十位
mov dptr,#tab2
mov a,sec
movc a,@a+dptr
mov p0,a
mov p2,#11111101b
lcall ysh2s
;扫描并显示隔断
mov p0,#10111111b
mov p2,#11111011b
lcall ysh2s
;扫描并显示分钟的个位
mov dptr,#tab1
mov a,min
movc a,@a+dptr
mov p0,a
mov p2,#11110111b
lcall ysh2s
;扫描并显示分钟的十位
mov dptr,#tab2
mov a,min
movc a,@a+dptr
mov p0,a
mov p2,#11101111b
lcall ysh2s
;扫描并显示隔断
mov p0,#10111111b
mov p2,#11011111b
lcall ysh2s
;扫描并显示时钟的个位
mov dptr,#tab1
mov a,hou
movc a,@a+dptr
mov p0,a
mov p2,#10111111b
lcall ysh2s
;扫描并显示时钟的十位
mov dptr,#tab2
mov a,hou
movc a,@a+dptr
mov p0,a
mov p2,#01111111b
;mov a,#10111111b
;mov p0,a
lcall ysh2s
jnb p3.4,key34 ;开关k4按下则跳转
jnb p3.5,key35 ;开关k3按下则跳转
jnb p3.6,key36 ;开关k2按下则跳转
jnb p3.7,key37 ;开关k1按下则跳转
ajmp dusp ;转到程序的主循环体
;*********************************************************************
;使用开关进行时钟分钟的调整
key34: jnb et0,key34_
clr et0 ;停止定时器中断
clr ea ;关闭全局中断
mov r6,#0bh ;控制其它键,允许按下产生动作
ljmp dusp
ret
key34_: mov r6,#0ah ;禁用key16,key15两键工作
setb et0 ;启用定时器0
setb ea ;开启全局中断
ljmp dusp
ret
;*********************************************************************
key35: cjne r6,#0bh,key35_ ;判断k4是否按下,没按下则跳转
inc hou ;按下则增加时钟
acall disp ;呼叫延时
mov r1,hou
cjne r1,#18h,key35_ ;判断时钟是否为24
mov hou,#00h ;是,则归零
key35_: ljmp dusp
ret
;**********************************************************************
key36: cjne r6,#0bh,key36_
inc min
acall disp
mov r1,min
cjne r1,#3ch,key36_
mov min,#00h
key36_: ljmp dusp
ret
;***********************************************************************
key37: cjne r6,#0bh,key37_
inc sec
acall disp
mov r1,sec
cjne r1,#3ch,key37_
mov sec,#00h
key37_: ljmp dusp
ret
;*********************************************************************
;延时子程序
ysh2s: mov r3,#01h
loop2: mov r4,#05h
loop21: mov r5,3fh
djnz r5,$
djnz r4,loop21
djnz r3,loop2
ret
;**********************************************************************
;计时子程序 入口参数 sec min hou 出口参数同样 参数传递给字符显示程序
;********************************************************************
time4: ;每秒计时一次
cpl p3.3 ;p1.0清零
inc sec ;秒针加一
mov r1,sec
cjne r1,#3ch,time5 ;判断秒针是否为60
mov sec,#00h ;是则秒针清零
inc min ;分针加一
;setb p1.1
mov r1,min
cjne r1,#3ch,time5 ;判断分针是否为60
mov min,#00h ;是则分针清零
inc hou ;时钟加一
mov r1,hou
cjne r1,#18h,time5 ;判断时钟是否为24
mov hou,#00h ;是则时钟清零
time5: ret
;*******************************************************************
;调时时调用的显示子程序
;*******************************************************************
disp:
mov dptr,#tab1 ;获得表1首地址
mov a,sec ;提取当前秒数
movc a,@a+dptr ;查表找字符
mov p0,a ;输去
mov p2,#11111110b ;关闭其他位,点亮秒钟个位
lcall ysh2s ;延时(如果显示抖动,则时间应继续减小)
;扫描并显示秒钟的十位
mov dptr,#tab2
mov a,sec
movc a,@a+dptr
mov p0,a
mov p2,#11111101b
lcall ysh2s
;扫描并显示隔断
mov p0,#10111111b
mov p2,#11111011b
lcall ysh2s
;扫描并显示分钟的个位
mov dptr,#tab1
mov a,min
movc a,@a+dptr
mov p0,a
mov p2,#11110111b
lcall ysh2s
;扫描并显示分钟的十位
mov dptr,#tab2
mov a,min
movc a,@a+dptr
mov p0,a
mov p2,#11101111b
lcall ysh2s
;扫描并显示隔断
mov p0,#10111111b
mov p2,#11111011b
lcall ysh2s
;扫描并显示时钟的个位
mov dptr,#tab1
mov a,hou
movc a,@a+dptr
mov p0,a
mov p2,#10111111b
lcall ysh2s
;扫描并显示时钟的十位
mov dptr,#tab2
mov a,hou
movc a,@a+dptr
mov p0,a
mov p2,#01111111b
; mov a,#10111111b
; mov p0,a
lcall ysh2s
djnz r7,disp
mov r7,#0ah
ret
;*************************************************************************************
;中断服务子程序
;***************************************************************************************
time: clr et0 ;关闭定时其零中断
clr tr0 ;关闭定时器零
mov th0,#4ch ;定时器赋初值
mov tl0,#00h
djnz r0,time2 ;判断20次技术是否完成
lcall time4 ;完成则进入时间子程序
mov r0,#14h
time2: setb tr0
setb et0
reti
;***************************************************************************************
tab1:
db 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h,080h,090h;
db 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h,080h,090h;
db 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h,080h,090h;
db 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h,080h,090h;
db 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h,080h,090h;
db 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h,080h,090h;
tab2: db 0c0h,0c0h,0c0h,0c0h,0c0h,0c0h,0c0h,0c0h,0c0h,0c0h;
db 0f9h,0f9h,0f9h,0f9h,0f9h,0f9h,0f9h,0f9h,0f9h,0f9h;
db 0a4h,0a4h,0a4h,0a4h,0a4h,0a4h,0a4h,0a4h,0a4h,0a4h;
db 0b0h,0b0h,0b0h,0b0h,0b0h,0b0h,0b0h,0b0h,0b0h,0b0h;
db 099h,099h,099h,099h,099h,099h,099h,099h,099h,099h;
db 092h,092h,092h,092h,092h,092h,092h,092h,092h,092h;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -