?? 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 + -