📄 zhong.asm
字号:
本程序为详细的时钟程序!
org 0000h
ajmp start ; ;转初始化程序
org 0003h
ajmp terrout0 ;;转外中断0(按键)
org 000bh
ajmp clock0 ; ;转定时中断0
org 0013h
ajmp terrout1 ; ;转外中断1(按键)
org 001bh
ajmp clock1 ; ;转定时中断1
org 0023h
reti ; ;串行中断返回
org 0100h
;;----------- ------------初始化程序---------------------------
start: mov sp, #60h ; ;置堆栈地址
mov r0,#40h ; ;从40~51H共18个单元清零
mov r1,#12h
clear0: mov @r0,#00h
inc r0
djnz r1,clear0
mov tmod,#21h ; ;计数器t1为方式2,计数器0为方式1
mov tl0,#0dch ; ;计数器t1定时125ms
mov th0,#0bh ;
mov tl1,#6h ;;计数器t0定时500us
mov th1,#6h
setb it0
setb it1
mov ip, #2h ; ;定时器T0中断级为最高
mov ie,#8fH ; ;总中断开放
setb tr0 ; ;开启T0定时器
mov 3fH,#08h ; ;T0计数中断次数,8次中断为1秒
setb p3.0 ; ;数码管关闭
setb p3.1
setb p3.4
setb p3.5
mov 47h,#00h ; ;显示时间从12:00开始
mov 48h,#12h ; ;47H为分单元地址,48H为时单元地址
mov 40h,#0h ; ;40H为分低位单元地址
mov 41h,#0h ; ;41H为分高位单元地址
mov 42h,#2h ; ;42H为时低位单元地址
mov 43h,#1h ;;43H为时低位单元地址
;--------------------------------核心程序段-----------
main: mov a,49h ;根据49H单元中的标志字选择显示的子程序
cjne a,#0h,dis1 ;为0就正常显示,否则就跳转
acall normal ;调用正常显示子程序
jmp main
dis1: mov a,49h
cjne a,#1h,dis2 ;为1就调时,否则就跳转
acall sethour ;调用调时子程序
jmp main
dis2: mov a,49h
cjne a,#2h,dis3 ;为2就调分,否则就跳转
acall setmin ;调用调分子程序
jmp main
dis3: mov a,49h
cjne a,#3h,dis4 ;为3就闹钟调时,否则就跳转
acall setclocka ;调用闹钟调时子程序
jmp main
dis4: mov a,49h
cjne a,#4h,main ;为4就闹钟调分,否则就跳转
acall setclockb ;调用闹钟调分子程序
jmp main
;------------------设置闹种的调分显示程序------------------
setclockb: mov a,3fh
cjne a,#5,neq0
neq0: jc lower0 ;亮0.5秒后就熄灭
acall disSet0 ;调用显示闹钟分低位子程序
acall disSet1 ;调用显示闹钟分高位子程序
jmp condis0
lower0: clr p3.5 ;置分低位显示位
mov a ,#0ffh ;熄灭符送给A口
mov p1,a ;灭灯
acall delms ;延时
setb p3.5 ;关闭分低位显示位
clr p3.4 ;置分高位显示位
mov a,#0ffh ;熄灭符送给A口
mov p1,a ;灭灯
acall delms ;延时
condis0: acall dispoint ;调用小数点闪烁子程序
acall disSet2 ;调用显示闹钟时低位子程序
acall disSet3 ;调用显示闹钟时高位子程序
mov a,49h
cjne a,#4h,endsetclock0
jmp setclockb
endsetclock0: ret
;;------------------设置闹种的调时显示程序------------------
setclocka: acall disSet0 ;调用显示闹钟分低位子程序
acall disSet1 ;调用显示闹钟分高位子程序
acall dispoint ;调用小数点闪烁子程序
mov a,3fh
cjne a,#5,neq1
neq1: jc lower1 ;亮0.5秒后就熄灭
acall disSet2 ;调用显示闹钟时低位子程序
acall disSet3 ;调用显示闹钟时高位子程序
jmp condis1
lower1: clr p3.1 ;置时低位显示位
mov a,#0ffh ;熄灭符送给A口
mov p1,a ;灭灯
acall delms ;延时
setb p3.1 ;关闭时低位显示位
clr p3.0 ;置时高位显示位
mov a,#0ffh ;熄灭符送给A口
mov p1,a ;灭灯
acall delms ;延时
setb p3.0 ;关闭时高位显示位
condis1: mov a,3fh
cjne a,#3h,endsetclock1
jmp setclocka
endsetclock1: ret
;;------------------ -------设置调分钟显示程序------------------------
setmin: mov a,3fh
cjne a,#5,neq2
neq2: jc lower2 ;亮0.5秒后就熄灭
acall display0 ;调用显示分低位子程序
acall display1 ;调用显示分高位子程序
jmp condis2
lower2: clr p3.5
mov a,#0ffh ;熄灭符送给A口
mov p1,a
acall delms
setb p3.5
clr p3.4
mov a,#0ffh
mov p1,a
acall delms
setb p3.4
condis2: acall dispoint ;调用小数点闪烁子程序
acall display2 ;调用显示时低位子程序
acall display3 ;调用显示时高位子程序
mov a,49h
cjne a,#2h,endmin
jmp setmin
endmin: ret
;------------------ -------设置调时钟显示程序------------------------
sethour: acall display0 ;显示分低位
acall display1 ;显示分高位
acall dispoint ;调用小数点闪烁子程序
mov a,3fh
cjne a,#5,neq3
neq3: jc lower3
acall display2 ;显示时低位
acall display3 ;显示时高位
jmp condis3
lower3: setb p3.4
clr p3.1
mov a,#0ffh ;熄灭符送给A口
mov p1,a
acall delms
setb p3.1
clr p3.0
mov a,#0ffh
mov p1,a
setb p3.0
acall delms
condis3: mov a,49h
cjne a,#1h,endhour
jmp sethour
endhour: ret
;------------------ -------正常的时候显示程序------------------------
normal: acall display0 ;显示分低位
acall display1 ;显示分高位
acall dispoint ;调用小数点闪烁子程序
acall display2 ;显示时低位
acall display3 ;显示时高位
mov a,49h
cjne a,#0h,endnor
jmp normal
endnor: ret
;------------------------ 显示分低位程序-------------------------------------
display0: clr p3.5 ;显示分低位;
mov r1,#40H
mov a,@r1 ;取显示数据到A
mov dptr,#tab
movc a,@a+DPTR ;查显示数据对应段码
mov p1,a
acall delms
ret
display1: setb p3.5 ;显示分高位
clr p3.4
mov r1,#41h
mov a,@r1 ;取显示数据到A
movc a,@a+dptr ;查显示数据对应段码
mov p1,a
acall delms
ret
display2: setb p3.4 ;显示时低位
clr p3.1
mov r1,#42h
mov a,@r1 ;取显示数据到A
movc a,@a+dptr ;查显示数据对应段码
mov p1,a
acall delms
ret
display3: setb p3.1 ;显示时高位
clr p3.0
mov r1,#43H
mov a,@r1 ;取显示数据到A
movc a,@a+dptr ;查显示数据对应段码
mov p1,a
acall delms
setb p3.0
ret
dispoint: mov a,3fh ;小数点闪烁显示
cjne a,#5,neq4
neq4: jc lower4
mov a,#0ffh
mov p1,a
setb p3.4
setb p3.1
acall delms
jmp endpoint
lower4: mov a,#7fh
mov p1,a
clr p3.4
clr p3.1
acall delms
setb p3.4
setb p3.1
endpoint: ret
delms: mov r7,#0ffH ;延时子程序
delms1: djnz r7,delms1
ret
tab: db 88h,0bbh,94h,91h,0a3h,0c1h,0c0h,9bh,80h,81h
;;---------------------------- 时钟时、分、秒加1程序---------------------------
clock0: orl tl0,#0dch ;定时器0中断子程序
mov th0,#0bh
push psw
push acc
mov psw,#8h ;置寄存器组1为当前寄存器组
djnz 3fH,ptfr0 ;没到1秒就退出,继续定时
mov 3fH,#08H ;到1秒重新置中断次数
mov r0,#46H ;秒单元(46H)加1
mov a,@r0
add a,#1
da a
mov @r0,a
cjne a,#60H,ptfr0 ;没到60秒就退出
mov @r0,#0h ;到60秒就秒单元复位
inc r0 ;分单元(47H)加1
mov a,@r0
add a,#1
da a
mov @r0,a ;分单元拆为高、低两部分BCD码
anl a,#0fh
mov 40h,a ;分低位单元(40H)
mov a,@r0
swap a
anl a,#0fh
mov 41h,a ;分高位单元(41H)
acall alarmstart ;测试是否该闹铃
acall alarmclose ;关闹铃
mov a,@r0
cjne a,#60H,ptfr0 ;没到60分就退出
mov @r0,#0 ;到60分分单元就置0
mov 40h,#0h
mov 41h,#0h
inc r0 ;时单元(48H)加1
mov a,@r0
add a,#1
da a
mov @r0,a ;时单元拆为高、低两部分BCD码
anl a,#0fh
mov 42h,a ;时低位单元(42H)
mov a,@r0
swap a
anl a,#0fh
mov 43h,a ;时高位单元(43H)
acall alarmstart ;测试是否该闹铃
mov a,@r0
cjne a,#24h,ptfr0 ;没到24时就退出
mov @r0,#0 ;到24时就时单元置0
mov 42h,#0
mov 43h,#0
ptfr0: pop acc ;中断返回
pop psw
reti
;----------------- -外中断0用来设置功能选项-----------
terrout0: push psw
push acc
call delms
jnb p3.2,d2
pop acc
pop psw
reti
d2: clr ex0
mov a,49h
add a,#1h
da a
mov 49h,a
cjne a,#5h,clear
clear: jc return
mov a,#0h
mov 49h,a
return: acall delay
setb ex0
pop acc
pop psw
reti
;------------------------------外中断1用来对相应的单元内容加1
terrout1:push psw
push acc
acall testclock
call delms
jnb p3.3, d1
pop acc
pop psw
reti
d1: mov a,49h
cjne a,#1h,con1
mov a,48h
add a,#1h
da a
mov 48h,a
anl a,#0fh
mov 42h,a
mov a,48h
swap a
anl a,#0fh
mov 43h,a
mov a, 48h
cjne a,#24h,return1
mov 48h,#0h
mov 42h,#0h
mov 43h,#0h
ajmp return1
con1: mov a,49h
cjne a,#2h,con2
mov a,47h
add a,#1h
da a
mov 47h,a
anl a,#0fh
mov 40h,a
mov a,47h
swap a
anl a,#0fh
mov 41h,a
mov a,47h
cjne a,#60h,return1
mov 47h,#0h
mov 41h,#0h
ajmp return1
con2: mov a,49h
cjne a,#3h,con3
mov a,4bh
add a,#1h
da a
mov 4bh,a
anl a,#0fh
mov 4fh,a
mov a,4bh
swap a
anl a,#0fh
mov 50h,a
mov a,4bh
cjne a,#24h,return1
mov 4bh,#0h
mov 4fh,#0h
mov 50h,#0h
ajmp return1
con3: mov a,49h
cjne a,#4h,return1
mov a,4ah
add a,#1h
da a
mov 4ah,a
anl a,#0fh
mov 4dh,a
mov a,4ah
swap a
anl a,#0fh
mov 4eh,a
mov a,4ah
cjne a,#60h,return1
mov 4ah,#0h
mov 4eh,#0h
ajmp return1
return1: acall delay
pop acc
pop psw
reti
;;---------------------闹种响铃程序,频率2000Hz
clock1: cpl p3.2
reti
;;--------------------------闹钟开始操作
alarmstart: mov a,47h
cjne a,4ah,endalarm
mov a,48h
cjne a,4bh,endalarm
mov 4ch,#1h ;设置标志位,1表示闹钟已开
clr ex0 ;关闭外中断0
setb tr1
endalarm: ret
;;---------------------------闹种结束操作
alarmclose: mov a,4ch
cjne a,#1,endalarm1
mov a,4ah
add a,#1h
da a
cjne a,47h,endalarm1
clr tr1
setb p3.2
setb ex0
mov 49h,#0h
mov 4ch,#0h
endalarm1: ret
;;--------------------------------------设置闹钟时间显示程序
disset0: clr p3.5
mov r1,#4dh ;显示分低位
mov a,@r1 ;取显示数据到A
mov dptr,#tab
movc a,@a+dptr ;查显示数据对应段码
mov p1,a
acall delms
ret
disset1: setb p3.5 ;显示分高位
clr p3.4
mov r1,#4eh
mov a,@r1 ;取显示数据到A
movc a,@a+dptr ;查显示数据对应段码
mov p1,a
acall delms
ret
disset2: setb p3.4
clr p3.1
mov r1,#4fh
mov a,@r1 ;取显示数据到A
movc a,@a+dptr ;查显示数据对应段码
mov p1,a
acall delms
ret
disSet3: setb p3.1
clr p3.0
mov r1,#50H
mov a,@r1 ;取显示数据到A
movc a,@a+dptr ;查显示数据对应段码
mov p1,a
acall delms
setb p3.0
ret
delay: mov r5,#0a0H
delay1: mov r4,#0ffh
ddd: djnz r4,ddd
djnz r5,delay1
ret
testclock: mov a,4ch
cjne a,#1h,testend
clr tr1
setb p3.2
setb ex0
mov 4ch,#0h
mov 49h,#0h
testend: ret
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -