一直在電腦前,寫了三天,這才完成了第二步,可以調時間 了,接下來就是鬧鐘的事情,也就是最后一步,繼續(xù)努力!
org 0000h
ajmp main
org 000bh
ajmp inti0
org 0030h
main:mov tmod,#01h
mov ie,#82h
mov th0,#4ch
mov tl0,#00h
mov sp,#60h
mov r0,#20
setb tr0
loop:lcall display
lcall keysan
ajmp loop
inti0:push psw
push acc
clr ea
mov th0,#4ch
mov tl0,#00h
djnz r0,out ;1秒計數(shù)是否到
mov r0,#20
inc 31h ;秒加1
mov a,31h
cjne a,#60,out ;60秒計數(shù)是否到
mov 31h,#00
inc 32h ;分加1
mov a,32h
cjne a,#60,out ;60分計數(shù)是否到
mov 32h,#00
inc 33h ;時加1
mov a,33h
cjne a,#24,out ;24時是否到
mov 33h,#00
out: setb ea
pop acc
pop psw
reti
display:
mov a,31h ;秒顯示
mov b,#10
div ab
mov 20h,a
mov 21h,b
disp1: mov a,20h ;秒十位顯示
mov dptr,#table
movc a,@a+dptr
mov p0,a
clr p2.6
lcall del1ms
setb p2.6
disp2: mov a,21h ;秒個位顯示
mov dptr,#table
movc a,@a+dptr
mov p0,a
clr p2.7
lcall del1ms
setb p2.7
disp4: mov a,32h ;分顯示
mov b,#10
div ab
mov 22h,a
mov 23h,b
disp5: mov a,22h ;分十位顯示
mov dptr,#table
movc a,@a+dptr
mov p0,a
clr p2.3
lcall del1ms
setb p2.3
disp6: mov a,23h ;分個位顯示
mov dptr,#table
movc a,@a+dptr
mov p0,a
clr p2.4
lcall del1ms
setb p2.4
disp7: mov a,33h ;時顯示
mov b,#10
div ab
mov 24h,a
mov 25h,b
disp8: mov a,24h ;時十位顯示
mov dptr,#table
movc a,@a+dptr
mov p0,a
clr p2.0
lcall del1ms
setb p2.0
disp9: mov a,25h ;時個位顯示
mov dptr,#table
movc a,@a+dptr
mov p0,a
clr p2.1
lcall del1ms
setb p2.1
disp10: mov 34h,#0bfh ;"-"顯示
mov a,34h
mov p0,a
clr p2.5
lcall del1ms
setb p2.5
disp11: mov 35h,#0bfh ;"-"顯示
mov a,35h
mov p0,a
clr p2.2
lcall del1ms
setb p2.2
ret
table:db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h ;數(shù)字0—9
del1ms:mov r7,#10 ;1ms延時子程序
del1: mov r6,#50
del2:djnz r6,del2
djnz r7,del1
ret
del20ms:mov r5,#40 ;20ms延時子程序
del3: mov r4,#250
del4: djnz r4,del4
djnz r5,del3
ret
keysan:jnb p3.4,key0 ;秒、分、時選擇
jnb p3.2,key1 ;秒、分、時加1按鈕
jnb p3.3,key4 ;秒、分、時減1按鈕
sjmp keyout
key0: lcall del20ms ;20ms延時消抖
jb p3.4,keyout ;按下按鍵就往下,否則返回
jnb p3.4,$ ;等待按鍵放開
clr ea ;關定時器中斷
inc 36h ;36h為秒、分、時選擇計數(shù)單元
mov a,36h
cjne a,#4,keyout
mov 36h,#00 ;清36h,位下次做準備
setb ea
sjmp keyout
key1: lcall del20ms ;20ms延時消抖
jb p3.2,keyout ;按下按鍵就往下,否則返回主程序
clr ea ;關定時器中斷
jnb p3.2,$ ;等待按鍵放開
mov a,36h
cjne a,#3,key2
inc 33h ;第三次為時加1
mov a,33h
cjne a,#24,keyout
mov 33h,#00
setb ea
sjmp keyout
key2:mov a,36h
cjne a,#2,key3
inc 32h
mov a,32h
cjne a,#60,keyout
mov 32h,#00
setb ea
sjmp keyout
key3:inc 31h
mov a,31h
cjne a,#60,keyout
mov 31h,#00
setb ea
sjmp keyout
keyout:ret
key4: lcall del20ms
jb p3.3,keyout
clr ea
jnb p3.3,$
mov a,36h
cjne a,#3,key5
dec 33h ;時減1
mov a,33h
cjne a,#24,keyout
mov 33h,#23
setb ea
sjmp keyout
key5:mov a,36h
cjne a,#2,key6
dec 32h ;分減1
mov a,32h
cjne a,#60,keyout
mov 32h,#59
setb ea
sjmp keyout
key6:dec 31h ;秒減1
mov a,31h
cjne a,#60,keyout
mov 31h,#59
setb ea
sjmp keyout
end
