📄 dzb.asm
字号:
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0_INT
ORG 0100H
MAIN: MOV DPTR,#4003H ;初始化8255
MOV A,#80H
MOVX @DPTR,A
MOV TMOD,#01H ;设T0和IE
MOV IE,#82H
MOV TL0,#0B0H ;定时100ms
MOV TH0,#3CH
MOV R1,#0 ;时
MOV R2,#0 ;分
MOV R3,#0 ;100ms计时用
MOV R4,#0 ;秒
set_time: acall display
mov p1,#0f0h ;初始化P1口 则p1.6=1蜂鸣器不响 p1.0和p1.1=0不调时
judge: jb p1.2,time ;P1.2=1启动电子表
; =0设时间
set_fen: jnb P1.1,set_shi ;p1.1!=1去调小时
acall delay100ms ;延时100ms可以加长判断时间
jnb p1.1,set_shi
inc r2
mov a,r2
subb a,#60
jz shi_add
ajmp set_time
shi_add: acall bell ;整点响铃报时
inc r1 ;小时加一
mov r2,#0 ;分钟清零
mov a,r1
subb a,#24
jz clr_shi
ajmp set_time
set_shi: jnb p1.0,set_time
acall delay100ms ;延时100ms可以加长判断时间
jnb p1.0,set_time
inc r1
mov a,r1
subb a,#24
jz clr_shi
ajmp set_time
clr_shi: mov r1,#0
ajmp set_time
time: acall display
setb tr0 ;启动定时器
here: sjmp judge ;再判断P1.2
sjmp here
;中断子程序
T0_INT:
push acc
push psw
clr tr0
mov ie,#0
mov tl0,#0b0h
mov th0,#3ch
inc r3
mov a,r3
cjne a,#10,reti1
mov r3,#0 ;秒到
acall ss ;分钟闪烁
inc r4
mov a,r4
cjne a,#60,reti1
mov r4,#0 ;分到
inc r2
mov a,r2
cjne a,#60,reti1
acall bell ;整点响铃报时
mov r2,#0 ;时到
inc r1
mov a,r1
cjne a,#24,reti1
mov r1,#0 ;24时到
reti1: setb tr0
mov ie,#82h
pop psw
pop acc
reti ;中断返回
;显示子程序
display: mov a,r1 ;时
jz shi_BCD ;A=0转换
subb a,#24 ;A!=0则和24比
jnz shi_BCD ;!=24转换
mov r1,#0 ;=24 则r1<=0
shi_BCD: mov a,r1
mov b,#10
div ab
swap a
orl a,b
mov dptr,#4000h
movx @dptr,a
inc dptr
;========
mov a,r2 ;分
jz fen_BCD
subb a,#60
jnz fen_BCD
mov r2,#0
fen_BCD: mov a,r2
mov b,#10
div ab
swap a
orl a,b
movx @dptr,a
ret
;响铃子程序
bell: MOV R5,#100 ;10s记时用
clr p1.6
tt: acall delay100ms
djnz r5,tt
setb p1.6
ret
;延时子程序
delay100ms: mov r6,#250
loop: mov r7,#198
loop1: djnz r7,loop1
djnz r6,loop
ret
;闪烁子程序
ss: mov a,#0afh
mov dptr,#4001h
movx @dptr,a
acall delay100ms
acall delay100ms
acall delay100ms
acall delay100ms
acall fen_BCD ;调时结束转为电子钟时,分钟转换
ret
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -