📄 2051电子钟程序.asm
字号:
;30h为秒个位,31H秒十位,32H分个位,33分十位,34时个位,35时十位
;储存单位定义
mgw equ 30h
msw equ 31h
fgw equ 32h
fsw equ 33h
sgw equ 34h
ssw equ 35h
mgw1 equ 36h
msw1 equ 37h
fgw1 equ 38h
fsw1 equ 39h
sgw1 equ 3ah
ssw1 equ 3bh
;按键输入定义
k1 equ p3.0 ;按键1引脚定义
K2 equ p3.1 ;按键2引脚定义
;喇叭引脚定义
;spk bit p3.2
;________主程序开始_________
org 0000h
ljmp main
org 000bh
ljmp zd
org 0030h
main:
;acall led
;acall bz ;喇叭
;acall zhsm ;逐行扫描
acall csh ;初始化
acall zh ;转换
ks0:acall sz ;设置
setb tr0 ;开启计数
ks: acall sjjs ;时间计算
acall zh ;转换
acall xs ;送出显示
jnb k1,tc
ajmp ks
tc: mov r3,#255
tc1:acall sjjs
acall zh
acall xs
jb k1,ks
djnz r3,tc1
tc2:acall sjjs
acall zh
acall xs
jnb k1,tc2
clr tr0
ajmp ks0
;cpl p1.7
org 0100h ;中断入口
zd:
push psw ;保护现场
push a
clr tr0 ;计时器关闭
mov th0,#3ch ;存入低位
mov tl0,#0b0h ;存入高位
setb tr0 ;开计时器0
inc 7fh ;秒加1
pop a ;恢复现场
pop psw
reti ;中断返回
;---------时间计算-----------
sjjs:
mov a,7fh
cjne a,#10,a2
mov 7FH,#0
cpl p3.7
inc 72H
mov a,72H
cjne a,#120,a2 ;120/2=60s
mov 72H,#0
inc fgw
jpd3:
mov a,fgw
cjne a,#10,a2 ;分个位满10?没,返回,有则向下执行
mov fgw,#0 ;分个位清0
inc fsw ;分十位加1
jpd4:
mov a,fsw
cjne a,#06,a2 ;分十位满6?没,返回,有则向下执政
mov fsw,#0
inc sgw
jpd5:
mov a,sgw
cjne a,#4,a7 ;时个位满4?有再判断时十位满2?
a6:
mov a,ssw
cjne a,#2,a2
mov sgw,#0
mov ssw,#0
ljmp a2
a7:
cjne a,#10,a2
mov sgw,#0
inc ssw
a2:ret
;------------设置---------
sz:
;cjne a,#1,sz
sz3: acall key ;调用键盘程序,取键值
orl fgw1,#80h ;将高位置1,相当于小数点点亮
acall key
cjne a,#1,sz9 ;如果不为1,跳sz9,或者向下执行
sz4: anl fgw1,#7fh
orl fsw1,#80h
acall key
cjne a,#1,sz10
sz5: anl fsw1,#7fh
orl sgw1,#80h
acall key
cjne a,#1,sz11
sz6: anl sgw1,#7fh
orl ssw1,#80h
acall key
cjne a,#1,sz12
anl ssw1,#7fh
ret
sz9: cjne a,#2,sz3
acall jia3
ajmp sz3
sz10: cjne a,#2,sz4
acall jia4
ajmp sz4
sz11: cjne a,#2,sz5
acall jia5
ajmp sz5
sz12: cjne a,#2,sz6
acall jia6
ajmp sz6
;--------键盘程序--------
key:acall xs ;调显示程序
jnb k1,l1 ;k1按下?有,跳l1,没,则向下执行
jnb k2,l1 ;k2按下?有,跳l1,没,则向下执行
mov a,#0 ;两键都没按,则a置0,返回主程序
ajmp l10
l1: acall xs ;这里主要为消抖用,为提高走时精确
acall xs ;这里主要为消抖用,为提高走时精确
jnb k1,kk1 ;k1按下?有,跳kk1,没,则向下执行
jnb k2,kk2 ;k2按下?有,跳kk2,没,则向下执行
l10:ret ;返回主程序
kk1:
mov a,#1 ;将a置1
acall xs
jnb k1,kk1 ;为下次扫描键用
ajmp l10
kk2:
mov a,#2 ;将a置2
acall xs
jnb k2,kk2
ajmp l10
acall zh
ret
jia3:inc fgw ;分个位加1
acall jpd3 ;调jpd3
acall zh
ret
jia4:inc fsw
acall jpd4
acall zh
ret
jia5:inc sgw
acall jpd5
acall zh
ret
jia6:inc ssw
mov a,ssw
swap a
add a,sgw ;将时个位和时十位相加
cjne a,#24h,jia7 ;是否等于24?是跳jia7
acall zh
ajmp jia8
jia7:acall zh
jnc jia8 ;c为0跳转
ret
jia8:mov sgw,#0
mov ssw,#0
acall zh
ret
;--------程序初始化---------
csh: ; 初始化
mov tmod,#01h
mov th0,#3ch
mov tl0,#0b0h
mov ie,#10000010b
mov sp,#60h
mov dptr,#tab1
mov fgw,#0
mov fsw,#0
mov sgw,#0
mov ssw,#0
mov 7fh,#0
mov 71H,#0
mov 72H,#0
clr p3.7
ret
;---------值转换--------
zh:
mov A,fgw ;分个位转换
MOVC A,@A+DPTR
MOV fgw1,A
mov A,fsw ;分十位转换
MOVC A,@A+DPTR
MOV fsw1,A
mov A,sgw ;时个位转换
MOVC A,@A+DPTR
MOV sgw1,A
mov A,ssw ;时十位转换
MOVC A,@A+DPTR
MOV ssw1,A
ret
;--------显示模块开始--------
xs:
mov p1,fgw1 ;将分个位值送入p1口
clr p3.5 ;将p3.5口清零
acall ys1ms ;延时1ms
setb p3.5 ;将p3.5置1
mov p1,fsw1 ;将分十位的值送入p1口
clr p3.4
acall ys1ms
setb p3.4
mov p1,sgw1
clr p3.3
acall ys1ms
setb p3.3
mov p1,ssw1
clr p3.2
acall ys1ms
setb p3.2
ret
;--------显示程序结束---------
;延时20MS子程序
;计算方法:
;总延时=2us*r4*r6*r5
; =2us*100*100*10
; =200 000us =20ms
ys20ms:
mov r5,#10
dd1:mov r6,#100
dd2:mov r4,#100
dd3:nop
djnz r4,dd3
djnz r6,dd2
djnz r5,dd1
ret
;延时1ms子程序
ys1ms:
mov r5,#1
d1:mov r6,#5
d2:mov r4,#100
d3:nop
djnz r4,d3
djnz r6,d2
djnz r5,d1
ret
tab1:
DB 3fh,06H,5bH,4fH,066H,06dH,7dH,07H,7fH,06fh
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -