- 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
复制代码
|