一直在電腦前,寫了三天,這才完成了第二步,可以調(diào)時間 了,接下來就是鬧鐘的事情,也就是最后一步,繼續(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 ;關(guān)定時器中斷 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 ;關(guān)定時器中斷 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