?? time_02.asm
字號(hào):
org 0000h
ljmp start
org 0003h
ljmp ex_int0
org 000bh
ljmp intt0
org 0013h
ljmp set_time
org 0050h
;中斷服務(wù)程序;
;;;;;;;;;;;;;;;;;;;;;;;
;;;1s計(jì)時(shí)程序
;;;;;;;;;;;;;;;;;;;;;;;;
intt0: push acc ;累加器入棧保護(hù)
push psw ;狀態(tài)字入棧保護(hù)
clr et0 ;關(guān)t0中斷允許
clr tr0 ;關(guān)閉定時(shí)器t0
mov a,#0b7h ;中斷響應(yīng)時(shí)間同步修正
add a,tl0 ;低8位初值修正
mov tl0,a ;重裝初值(低8位修正值)
mov a,#3ch ;高8位初值修正
addc a,th0 ;
mov th0,a ;重裝初值(高8位修正值)
setb tr0 ;開啟定時(shí)器t0
djnz r4, outt0 ;20次中斷未到中斷退出
addss: mov r4,#14h ;20次中斷到(1秒)重賦初值
mov r0,#71h ;指向秒計(jì)時(shí)單元(71h-72h)
acall add1 ;調(diào)用加1程序(加1秒操作)
mov a,r3 ;秒數(shù)據(jù)放入a(r3為2位十進(jìn)制數(shù)組合)
clr c ;清進(jìn)位標(biāo)志
cjne a,#60h,addmm ;
addmm: jc outt0 ;小于60秒時(shí)中斷退出
acall clr0 ;大于或等于60秒時(shí)對(duì)秒計(jì)時(shí)單元清0
mov r0,#77h ;指向分計(jì)時(shí)單元(76h-77h)
acall add1 ;分計(jì)時(shí)單元加1分鐘
mov a,r3 ;分?jǐn)?shù)據(jù)放入a
clr c ;清進(jìn)位標(biāo)志
cjne a,#60h,addhh ;
addhh: jc outt0 ;小于60分時(shí)中斷退出
acall clr0 ;大于或等于60分時(shí)分計(jì)時(shí)單元清0
mov r0,#79h ;指向小時(shí)計(jì)時(shí)單元(78h-79h)
acall add1 ;小時(shí)計(jì)時(shí)單元加1小時(shí)
setb p3.7
lcall dl1s
lcall dl1s
lcall dl1s
lcall dl1s
clr p3.7
mov a,r3 ;時(shí)數(shù)據(jù)放入a
clr c ;清進(jìn)位標(biāo)志
cjne a,#24h,hour ;
hour: jc outt0 ;小于24小時(shí)中斷退出
acall clr0 ;大于或等于24小時(shí)小時(shí)計(jì)時(shí)單元清0
outt0: mov 72h,76h ;中斷退出時(shí)將分、時(shí)計(jì)時(shí)單元數(shù)據(jù)移
mov 73h,77h ;入對(duì)應(yīng)顯示單元
mov 74h,78h ;
mov 75h,79h ;
pop psw ;恢復(fù)狀態(tài)字(出棧)
pop acc ;恢復(fù)累加器
setb et0 ;開放t0中斷
reti ;中斷返回
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 時(shí)間調(diào)整中斷服務(wù)程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
set_time: push acc ;累加器入棧保護(hù)
push psw ;狀態(tài)字入棧保護(hù)
clr ET0 ;關(guān)定時(shí)器T0中斷
clr TR0 ;關(guān)閉定時(shí)器T0
LCALL DL01S ;調(diào)用1秒延時(shí)程序
jb p3.0,set_m
mov a,#79h
mov r0,a
lcall add1
;LCALL DISPLAY
;lcall DL01S
mov a,r3
clr c
cjne a,#24h,next
next: jc out
mov r3,#79h
lcall clr0
ljmp out
set_m : jb p3.1,set_s
mov a,#77h
mov r0,a
lcall add1
; lcall DL01S
;LCALL DISPLAY
mov a,r3
clr c
cjne a,#60h,next1
next1: jc out
mov r3,#77h
lcall clr0
ljmp out
set_s : jb p3.5,out
mov a,#71h
mov r0,a
lcall add1
mov a,r3
clr c
cjne a,#60h,next2
next2: jc out
mov r3,#71h
lcall clr0
;lcall DL01S
;LCALL DISPLAY
out: MOV 72H,76H ;
MOV 73H,77H ;
MOV 74H,78H ;
MOV 75H,79H ;
setb ET0 ;開定時(shí)器T0中斷
setb TR0 ;開定時(shí)器T0
pop psw ;恢復(fù)狀態(tài)字(出棧)
pop acc ;恢復(fù)累加器
reti
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;鬧鐘設(shè)置程序;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ex_int0: push acc ;累加器入棧保護(hù)
push psw ;狀態(tài)字入棧保護(hù)
clr et0
clr tr0
ljmp $
setb et0
setb tr0
pop psw ;恢復(fù)狀態(tài)字(出棧)
pop acc ;恢復(fù)累加器
reti
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;主程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
start : clr p3.7 ;蜂鳴器不叫
MOV R0,#70H ;清70H-7AH共11個(gè)內(nèi)存單元
MOV R7,#0BH
CLEARD: MOV @R0,#00H ;
INC R0 ;
DJNZ R7,CLEARD ;
MOV 20H,#00H ;清20H(標(biāo)志用)mov r2,#20
mov tmod,#11h ;設(shè)t0、t1為16位定時(shí)器
mov tl0,#0b0h ;50ms定時(shí)初值(t0計(jì)時(shí)用)
mov th0,#3ch ;50ms定時(shí)初值
setb ea ;總中斷開放
setb ex1
setb et0 ;允許t0中斷
setb tr0 ;開啟t0定時(shí)器
mov r4,#20 ;20*50ms
START1: LCALL DISPLAY ;調(diào)用顯示子程序
JNB P3.4,start ;P3.5口為0時(shí)轉(zhuǎn)時(shí)間調(diào)整程序
SJMP START1 ;P3.5口為1時(shí)跳回START1
set_time1: LJMP set_time ;轉(zhuǎn)到時(shí)間調(diào)整程序SETMM
;子程序
; 顯示數(shù)據(jù)在70H-75H單元內(nèi),用六位LED共陽數(shù)碼管顯示,P1口輸出段碼數(shù)據(jù),P3口作
; 掃描控制,每個(gè)LED數(shù)碼管亮1MS時(shí)間再逐位循環(huán)。
DISPLAY: MOV R1,#70H ;指向顯示數(shù)據(jù)首址
MOV R5,#0FEH ;掃描控制字初值
PLAY: MOV A,R5 ;掃描字放入A
MOV P2,A ;從P2口輸出
MOV A,@R1 ;取顯示數(shù)據(jù)到A
MOV DPTR,#TAB ;取段碼表地址
MOVC A,@A+DPTR ;查顯示數(shù)據(jù)對(duì)應(yīng)段碼
MOV P1,A ;段碼放入P1口
LCALL DL1MS ;顯示1MS
INC R1 ;指向下一地址
MOV A,R5 ;掃描控制字放入A
JNB ACC.5,ENDOUT ;ACC.5=0時(shí)一次顯示結(jié)束
RL A ;A中數(shù)據(jù)循環(huán)左移
MOV R5,A ;放回R5內(nèi)
AJMP PLAY ;跳回PLAY循環(huán)
ENDOUT: SETB P2.5 ;一次顯示結(jié)束,P3口復(fù)位
MOV P0,#0FFH ;P1口復(fù)位
RET ;子程序返回
tab: db 00111111b, 00000110b, 01011011b, 01001111b, 01100110b, 01101101b, 01111101b, 00000111b, 01111111b, 01101111b
;共陰顯示 "0"" 1"" 2" " 3" "4" "5" "6" "7" "8" "9""不亮"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 加1子 程 序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
add1: mov a,@r0 ;取當(dāng)前計(jì)時(shí)單元數(shù)據(jù)到a
dec r0 ;指向前一地址
swap a ;a中數(shù)據(jù)高四位與低四位交換
orl a,@r0 ;前一地址中數(shù)據(jù)放入a中低四位
add a,#01h ;a加1操作
da a ;十進(jìn)制調(diào)整
mov r3,a ;移入r3寄存器
anl a,#0fh ;高四位變0
mov @r0,a ;放回前一地址單元
mov a,r3 ;取回r3中暫存數(shù)據(jù)
inc r0 ;指向當(dāng)前地址單元
swap a ;a中數(shù)據(jù)高四位與低四位交換
anl a,#0fh ;高四位變0
mov @r0,a ;數(shù)據(jù)放入當(dāng)削地址單元中
ret ;子程序返回
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 清零程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;對(duì)計(jì)時(shí)單元復(fù)零用
CLR0: CLR A ;清累加器
MOV @R0,A ;清當(dāng)前地址單元
DEC R0 ;指向前一地址
MOV @R0,A ;前一地址單元清0
RET ;子程序返回
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 延時(shí)程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;1MS延時(shí)程序,LED顯示程序用
DL1MS: MOV R6,#14H
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
;延時(shí)0.1s程序
dl01s: MOV R3,#10H
dl01: LCALL DISPLAY
DJNZ R3,dl01
RET
;延時(shí)程序,用作按鍵時(shí)間的長短判斷
DL1S: LCALL DL05S
LCALL DL05S
RET
DL05S: MOV R3,#20H ;8毫秒*32=0.196秒
DL05S1: LCALL DISPLAY
DJNZ R3,DL05S1
RET
end
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -