一直在电脑前,写了三天,这才完成了第二步,可以调时间 了,接下来就是闹钟的事情,也就是最后一步,继续努力!
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秒计数是否到
mov r0,#20
inc 31h ;秒加1
mov a,31h
cjne a,#60,out ;60秒计数是否到
mov 31h,#00
inc 32h ;分加1
mov a,32h
cjne a,#60,out ;60分计数是否到
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 ;数字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为秒、分、时选择计数单元
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
