;20h.1半點標示位
;20H.2鬧鐘設置中........標示,為了顯示區別用
;20H.3鬧鐘設置時間CHECK到,使能標誌位
;20H.5開/關鬧鐘設置中........標示;
;20H.6鬧鐘1開關標誌位
;20H.7鬧鐘2開關標誌位
;psw.5用來做顯示開關標誌位
;21,22,23,24這裏設置第壹個鬧鐘的時間
;25,26,27,28這裏設置第二個鬧鐘的時間
;29H
;P0口輸出數碼管段碼,
;P2口 輸出位選信號
;70H存放P1.0--3按鈕值,
;71H--78H存放當前系統定時時間;
;78H 77H 76H 75H 74H 73H 72H 71H
; 星期* 小時 分鐘 秒鐘
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ts equ 24h ;這裏設置`24小時周期制
trr equ #0bbh ;這個是溫度,晶振等的時間補償值,
org 0000h ;定時太慢此值調大,定時太快調小;
jmp main
;org 0bh ;定時器0中斷入口矢量
;jmp bz
org 1bh ;定時器1中斷入口矢量
jmp t1int
org 0100h ;主程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;主程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
main:clr p3.0; ;關繼電器
mov sp,#30h
mov r3,#20
mov tmod,#10h
;mov tl0,#06h ;定時器1,方式1,定時 50 MS;
;mov th0,#06h
mov tl1,#0b0h
mov th1,#3ch
mov ie,#88h ;開定時器1中斷
;mov 65h,#5
; mov 66h,#100
;mov 64h,#4
;clr psw.5
clr p3.0
setb pt1 ;設置T1為高優先級中斷
;setb tr1
clr tr1 ;開啟T1中斷
acall send ;71h--78h 清零;
acall send1 ;20h--29h 清零;
dd: acall daa ;進行十進制調整71H-79H
;acall compare ;第壹鬧鐘
;acall compare1 ;第二鬧鐘 設置值
;acall sound
acall disp ;數碼管顯示,78H--71H分別對應著8個數碼管顯示
acall key_scanf ;按鈕控制
acall time_adj ;時間調整
acall lasttime ;調用上壹次的設置值為當前定時值
;acall alarm1_set ;設置定時開/關鬧鐘
ajmp dd
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;調用上次值為設置時間
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lasttime:push acc
mov a,70h
jnb acc.2,return1
clr p3.0; 緊急暫停按鈕,按下後暫停,並把上次設定值恢復.
clr tr1
mov 73h,21h
mov 74h,22h
wait7:acall disp
acall key_scanf
mov a,70h
jnb acc.0,wait7
mov 71h,#0
mov 72h,#0
mov 79h,#0
mov tl1,trr
mov th1,#3ch
mov r3,#20
setb tr1
setb p3.0
return1:pop acc
ret
daa: push acc ;對當前系統時間進行十進制調整
mov 71h,79h
mov r1,#71h
cjne @r1,#10,s2
mov 71h,#0h
mov 79h,#0
inc 72h
mov r1,#72h
cjne @r1,#6,s2
mov 72h,#0h
dec 73h
mov r1,#73h
cjne @r1,#255,s2
dec 74h
mov 73h,#9
s1: pop acc
ret
s2: mov r1,#73h
cjne @r1,#0,s1
mov r1,#74h
cjne @r1,#0,s1
clr p3.0
clr tr1
sjmp s1
h_half: ;半點CHECK
mov r1,#73h
mov a,74h
swap a
xchd a,@r1
cjne a,#29h,o25 ;CHECK 當前時間是否為29分鐘
xchd a,@r1
mov r1,#71h
mov a,72h
swap a
xchd a,@r1
cjne a,#59h,o25 ;CHECK 當前時間為59秒?
setb tr0 ;啟動T0
setb 20h.1 ;enable 半點flag bit
o25: xchd a,@r1
ret
compare: ;鬧鐘1設置時間與當前時間比較
push acc
jnb 20h.6,nequ ;鬧鐘1開/關標誌位
mov a,73h
cjne a,21h,nequ ;分低位
mov a,74h
cjne a,22h,nequ ;分高位
mov a,75h
cjne a,23h,nequ ;小時低位
mov a,76h
cjne a,24h,nequ ;小時高位
setb 20h.3 ;到鬧鐘設置時間,使能鬧鐘報警標誌位
nequ:pop acc
ret
compare1: ;鬧鐘2設置時間與當前時間比較
push acc
jnb 20h.7,nequ33 ;鬧鐘2開/關標誌位
mov a,73h
cjne a,25h,nequ33
mov a,74h
cjne a,26h,nequ33
mov a,75h
cjne a,27h,nequ33
mov a,76h
cjne a,28h,nequ33
setb 20h.3 ;到鬧鐘設置時間,使能鬧鐘報警標誌位
nequ33:
pop acc
ret
sound:
acall h_half ;check 是否半點?
jb 20h.1,s23 ;半點則返回
jb 20h.0,s23
mov r1,#73h
mov a,74h
swap a
xchd a,@r1
cjne a,#59h,s25
xchd a,@r1
mov r1,#71h
mov a,72h
swap a
xchd a,@r1
s20: cjne a,#56h,s21
ajmp s26
s21: cjne a,#58h,s22
ajmp s26
s22: cjne a,#59h,s25
setb tr0
ajmp s26
s25: xchd a,@r1
s23: ret
s26: jb 20h.0,s25
setb tr0
xchd a,@r1
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T0中斷服務程序,報時鈴音信號輸出
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
bz: djnz 64h,rrr
jb 20h.3,alarmsign;鬧鐘到點報時有效
jb 20h.1,next ;半點報時
mov 64h,#4 ;0.5KHZ
ajmp justh
alarmsign:
mov 64h,#1; 2KHZ信號
justh:
djnz 66h,ccc
mov 66h,#100
djnz 65h,ccc ;產生1000次中斷後關中斷
mov 65h,#5 ;響0.5秒
setb 20h.0
clr tr0
reti
next:mov 64h,#2 ;1KHZ信號,半點報時音
ccc: jb 20h.3,cc
cpl p1.4 ;半點報時輸出聲音信號
rrr: reti
cc: cpl p1.4 ;鬧鐘報時輸出聲音信號
reti
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T1中斷服務程序,定時器主時鐘;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
t1int:
clr ea
mov tl1,trr
mov th1,#3ch
djnz r3,sd ;20*50MS=1S
mov r3,#20
;cpl p1.4
inc 79h
clr 20h.0
clr 20h.1 ;半點報時標誌清零
jb 20h.3,sdd ;鬧鐘CHECK有效與否?
clr tr0 ;關T0
sd: setb ea
reti
sdd: setb tr0 ;開T0,即開鬧鈴聲音
setb ea
reti
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;顯示子函數
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
dispnum1:; 顯示
ajmp disp_num
disp:
push acc
;jb 20h.5,dispnum1;開/關鬧鐘設置中界面...........
;jb 20h.2,alarmcheck;鬧鐘設置時間中界面..........
jb psw.5,closedisp
mov r2,#01h;位選通信號輸出到P2口
mov r5,#2; 顯示的位數循環控制
mov r0,#73h;分別取出內存76H-71H
cjne r3,#10,dot1;在小時和分之間閃爍DOT point
dot1:jnc dsp1
orl 73h,#10h
;dot1:cjne r3,#11,dsp1
;anl 73h,#0efh
dsp1:mov a,r2
;cpl a
mov p2,a
mov a,@r0
dsp2:mov dptr,#bcd
movc a,@a+dptr
mov p0,a
acall delay
mov a,r2
rl a
mov r2,a
inc r0
djnz r5,dsp1
anl 73h,#0efh
pop acc
ret
closedisp:; 關顯示
acall delay
mov p0,#0ffh
mov p2,#0
pop acc
ret
;;;;;;;;;;;;;;;;;鬧鐘的定時設置顯示
alarmcheck:
mov r2,#01h
mov r5,#2 ;兩位顯示22-21H對應定時設置值
mov r0,#21h
dsp21:
mov a,r2
;cpl a
mov p2,a
mov a,@r0
mov dptr,#bcd
movc a,@a+dptr
mov p0,a
acall delay
mov a,r2
rl a
mov r2,a
inc r0
djnz r5,dsp21
pop acc
ret
bcd:; ***陽接法數碼管段碼表
db 0c0h,0f9h,0a4h,0b0h
db 99h,92h,82h,0f8h
db 80h,90h,88h,83h
db 0c6h,0a1h,86h,8eh; 不帶小數點七段
db 40h,79h,24h,30h,19h
db 12h,02h,78h,00h,10h
db 0ffh,0bfh,7fh,3fh; 帶小數點七段
delay:mov r6,#4h
tm: mov r4,#0h
ee: djnz r4,ee; 延時2048US=2MS
djnz r6,tm
ret
send:mov r7,#9; 初始化設置
mov r0,#71h
mov a,#0h
ss: mov @r0,a
inc r0
djnz r7,ss
mov 78h,#1h
mov 77h,#01ah
;mov 71h,#1
;mov 72h,#2
;mov 73h,#3
;mov 74h,#4
ret
send1:; 初始化
mov r7,#10
mov r0,#20h
mov a,#0
ss1: mov @r0,a
inc r0
djnz r7,ss1
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;開/關鬧鐘界面顯示
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
disp_num:
mov p2,#0f7h
mov a,29h ;當前要操作的鬧鐘號碼
mov dptr,#bcd
movc a,@a+dptr
mov p0,a
acall delay
pop acc
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
key_scanf:; 按鈕處理
push acc
mov 70h,#0
orl p1,#0fh
mov a,p1
cpl a
anl a,#07h
jz nokey1
acall daa
acall disp
mov a,p1
cpl a
anl a,#07h
jz nokey1
mov 70h,a
key_wait:; 等按鈕放下
acall daa
acall disp
mov a,p1
cpl a
anl a,#07h
jnz key_wait
mov a,70h
jnb acc.1,nokey1
cpl psw.5
nokey1:; 無按鈕
pop acc
ret
a_on_off:
jnb 29h.0,iii
cpl 20h.6
iii: jnb 29h.1,out_2
cpl 20h.7
out_2:
ajmp alarmnum
alarmnum:
setb 20h.5
acall daa
acall disp
acall key_scanf
clr 20h.5
mov a,70h
jb acc.0,a_on_off
jb acc.1,alar_adj_1
jb acc.2,a_num_inc
acall numb
ajmp alarmnum
alarm1_set:
push acc
mov a,70h
jb acc.1,alarmnum
alarm1_out:
clr 20h.2
pop acc
ret
a_num_inc:
inc 29h
mov a,29h
anl a,#0fh
cjne a,#3,alarmnum
anl 29h,#0
ajmp alarmnum
alar_adj_1:
setb 20h.2
acall daa
orl 21h,#10h
acall disp
anl 21h,#0fh
acall key_scanf
mov a,70h
jb acc.1,hadj_1
jb acc.2,minc_1
ajmp alar_adj_1
madj_2:
acall daa
orl 25h,#10h
acall disp
anl 25h,#0fh
acall key_scanf
mov a,70h
jb acc.1,hadj_2
jb acc.2,minc_2
ajmp madj_2
hadj_1:
acall daa
orl 23h,#10h
acall disp
anl 23h,#0fh
acall key_scanf
mov a,70h
jb acc.1,madj_2
jb acc.2,hinc_1
ajmp hadj_1
hadj_2:acall daa
orl 27h,#10h
acall disp
anl 27h,#0fh
acall key_scanf
mov a,70h
jb acc.1,alarm1_out
jb acc.2,hinc_2
ajmp hadj_2
minc_1:
inc 21h
mov r1,#21h
cjne @r1,#10,alar_adj_1
mov 21h,#0
inc 22h
mov r1,#22h
cjne @r1,#6,alar_adj_1
mov 22h,#0h
ajmp alar_adj_1
minc_2:
inc 25h
mov r1,#25h
cjne @r1,#10,madj_2
mov 25h,#0
inc 26h
mov r1,#26h
cjne @r1,#6,madj_2
mov 26h,#0
ajmp madj_2
hinc_1:
inc 23h
mov r1,#23h
cjne @r1,#10,ss14
mov 23h,#0
inc 24h
ss14:
mov a,24h
swap a
xchd a,@r1
cjne a,#ts,ss15
mov 23h,#0
mov 24h,#0
ajmp hadj_1
ss15:xchd a,@r1
ajmp hadj_1
hinc_2:
inc 27h
mov r1,#27h
cjne @r1,#10,sss14
mov 27h,#0
inc 28h
sss14:
mov a,28h
swap a
xchd a, @r1
cjne a,#ts,sss15
mov 27h,#0
mov 28h,#0
ajmp hadj_2
sss15:
xchd a,@r1
ajmp hadj_2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;時間調整程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
time_adj:;
clr psw.5
push acc
mov a,70h
jb acc.0,l1;P1.0調時功能鍵,每按壹次切換壹位
ajmp nokeyout
adj_out:
mov 21h,73h
mov 22h,74h
setb p3.0 ;閉合繼電器
setb tr1
nokeyout:
pop acc
ret
QQ: anl 73h,#0fh
anl 74h,#0fh
;anl 78h,#0fh
ret
l1: clr tr1;acall dab; 分鐘調整
orl 73h,#10h;點亮分右下角的小數點,當前調整位置
acall disp
acall QQ
acall key_scanf
clr psw.5
mov a,70h
jb acc.0,h_adj;切換到小時調整
jb acc.1,m_inc;P1.2加1按鈕
ajmp l1
h_adj:; 小時調整
;acall dab
orl 74h,#10h
acall disp
acall QQ
acall key_scanf
clr psw.5
mov a,70h
jb acc.0,out_adj;切換到星期調整
jb acc.1,h_inc;小時加1
ajmp h_adj
w_adj:
acall daa
orl 78h,#10h
acall disp
acall QQ
acall key_scanf
clr psw.5
mov a,70h
jb acc.0,out_adj
jb acc.2,w_inc
ajmp w_adj
out_adj:
ajmp adj_out
m_inc:;;;;;;;;;;;;;;; 調整分時,對定時復位,初始化
clr tr1
mov 71h,#0
mov 72h,#0
mov 79h,#0
mov tl1,trr
mov th1,#3ch
mov r3,#20
inc 73h
mov r1,#73h
cjne @r1,#10,s12
mov 73h,#0
inc 74h
mov r1,#74h
cjne @r1,#10,s12
mov 74h,#0
s12: ajmp l1
;;;;;;;;;;;;;;;;;;;;;;調整小時位
h_inc:
inc 74h
mov r1,#74h
cjne @r1,#10,s14
mov 74h,#0
;inc 76h
s14: ajmp h_adj
;mov a,76h
;swap a
;xchd a,@r1
;cjne a,#ts,s15;;;12進制,24進制設置值決定
;mov 75h,#0
;mov 76h,#0
;ajmp h_adj
;s15: ;xchd a,@r1
;ajmp h_adj
;;;;;;;;;;;;;;;;;;;;;;;調整星期位
w_inc:
inc 78h
mov r1,#78h
cjne @r1,#8,s16
mov 78h,#1h
s16: ajmp w_adj
;;;;;;;;;;;;;;;;;;;;;;;當前鬧鐘開/關情況報告位
numb:clr 29h.4
jnb 29h.0,iii1
jnb 20h.6,iii1
setb 29h.4
iii1:jnb 29h.1,out_21
jnb 20h.7,out_21
setb 29h.4
out_21:
jnb 20h.6,out_12
jnb 20h.7,out_13
mov 77h,#1dh
ajmp out_22
out_12:
jnb 20h.7,out_14
mov 77h,#1bh
ajmp out_22
out_13:
mov 77h,#1ch
ajmp out_22
out_14:
mov 77h,#1ah
out_22:
ret
end