- org 0000h
- ajmp main
- org 000bh
- ajmp t100ms
- org 001bh
- ajmp tt1
- tt1: mov th1,#26h ;定時器T1中斷程序
- mov tl1,#0fch
- inc 5ah
- mov a,#02h
- cjne a,3ah,ttk
- cpl f0
- mov 5ah,#00h
- ttk: reti
- t100ms: MOV TL0,#0b0H ;定時器T0中斷程序
- MOV TH0,#03CH
- PUSH PSW;
- PUSH ACC
- SETB RS0; 工作在1區
- MOV A,68H
- INC A
- MOV 68H,A ;
- CJNE A,#0AH,DONE ;不到1秒,退出中斷
- MOV 68H,#00H ;1秒,置68H為0
- MOV A,67H;
- INC A ;秒加一
- MOV 67H,A
- CJNE A,#0AH,DONE;不到十秒,退出
- MOV 67H,#00H ;到十秒,秒個位清零,秒十位加一
- MOV A,66H;
- INC A
- MOV 66h,A;
- CJNE A,#06H,DONE;秒十位為6嗎?不,退出
- MOV 66H,#00H; 為6,秒清零,分個位加一
- MOV A,65H;
- INC A
- MOV 65H,A
- CJNE A,#0AH,DONE ;分個位為十嗎?不,退出
- MOV 65H,#00H ;是,分個位清零,分十位加一
- MOV A,64H; 分十位
- INC A
- MOV 64H,A
- CJNE A,#06H,DONE ;分十位為6嗎?不,退出
- MOV 64H,#00H ;是,分清零,時個位加一
- MOV A,63H; 時個位
- INC A
- MOV 63H,A
- CJNE A, #04H,DONET0 ;時個位為4嗎?不,轉DONET0
- MOV A,62H
- CJNE A,#02H,DONE; 是24小時了嗎?
- MOV 62H,#00H;
- MOV 63H,#00H; 是24小時了,清零
- DONE: POP Acc ; T100ms中斷退出
- POP PSW
- RETI
- DONET0: CJNE A,#0AH,DONE
- MOV 63H,#00H;
- MOV A,62H
- INC A
- MOV 62H,A
- LJMP DONE
- MAIN: MOV A,#0F0H
- MOV P2,A
- MOV SP,#30H
- MOV 6CH,#10H ;第一開機時間標志為“10”
- MOV 6FH,#1fH ;第一關機時間標志為“1F”
- MOV 72H,#20H
- MOV 75H,#2fH
- MOV 78H,#30H
- MOV 7BH,#3fH
- setb et1
- SETB ET0 ;T0中斷開
- SETB PT0 ;T0為高優先級中斷
- SETB EA
- SETB F0
- MOV TMOD,#01H ;T0為方式1、定時功能
- MOV TL0,#0B0H
- MOV TH0,#3CH ;定時初值100ms
- SETB TR0 ;開定時器
- MAIN1: CLR TR1
- mov 4bh,#00h ;鍵碼清零
- mov 4ch,#00h ;AN1鍵序清零
- mov 4dh,#00h ;AN2鍵序清零
- ACALL DISZH
- ACALL DISP ;調顯示子程序
- TSHIBI: MOV A,62H ;62H為時十位
- SWAP A
- ORL A,63H ;63H為時個位
- MOV 25H,A ;25H為小時
- MOV A,64H ;64H為分十位
- SWAP A
- ORL A,65H ;65H為分個位
- MOV 26H,A ;26H為分鐘
- MOV A,66H
- SWAP A
- ORL A,67H
- MOV A,27H ;27H為秒
- JB P3.0,KK0 ;K1斷開,轉KK0
- MOV A,#02H ;手動程序
- CJNE A,4BH,DKK1
- ACALL KEYW
- CPL P2.1
- DKK1: MOV A,#03H
- CJNE A,4BH,DKK2
- ACALL KEYW
- CPL P2.2
- DKK2: MOV A,#04H
- CJNE A,4BH,KKK
- ACALL KEYW
- CPL P2.3
- AJMP KKK
- KK0: JNB 0FH,KK2 ;第一路開/關機功能關,轉KK2
- MOV A,25H;
- CJNE A,6AH,KK1; 第一路開機小時到了嗎?不到,轉KK1
- MOV A,26H; 到了,比較分鐘
- CJNE A,6BH,KK1; 分鐘到了嗎?不到,轉KK1
- SETB 00H; 開機時間到,令00H=1
- SETB P2.1; 第一路輸出開
- KK1: MOV A,25H
- CJNE A,6DH,KK2; 第一路關機小時到了嗎?不到,轉KK2
- MOV A,26H; 到了,比較分鐘
- CJNE A,6EH,KK2; 分鐘到了嗎?不到,轉KK2
- CLR 00H; 第一路關機時間到,令00H=0
- CLR P2.1; 第一路輸出關
- KK2: JNB 17H,KK4 ;第二路開/關機功能關,轉KK4
- MOV A,25H
- CJNE A,70H,KK3
- MOV A,26H
- CJNE A,71H,KK3
- SETB 00H
- SETB P2.2
- KK3: MOV A,25H
- CJNE A,73H,KK4
- MOV A,26H
- CJNE A,74H,KK4
- CLR 00H
- CLR P2.2
- KK4: JNB 1FH,KKK ;第三路開/關機功能關,轉KKK
- MOV A,25H
- CJNE A,76H,KK5
- MOV A,26H
- CJNE A,77H,KK5
- SETB 00H
- SETB P2.3
- KK5: MOV A,25H
- CJNE A,79H,KKK
- MOV A,26H
- CJNE A,7AH,KKK
- CLR P2.3
- CLR 00H
- KKK: ACALL DISZH
- ACALL DISP
- MOv A,#01H
- CJNE A,4BH,KKK1
- LCALL KEYW
- INC 4CH ;AN1鍵第一次被按下,AN1鍵序加一
- AJMP MAIN2
- KKK1: AJMP MAIN1
- MAIN2: SETB TR1 ;開定時器1
- MOV 4DH,#01H ;AN2鍵序置1
- MAIN2A: ACALL DISZH
- ACALL DISP
- MOV A,#01H
- CJNE A,4BH,DX0 ;AN1鍵第二次被按下嗎?沒有,轉DX0
- LCALL KEYW ;AN1鍵第二次被按下,AN1鍵序加一
- INC 4CH
- AJMP MAIN3
- dx0: mov a,#02h
- cjne a,4bh,set1
- lcall keyw ;AN2鍵被按下
- inc 4dh ;AN2鍵序加1
- mov a,#07h
- cjne a,4dh,set1
- mov 4dh,#01h
- set1: acall dset
- ACALL DISZH2
- ACALL DISZH
- ACALL DISP
- MOV A,#05H
- CJNE A,4BH,DDD ;AN5鍵被按下?否
- LCALL KEYW
- LJMP MAIN1 ;AN5鍵被按下?是,轉MAIN1
- DDD: ajmp main2a
- MAIN3: MOV 4DH,#03H ;開關機時間設定程序
- DDK: MOV R0,#6AH;
- A2: MOV A,@R0;
- ANL A,#0FH;
- MOV 53H,A; 顯存,53H為時個位
- MOV A,@R0
- ANL A,#0F0H
- SWAP A
- MOV 52H,A; 顯存,52H為時十位
- INC R0;
- MOV A,@R0;
- ANL A,#0FH;
- MOV 55H,A; 顯存,55H為分個位
- MOV A,@R0;
- ANL A,#0F0H;
- SWAP A;
- MOV 54H,A; 顯存,54H為分十位
- INC R0
- MOV A,@R0;
- ANL A,#0FH;
- MOV 57H,A; 顯存,
- MOV A,@R0;
- ANL A,#0F0H;
- SWAP A;
- MOV 56H,A; 顯存,56H、57H在顯示時間時為秒數值在設置時為開關機標志
- DEC R0
- DEC R0
- A3:
- ACALL DISP
- MOV A,#01H
- CJNE A,4BH,DKX0 ;AN1鍵又一次被按下嗎?沒有,轉DKX0
- LCALL KEYW ;AN1鍵又一次被按下,AN1鍵序加一
- INC 4CH
- mov a,4ch
- CJNE a,#08H,DDD1
- MOV 4CH,#02H
- ajmp main3
- DDD1: INC R0
- INC R0
- inc r0
- mov 4dh,#03h
- AJMP A2
- dKx0: mov a,#02h
- cjne a,4bh,setK1
- lcall keyw ;AN2鍵被按下
- inc 4dh ;AN2鍵序加1
- mov a,#07h
- cjne a,4dh,setK1
- mov 4dh,#03h
- setK1: MOV A,#04H ;AN4鍵被按下嗎?
- CJNE A,4BH,SETK2
- lcall keyw ;AN4鍵被按下
- MOV A,4CH
- CJNE A,#02H,DXD1
- CPL 0FH
- DXD1: CJNE A,#04H,DXD2
- CPL 17H
- DXD2: CJNE A,#06H,SETK2
- CPL 1FH
- SETK2: acall dset
- ACALL DISZH3
- ACALL DISP
- MOV A,#05H
- CJNE A,4BH,DDD3 ;AN5鍵被按下?否
- LCALL KEYW
- LJMP MAIN1 ;AN5鍵被按下?是,轉MAIN1
- DDD3: AJMP A2
- diSP: ;顯示子程序
- mov dptr,#tab
- mov a,57h ;顯示秒個位
- mov r3,4dh
- cjne r3,#01h,dd1
- dk1: jb F0,DD1
- mov a,#0ffh ;F0為0,該位不顯示,以達到該位閃爍效果
- sjmp dd2
- dd1: movc a,@a+dptr
- dd2: mov p1,a ;送段碼
- clr p0.0 ;開秒個位
- dsp1: acall dll
- d1: setb p0.0 ;關個位
- mov a,56h ;顯示左起第5位(秒十位)
- mov r3,4dh
- cjne r3,#02h,dd3
- dk2: jb F0,DD3
- mov a,#0ffh
- sjmp dd4
- dd3: movc a,@a+dptr
- dd4: MOV B,A
- MOV A,4CH
- CJNE A,#02H,DXD3
- MOV A,B
- CPL A
- ORL A,21H
- CPL A ;判斷是否顯示第一次開關機標志中的小數點
- AJMP ZX
- DXD3: CJNE A,#04H,DXD4
- MOV A,B
- CPL A
- ORL A,22H
- CPL A ;判斷是否顯示第二次開關機標志中的小數點
- AJMP ZX
- DXD4: CJNE A,#06H,DXD5
- MOV A,B
- CPL A
- ORL A,23H
- CPL A ;判斷是否顯示第三次開關機標志中的小數點
- AJMP ZX
- DXD5: MOV A,B
- ZX: mov p1,a
- clr p0.1
- jb p0.7,dsp2 ;AN5鍵沒有按下,轉dsp2
- acall del1
- jb p0.7,dsp2
- ajmp key5 ;AN5鍵按下,轉key5鍵碼識別
- dsp2: acall dll
- d2: setb p0.1
- mov a,55h ;顯示分個位
- mov r3,4dh
- cjne r3,#03h,dd5 ;AN3鍵序為4嗎?
- dk3: jb F0,DD5 ;F0為1,顯示
- mov a,#0ffh
- sjmp dd6
- dd5: movc a,@a+dptr
- dd6: mov p1,a
- clr p0.2
- jb p0.7,dsp3
- acall del1
- jb p0.7,dsp3
- ajmp key4 ;AN4鍵按下,轉key4鍵碼識別
- dsp3: acall dll
- d3: setb p0.2
- mov a,54h
- mov r3,4dh
- Cjne r3,#04h,dd7
- dk4: jb F0,DD7
- mov a,#0ffh
- sjmp dd8
- dd7: movc a,@a+dptr
- dd8: mov p1,a
- clr p0.3
- jb p0.7,dsp4
- acall del1
- jnb p0.7,key3 ;AN3鍵按下,轉key3鍵碼識別
- dsp4: acall dll
- d4: setb p0.3
- mov a,53h
- mov r3,4dh
- cjne r3,#05h,dd9
- dk5: jb F0,DD9
- mov a,#0ffh
- sjmp dd10
- dd9: movc a,@a+dptr
- DD10: MOV P1,A
- clr p0.4
- jb p0.7,dsp5
- acall del1
- jnb p0.7,key2 ;AN2鍵按下,轉key2鍵碼識別
- dsp5: acall dll
- d5: setb p0.4
- mov a,52h
- mov r3,4dh
- cjne r3,#06h,dd11
- dk6: jb F0,DD11
- mov a,#0ffh
- sjmp dd12
- dd11: movc a,@a+dptr
- dd12: mov p1,a
- clr p0.5
- jb p0.7,dsp6
- acall del1
- jnb p0.7,key1 ;AN1鍵按下,轉key1鍵碼識別
- dsp6: acall dll
- d6: setb p0.5
- ret
- tab: DB 0C0H ; 0
- DB 0F9H ; 1
- DB 0A4H ; 2
- DB 0B0H ; 3
- DB 099H ; 4
- DB 092H ; 5
- DB 082H ; 6
- DB 0F8H ; 7
- DB 080H ; 8
- DB 090H ; 9
- DB 088H ; A
- DB 083H ; B
- DB 0C6H ; C
- DB 0A1H ; D
- DB 086H ; E
- DB 08EH ; F
- key1: mov 4bh,#01h ;保存AN1鍵碼
- ajmp d6
- key2: mov 4bh,#02h
- ajmp d5
- key3: mov 4bh,#03h
- ajmp d4
- key4: mov 4bh,#04h
- ajmp d3
- key5: mov 4bh,#05h
- ajmp d2
- keyw: mov 4bh,#00h ;鍵等待釋放程序
- lcall disp
- mov a,4bh
- jnz keyw
- lcall disp
- mov a,4bh
- jnz keyw
- ret
- DISZH: MOV 52H,62H ;時間值送顯存子程序
- MOV 53H,63H
- MOV 54H,64H
- MOV 55H,65H
- MOV 56H,66H
- MOV 57H,67H
- RET
- DISZH2: MOV 62H,52H ;正常時間設置數據裝入子程序
- MOV 63H,53H
- MOV 64H,54H
- MOV 65H,55H
- MOV 66H,56H
- MOV 67H,57H
- RET
- DISZH3: MOV A,52H ;開關機時間設置數據裝入子程序
- SWAP A
- ORL A,53H
- MOV @r0,a
- INC R0
- MOV A,54H
- SWAP A
- ORL A,55H
- MOV @R0,A
- dec r0
- RET
- dset: mov r3,4dh ;設定子程序
- cjne r3,#01h,dx2 ;AN2鍵序不為1,轉DX2
- mov r4,4bh
- cjne r4,#03h,dx11 ;AN2鍵序為1,但AN3鍵未被按下
- lcall keyw ;AN2鍵被按下,等待鍵釋放
- inc 57h ;秒個位的數值被更改(加1)
- mov r5,57h
- cjne r5,#0ah,dx11
- mov 57h,#00h
- dx11: ajmp dx
- dx2: mov r3,4dh
- cjne r3,#02h,dx3
- mov r4,4bh
- cjne r4,#03h,dx12
- lcall keyw
- inc 56h
- mov r5,56h
- cjne r5,#07h,dx12 ;使該位(秒十位)的數值可在0--6之間隨意設定
- mov 56h,#00h
- dx12: ajmp dx
- dx3: cjne r3,#03h,dx4
- mov r4,4bh
- cjne r4,#03h,dx13
- lcall keyw
- inc 55h
- mov r5,55h
- cjne r5,#0ah,dx13
- mov 55h,#00h
- dx13: ajmp dx
- dx4: cjne r3,#04h,dx5
- mov r4,4bh
- cjne r4,#03h,dx14
- lcall keyw
- inc 54h
- mov r5,54h
- cjne r5,#07h,dx14 ;使該位(分十位)的數值可在0--6之間隨意設定
- mov 54h,#00h
- dx14: ajmp dx
- dx5: cjne r3,#05h,dx6
- mov r4,4bh
- cjne r4,#03h,dx15
- lcall keyw
- inc 53h ;時個位的數值被更改(加1)
- MOV A,52H
- SWAP A
- ORL A,53H
- CLR C
- CJNE A,#24H,DXD6
- AJMP DXD7
- DXD6: JC DXD7
- mov 53h,#00h ;時數大于24,置時個位為零
- DXD7: mov r5,53h
- cjne r5,#0ah,dx15 ;在時鐘數不大于24的前提下,使該位(時個位)的數值可在0--9之間隨意設定
- mov 53h,#00h
- dx15: ajmp dx
- dx6: cjne r3,#06h,dx
- mov r4,4bh
- cjne r4,#03h,dx16
- lcall keyw ;AN3按下并釋放,時十位加一
- inc 52h
- MOV A,52H
- SWAP A
- ORL A,53H
- CLR C
- CJNE A,#24H,DX7
- AJMP DX8
- DX7: JC DX8
- MOV 52H,#00H ;時數大于24,置時十位為零
- DX8: mov r5,52h
- cjne r5,#03h,dx16 ;在時鐘數不大于24的前提下,使該位(時十位)的數值可在0--2之間隨意設定
- mov 52h,#00h
- dx16: ajmp dx
- dx: acall disp ;調用顯示子程序
- ret
- dll: MOV R7,#01fH
- DL1: MOV R6,#1fH
- DL2: DJNZ R6,DL2
- DJNZ R7,DL1
- RET
- DEL1: MOV R7,#0aH
- DEL1A: MOV R6,#2eH
- DEL1B: DJNZ R6,DEL1B
- DJNZ R7,DEL1A
- RET
- END
復制代碼
|