一直在电脑前,写了三天,这才完成了第二步,可以调时间 了,接下来就是闹钟的事情,也就是最后一步,继续努力!
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