|
- /*
- 程序效果:通過六位數碼管顯示時間,通過按鍵可以調節相應的數值
- KEY1的作用是:停止計數、顯示準備要改變的數字位上
- (分別為:秒、分、時),開始計數。
- KEY2:的作用是:對應的數值加1
- KEY3:的作用是:對應的數值減1
- 注:程序尚有精簡的地方。
- */
- ORG 0000H //起始地址
- LJMP START
- ORG 000BH //定時器0
- LJMP INT00
- ORG 0030H
- START: MOV 30H,#00 //賦初值時間為:
- MOV 31H,#05 //
- MOV 32H,#09 //
- MOV 33H,#05 //
- MOV 34H,#03 // 23:59:50
- MOV 35H,#02 //
- MOV 40H,#00 //控制定時時間,為1s
- MOV 50H,#00 //計算KEY1按下的次數
- MOV TMOD,#01H //工作方式1
- SETB ET0 //打開分控
- SETB EA //打開總控
- MOV TH0,#40H //定時時間為:50ms
- MOV TL0,#00H
- SETB TR0 //啟動定時器
- LOOP: MOV A,40H //控制循環次數
- CJNE A,#20,LOOP1 //到了20次,時間按為1s
- MOV 40H,#00 //清零,為下次做準備
- LCALL ADD1 //加1
- LOOP1: LCALL DISPLAY //調用顯示,防止掉顯
- JNB P3.5,KEY1 //判斷KEY1是否按下
- JNB P3.6,KEY2 // 判斷KEY2是否按下
- JNB P3.7,KE3Y //判斷KEY3是否按下 @1
- KEY1: LCALL DISPLAY //延時,消抖
- JNB P3.5,KEY10 //判斷KEY1是否按下
- LJMP LOOP
- KE3Y: LJMP KEY3 //@1 這兩句的做就是擴大JNB的跳轉范圍
- KEY10: JNB P3.5,DIS1 //檢查是否放手,防止掉顯
- LJMP DI1
- DIS1: LCALL DISPLAY
- LJMP KEY10
- //P3.5按下第一次,關閉定時器
- DI1: INC 50H
- MOV A,50H
- CJNE A,#01,KEY11
- CLR TR0
- LJMP KEY
- //按下第兩次,準備修改秒
- KEY11: MOV A,50H
- CJNE A,#02,KEY12
- MOV R1,#42
- DE500: LCALL DISPLAY_M
- DJNZ R1,DE500
- MOV R1,#42
- DE512: LCALL DISPLAY_M
- DJNZ R1,DE512
- LJMP KEY
- //按下第三次,準備修改分
- KEY12: MOV A,50H
- CJNE A,#03,KEY13
- MOV R1,#42
- DE513: LCALL DISPLAY_F
- DJNZ R1,DE513
- MOV R1,#42
- DE514: LCALL DISPLAY_F
- DJNZ R1,DE514
- LJMP KEY
- //按下第四次,準備修改時
- KEY13: MOV A,50H
- CJNE A,#04,KEY14
- MOV R1,#42
- DE515: LCALL DISPLAY_S
- DJNZ R1,DE515
- MOV R1,#42
- DE516: LCALL DISPLAY_S
- DJNZ R1,DE516
- LJMP KEY
- //按下第五次,啟動定時器
- KEY14: MOV A,50H
- CJNE A,#05,KEY
- MOV 50H,#00
- SETB TR0
- KEY: LJMP LOOP
- KEY2: LCALL DISPLAY //判斷KEY2是否按下
- JNB P3.6,KEY20
- LJMP LOOP
- KEY20: JNB P3.6,KEY201 //
- LJMP KEY202 //
- KEY201: LCALL DISPLAY //
- LJMP KEY20 //檢查按鍵是否松手
- //按鍵KEY1按下第二次,秒加1
- KEY202: MOV A,50H
- CJNE A,#02,KEY21
- INC 30H
- MOV A,30H
- CJNE A,#10,LK2P //判斷個位是否到10
- MOV 30H,#00 //清零
- INC 31H //十位加1
- MOV A,31H
- CJNE A,#06,LK2P //判斷是否到6
- MOV 31H,#00 //到了,清零
- LJMP LOOP
- //按鍵KEY1按下第三次,分加1
- KEY21: CJNE A,#03,KEY22
- INC 32H
- MOV A,32H
- CJNE A,#10,LK2P
- MOV 32H,#00
- INC 33H
- MOV A,33H
- CJNE A,#06,LK2P
- MOV 33H,#00
- LJMP LOOP
- //按鍵KEY1按下第四次,時加1
- KEY22: CJNE A,#04,LK2P
- INC 34H
- MOV A,34H
- CJNE A,#04,LK2P
- MOV 34H,#00
- INC 35H
- MOV A,35H
- CJNE A,#03,LK2P
- MOV 35H,#00
- LK2P: LJMP LOOP
- KEY3: LCALL DISPLAY
- JNB P3.7,KEY30
- LJMP LOOP
- KEY30: JNB P3.7,KEY301 //
- LJMP KEY302 //
- KEY301: LCALL DISPLAY //
- LJMP KEY30 // 檢查放手
- //按鍵KEY1按下第二次,秒減1
- KEY302: MOV A,50H
- CJNE A,#02,KEY31
- DEC 30H //減1
- MOV A,30H
- CJNE A,#0FFH,LK3P //減到255時
- MOV 30H,#09 //賦初值
- DEC 31H
- MOV A,31H
- CJNE A,#0FFH,LK3P
- MOV 31H,#05
- LJMP LOOP
- //按鍵KEY1按下第三次,分減1
- KEY31: CJNE A,#03,KEY32
- DEC 32H
- MOV A,32H
- CJNE A,#0FFH,LK3P
- MOV 32H,#09
- DEC 33H
- MOV A,33H
- CJNE A,#0FFH,LK3P
- MOV 33H,#05
- LJMP LOOP
- //按鍵KEY1按下第三次,時減1
- KEY32: CJNE A,#04,LK3P
- DEC 34H
- MOV A,34H
- CJNE A,#0FFH,LK3P
- MOV A,35H
- CJNE A,#02, KEY33
- MOV 34H,#09
- LJMP KEY35
- KEY33: CJNE A,#01,KEY34
- MOV 34H,#09
- LJMP KEY35
- KEY34: MOV 34H,#03
- KEY35: DEC 35H
- MOV A,35H
- CJNE A,#0FFH,LK3P
- MOV 35H,#02
- LK3P: LJMP LOOP
- //加1子程序
- ADD1: INC 30H
- MOV A,30H
- CJNE A,#10,LAP
- MOV 30H,#00
- INC 31H
- MOV A,31H
- CJNE A,#06,LAP
- MOV 31H,#00
- INC 32H
- MOV A,32H
- CJNE A,#10,LAP
- MOV 32H,#00
- INC 33H
- MOV A,33H
- CJNE A,#06,LAP
- MOV 33H,#00
- INC 34H
- MOV A,34H
- CJNE A,#04,LAP
- MOV 34H,#00
- INC 35H
- MOV A,35H
- CJNE A,#03,LAP
- MOV 35H,#00
- LAP: RET
- //六位數碼管顯示子程序
- DISPLAY: PUSH 00
- PUSH 01
- PUSH 02
- MOV DPTR,#TAB
- MOV R2,#04
- MOV R0,#30H
- MOV A,#7FH
- MOV P2,A
- XCH A,R1
- MOV A, @R0
- MOVC A,@A+DPTR
- MOV P0,A
- LCALL DELAY2MS
- INC R0
- XCH A,R1
- RR A
- MOV P2,A
- XCH A,R1
- MOV A, @R0
- MOVC A,@A+DPTR
- MOV P0,A
- LCALL DELAY2MS
- INC R0
- XCH A,R1
- RR A
-
- MOV DPTR,#TAB1
- LDP: MOV P2,A
- XCH A,R1
- MOV A, @R0
- MOVC A,@A+DPTR
- MOV P0,A
- LCALL DELAY2MS
- INC R0
- XCH A,R1
- RR A
- DJNZ R2,LDP
- POP 02
- POP 01
- POP 00
- RET
- //秒顯示,用于判斷什么時候調整秒
- DISPLAY_M:
- PUSH 00
- PUSH 01
- PUSH 02
- MOV DPTR,#TAB
- MOV R2,#04
- MOV R0,#30H
- MOV A,#7FH
- MOV P2,A
- XCH A,R1
- MOV A,#00
- MOV P0,A
- LCALL DELAY2MS
- INC R0
- XCH A,R1
- RR A
- MOV P2,A
- XCH A,R1
- MOV A,#00
- MOV P0,A
- LCALL DELAY2MS
- INC R0
- XCH A,R1
- RR A
-
- MOV DPTR,#TAB1
- LDMP: MOV P2,A
- XCH A,R1
- MOV A, @R0
- MOVC A,@A+DPTR
- MOV P0,A
- LCALL DELAY2MS
- INC R0
- XCH A,R1
- RR A
- DJNZ R2,LDMP
- POP 02
- POP 01
- POP 00
- RET
- //秒顯示,用于判斷什么時候調整分
- DISPLAY_F:
- PUSH 00
- PUSH 01
- PUSH 02
- MOV DPTR,#TAB
- MOV R2,#02
- MOV R0,#30H
- MOV A,#7FH
- MOV P2,A
- XCH A,R1
- MOV A, @R0
- MOVC A,@A+DPTR
- MOV P0,A
- LCALL DELAY2MS
- INC R0
- XCH A,R1
- RR A
- MOV P2,A
- XCH A,R1
- MOV A, @R0
- MOVC A,@A+DPTR
- MOV P0,A
- LCALL DELAY2MS
- INC R0
- XCH A,R1
- RR A
-
- MOV DPTR,#TAB1
- MOV P2,A
- XCH A,R1
- MOV A,#00
- MOV P0,A
- LCALL DELAY2MS
- INC R0
- XCH A,R1
- RR A
- MOV P2,A
- XCH A,R1
- MOV A,#00
- MOV P0,A
- LCALL DELAY2MS
- INC R0
- XCH A,R1
- RR A
- LDFP: MOV P2,A
- XCH A,R1
- MOV A, @R0
- MOVC A,@A+DPTR
- MOV P0,A
- LCALL DELAY2MS
- INC R0
- XCH A,R1
- RR A
- DJNZ R2,LDFP
- POP 02
- POP 01
- POP 00
- RET
- //秒顯示,用于判斷什么時候調整時
- DISPLAY_S:
- PUSH 00
- PUSH 01
- PUSH 02
- MOV DPTR,#TAB
- MOV R2,#02
- MOV R0,#30H
- MOV A,#7FH
- MOV P2,A
- XCH A,R1
- MOV A, @R0
- MOVC A,@A+DPTR
- MOV P0,A
- LCALL DELAY2MS
- INC R0
- XCH A,R1
- RR A
- MOV P2,A
- XCH A,R1
- MOV A, @R0
- MOVC A,@A+DPTR
- MOV P0,A
- LCALL DELAY2MS
- INC R0
- XCH A,R1
- RR A
-
- MOV DPTR,#TAB1
- LDSP: MOV P2,A
- XCH A,R1
- MOV A, @R0
- MOVC A,@A+DPTR
- MOV P0,A
- LCALL DELAY2MS
- INC R0
- XCH A,R1
- RR A
- DJNZ R2,LDSP
- MOV P2,A
- XCH A,R1
- MOV A,#00
- MOV P0,A
- LCALL DELAY2MS
- INC R0
- XCH A,R1
- RR A
- MOV P2,A
- XCH A,R1
- MOV A,#00
- MOV P0,A
- LCALL DELAY2MS
- POP 02
- POP 01
- POP 00
- RET
- //定時50ms
- INT00: MOV TH0,#40H
- MOV TL0,#00H
- INC 40H
- RETI
- TAB: DB 3FH,06H,5BH,4FH,66H //數碼管顯示的數值
- DB 6DH,7DH,07H,7FH,6FH
- TAB1: DB 0BFH,86H,0DBH,0CFH,0E6H //帶小數點的數碼管顯示的數值
- DB 0EDH,0FDH,87H,0FFH,0EFH
- DELAY2MS:
- MOV R7,#04
- DEL2: MOV R6,#250
- DEL1: DJNZ R6,DEL1
- DJNZ R7,DEL2
- RET
- END
復制代碼
|
|