;*******************************************
; 定时器溢出周期为50MS
; P3.4为显示开关按钮,P3.5为调整时钟,P3.6为调整分钟
; 70-71H 秒计时单元
; 72-73H 分显示单元 注意:72H放个位数 73H放十位数
; 74-75H 小时显示单元
; 76-77H 分计计时单元
; 78-79H 小时计时单元
; 7AH 放“熄灭符”数据
; 6BH 放 分调整标志
; 6AH 放小时调整标志
;**********************************************
XSZ EQU 7AH
ORG 0000H
LJMP START
ORG 000BH
LJMP INTT0
;****************************************
; 主 程 序
;****************************************
START: MOV P0,#00H
MOV P1,#00H
MOV P2,#00H
CLR P3.0
CLR P3.1
CLR P3.2
CLR P3.3
CLR P3.7
MOV R0,#70H ;清70H-7AH共11个内存单元
MOV R7,#0BH
SETB XSZ
CLEARDISP: MOV @R0,#00H
INC R0
DJNZ R7,CLEARDISP
MOV 20H,#00H ;清20H(标志用)
MOV TMOD,#01H ;设T0为16位定时器
MOV TL0,#0B0H ;50MS定时初值(T0计时用)
MOV TH0,#3CH ;50MS定时初值
SETB EA
SETB ET0
SETB TR0
MOV R4,#14H ;1秒定时用初值(50MS×20)
START1: JNB XSZ,START2 ;关辉光电子管显示,为0跳过显示
LCALL DISPLAY ;调用显示子程序
START2: JNB P3.5,SET_H ;此按键是小时加1
JNB P3.6,SET_M ;此按键是分钟加1
JNB P3.4,SET_X
MOV A,70H
CJNE A,60H,START3
LJMP START1
START3: SETB P3.7 ;秒闪
LCALL DL05S
CLR P3.7
MOV 60H,70H
LJMP START1
SET_H: LJMP SET_HH
SET_M: LJMP SET_MM
SET_X: LJMP SET_XX
;****************************************
; 1秒计时程序
;T0中断服务程序
;****************************************
INTT0: PUSH ACC
PUSH PSW
CLR ET0
CLR TR0
MOV A,#0B0H ;中断响应时间同步修正,要精确调整在这里!!!
ADD A,TL0
MOV TL0,A
MOV A,#3CH
ADDC A,TH0
MOV TH0,A
SETB TR0
DJNZ R4, OUTT0
ADDSS: MOV R4,#014H
MOV R0,#71H ;指向秒计时单元(70H-71H)
ACALL ADD1
MOV A,R3
CLR C
CJNE A,#60H,ADDMM ;
ADDMM: JC OUTT0 ;小于60秒时中断退出
ACALL CLR0 ;大于或等于60秒时对秒计时单元清0
MOV R0,#77H ;指向分计时单元(76H-77H)
ACALL ADD1
MOV A,R3
CLR C
CJNE A,#60H,ADDHH ;
ADDHH: JC OUTT0 ;小于60分时中断退出
ACALL CLR0 ;大于或等于60分时分计时单元清0
MOV R0,#79H ;指向小时计时单元(78H-79H)
ACALL ADD1
MOV A,R3
CLR C
CJNE A,#24H,HOUR
HOUR: JC OUTT0
ACALL CLR0
OUTT0: MOV 72H,76H
MOV 73H,77H
MOV 74H,78H
MOV 75H,79H
POP PSW
POP ACC
SETB ET0
RETI
;
;***************************************
; 加1子 程 序
;***************************************
ADD1: MOV A,@R0
DEC R0
SWAP A
ORL A,@R0
ADD A,#01H
DA A
MOV R3,A
ANL A,#0FH
MOV @R0,A
MOV A,R3
INC R0
SWAP A
ANL A,#0FH
MOV @R0,A
RET
;***************************************
;清零程序
;对计时单元复零用
;***************************************
CLR0: CLR A
MOV @R0,A
DEC R0
MOV @R0,A
RET
;****************************************
;显示程序
;显示数据在70H-75H单元内
;***************************************
DISPLAY: JB 6BH,DIS10
LJMP DISP30
DIS10: MOV A,75H
CJNE A,#00H,DIS11
CLR P1.0
CLR P1.1
LJMP DIS20
DIS11: CJNE A,#01H,DIS12
SETB P1.0
CLR P1.1
LJMP DIS20
DIS12: CJNE A,#02H,DIS20
CLR P1.0
SETB P1.1
DIS20: MOV A,74H
CJNE A,#00H,DIS21
SETB P1.2
CLR P1.3
CLR P1.4
CLR P1.5
CLR P1.6
CLR P1.7
CLR P3.0
CLR P3.1
CLR P3.2
CLR P3.3
LJMP DISP30
DIS21: CJNE A,#01H,DIS22
CLR P1.2
SETB P1.3
CLR P1.4
CLR P1.5
CLR P1.6
CLR P1.7
CLR P3.0
CLR P3.1
CLR P3.2
CLR P3.3
LJMP DISP30
DIS22: CJNE A,#02H,DIS23
CLR P1.2
CLR P1.3
SETB P1.4
CLR P1.5
CLR P1.6
CLR P1.7
CLR P3.0
CLR P3.1
CLR P3.2
CLR P3.3
LJMP DISP30
DIS23: CJNE A,#03H,DIS24
CLR P1.2
CLR P1.3
CLR P1.4
SETB P1.5
CLR P1.6
CLR P1.7
CLR P3.0
CLR P3.1
CLR P3.2
CLR P3.3
LJMP DISP30
DIS24: CJNE A,#04H,DIS25
CLR P1.2
CLR P1.3
CLR P1.4
CLR P1.5
SETB P1.6
CLR P1.7
CLR P3.0
CLR P3.1
CLR P3.2
CLR P3.3
LJMP DISP30
DIS25: CJNE A,#05H,DIS26
CLR P1.2
CLR P1.3
CLR P1.4
CLR P1.5
CLR P1.6
SETB P1.7
CLR P3.0
CLR P3.1
CLR P3.2
CLR P3.3
LJMP DISP30
DIS26: CJNE A,#06H,DIS27
CLR P1.2
CLR P1.3
CLR P1.4
CLR P1.5
CLR P1.6
CLR P1.7
SETB P3.0
CLR P3.1
CLR P3.2
CLR P3.3
LJMP DISP30
DIS27: CJNE A,#07H,DIS28
CLR P1.2
CLR P1.3
CLR P1.4
CLR P1.5
CLR P1.6
CLR P1.7
CLR P3.0
SETB P3.1
CLR P3.2
CLR P3.3
LJMP DISP30
DIS28: CJNE A,#08H,DIS29
CLR P1.2
CLR P1.3
CLR P1.4
CLR P1.5
CLR P1.6
CLR P1.7
CLR P3.0
CLR P3.1
SETB P3.2
CLR P3.3
LJMP DISP30
DIS29: CJNE A,#09H,DISP30
CLR P1.2
CLR P1.3
CLR P1.4
CLR P1.5
CLR P1.6
CLR P1.7
CLR P3.0
CLR P3.1
CLR P3.2
SETB P3.3
LJMP DISP30
DISP30: JB 6AH,DIS30 ;判断是否是小时设置
LJMP DIS50
DIS30: MOV A,73H
CJNE A,#00H,DIS31
SETB P0.0
CLR P0.1
CLR P0.2
CLR P0.3
CLR P0.4
CLR P0.5
LJMP DIS40
DIS31: CJNE A,#01H,DIS32
CLR P0.0
SETB P0.1
CLR P0.2
CLR P0.3
CLR P0.4
CLR P0.5
LJMP DIS40
DIS32: CJNE A,#02H,DIS33
CLR P0.0
CLR P0.1
SETB P0.2
CLR P0.3
CLR P0.4
CLR P0.5
LJMP DIS40
DIS33: CJNE A,#03H,DIS34
CLR P0.0
CLR P0.1
CLR P0.2
SETB P0.3
CLR P0.4
CLR P0.5
LJMP DIS40
DIS34: CJNE A,#04H,DIS35
CLR P0.0
CLR P0.1
CLR P0.2
CLR P0.3
SETB P0.4
CLR P0.5
LJMP DIS40
DIS35: CJNE A,#05H,DIS40
CLR P0.0
CLR P0.1
CLR P0.2
CLR P0.3
CLR P0.4
SETB P0.5
DIS40: MOV A,72H
CJNE A,#00H,DIS41
SETB P0.6
CLR P0.7
CLR P2.0
CLR P2.1
CLR P2.2
CLR P2.3
CLR P2.4
CLR P2.5
CLR P2.6
CLR P2.7
LJMP DIS50
DIS41: CJNE A,#01H,DIS42
CLR P0.6
SETB P0.7
CLR P2.0
CLR P2.1
CLR P2.2
CLR P2.3
CLR P2.4
CLR P2.5
CLR P2.6
CLR P2.7
LJMP DIS50
DIS42: CJNE A,#02H,DIS43
CLR P0.6
CLR P0.7
SETB P2.0
CLR P2.1
CLR P2.2
CLR P2.3
CLR P2.4
CLR P2.5
CLR P2.6
CLR P2.7
LJMP DIS50
DIS43: CJNE A,#03H,DIS44
CLR P0.6
CLR P0.7
CLR P2.0
SETB P2.1
CLR P2.2
CLR P2.3
CLR P2.4
CLR P2.5
CLR P2.6
CLR P2.7
LJMP DIS50
DIS44: CJNE A,#04H,DIS45
CLR P0.6
CLR P0.7
CLR P2.0
CLR P2.1
SETB P2.2
CLR P2.3
CLR P2.4
CLR P2.5
CLR P2.6
CLR P2.7
LJMP DIS50
DIS45: CJNE A,#05H,DIS46
CLR P0.6
CLR P0.7
CLR P2.0
CLR P2.1
CLR P2.2
SETB P2.3
CLR P2.4
CLR P2.5
CLR P2.6
CLR P2.7
LJMP DIS50
DIS46: CJNE A,#06H,DIS47
CLR P0.6
CLR P0.7
CLR P2.0
CLR P2.1
CLR P2.2
CLR P2.3
SETB P2.4
CLR P2.5
CLR P2.6
CLR P2.7
LJMP DIS50
DIS47: CJNE A,#07H,DIS48
CLR P0.6
CLR P0.7
CLR P2.0
CLR P2.1
CLR P2.2
CLR P2.3
CLR P2.4
SETB P2.5
CLR P2.6
CLR P2.7
LJMP DIS50
DIS48: CJNE A,#08H,DIS49
CLR P0.6
CLR P0.7
CLR P2.0
CLR P2.1
CLR P2.2
CLR P2.3
CLR P2.4
CLR P2.5
SETB P2.6
CLR P2.7
LJMP DIS50
DIS49: CJNE A,#09H,DIS50
CLR P0.6
CLR P0.7
CLR P2.0
CLR P2.1
CLR P2.2
CLR P2.3
CLR P2.4
CLR P2.5
CLR P2.6
SETB P2.7
DIS50: RET
;****************************************
;小时加1调整程序
;****************************************
SET_HH: CLR ET0
CLR TR0
CLR 6AH
LCALL DISPLAY
SETHH1: JNB P1.1,SETHH1
SET6: JB P3.5,SET6
LCALL DL05S
JNB P3.5,SETOUT
MOV R0,#79H
LCALL ADD1
MOV A,R3
CLR C
CJNE A,#24H,HOUU
HOUU: JC SET6
LCALL CLR0
AJMP SET6
SETOUT: JNB P3.5,SETOUT
LCALL DL05S
JNB P3.5,SETOUT
SETB TR0
SETB ET0
SETB 6AH
LJMP START1 ;跳回主程序
;****************************************
;分钟加1调整程序
;*****************************************
SET_MM: CLR ET0
CLR TR0
CLR 6BH
LCALL DISPLAY
SET2: JNB P3.6,SET2 ;(键未释放),等待
SET4: JB P3.6,SET4 ;等待键按下
LCALL DL05S ;有键按下,延时0.5秒
JNB P3.6,SETOUT_M ;按下时间大于0.5秒转退出程序
MOV R0,#77H
LCALL ADD1
MOV A,R3
CLR C
CJNE A,#60H,HHH
HHH: JC SET4
LCALL CLR0
CLR C
AJMP SET4
SETOUT_M: JNB P3.6,SETOUT_M
LCALL DL05S
JNB P3.6,SETOUT_M
SETB TR0
SETB ET0
SETB 6BH
LJMP START1 ;跳回主程序
;****************************************
;辉光电子管显示开关程序
;*****************************************
SET_XX: JNB XSZ,SET_XX1
MOV P0,#00H
MOV P1,#00H
MOV P2,#00H
CLR P3.0
CLR P3.1
CLR P3.2
CLR P3.3
CLR P3.7
CLR XSZ
LJMP START1
SET_XX1: SETB XSZ
LJMP START1 ;跳回主程序
;****************************************
;延时程序
;****************************************
DL1S: LCALL DL05S
LCALL DL05S
RET
DL05S: MOV R3,#20H
DL05S1: DJNZ R3,DL05S1
RET
END
文章评论(0条评论)
登录后参与讨论