|
- /*
- 程序效果:通过六位数码管显示时间,通过按键可以调节相应的数值
- 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
复制代码
|
|