LCALL DELAY SETB P2.2 MOVC
;调延时
;时个位送累加器
;取时个位段码
;时个位段码送P0口
;显示“-”
MOV A, 5BH MOV P0, A CLR P2.6
LCALL DELAY
A, @A+DPTR
;复位P2.0
;调延时
SETB P2.6 ;显示时个位
MOV DPTR, #TABLE1 ;该位使用TABLE1以消除时的十位置0 MOV A,
5AH
;时十位
;取时十位段码 ;时十位段码送P0口 ;复位P2.0
;调延时 ;子程序返回
MOVC A, @A+DPTR MOV P0, A CLR P2.7 SETB P2.7 RET
;----------------- ;定时器中断1s程序 ;-----------------
TIMET0:PUSH ACC ;保护现场 PUSH PSW
;保护现场
;重新装载定时初值TH0 ;重新装载定时初值TL0 ;调时闪烁值加1
MOV TH0, #3CH MOV TL0, #0B0H INC
54H
LCALL DELAY
;显示时十位
CPL 47H ;产生脉冲用于调时快进 MOV A, 54H
;读调时闪烁值
CJNE A, #10,ADD_TIME ;产生0.5秒,用于调时闪烁 CPL 48H ;取反调时闪烁标志位 MOV 54H, #00H MOV A, 50H
CJNE A, #10,ZDBACD SETB P3.1
;关蜂鸣器
35
;清零调时闪烁值
ADD_TIME: INC 50H
;整点报时时蜂鸣器响延迟时间
ZDBACD:CJNE A, #20,RETI1 ;产生1秒时钟
MOV 50H, #00H ;一秒钟时间到,清零50H MOV A, 51H ADD DA
A, #01H A
A
#60H,RETI1 52H #01H
;十进制调整
A #60H,RETI1
;开蜂鸣器 ;清零时寄存器 ;十进制调整
#00H ;一小时到,开蜂鸣器,清分显示 53H A
#24H,RETI1 ;判断是否满24小时 #00H ;到24点,清零小时
;恢复现场
;恢复现场 ;中断返回
;清零分寄存器
;十进制调整
;清零秒寄存器
MOV 51H, CJNE A, MOV A, ADD A, DA A CJNE A,
MOV 52H, CLR P3.1 MOV 52H, MOV A, ADD
A,
DA A CJNE A, RETI1:POP
MOV 51H, #00H ;一分钟到
#01H
MOV 53H, MOV 53H,
PSW
POP ACC RETI ;------------- ;键盘扫描程序
;R4设置为00H是为了在进入长按处理前加长延时,以区分长按与短按键 ;-------------
KEY_SCAN:CLR MOV MOV CPL ANL JZ
P1, A, A
A, #07H ;只判断P1口的前3位 EXIT_KEY
36
46H ;关闭调时快进标志
#0FFH ;将P1口设置成输入状态 P1
LCALL DELAY ;延时去抖动
MOV CPL ANL JZ MOV MOV MOV CPL ANL JB INC LJMP MOV SETB
A, A A, R5, R4, A, A A, 47H,
P1 ;重新判断
;取P1口各按键状态
;保留低七位按键值
#07H A
#00H ;用于控制调时快进速度 P1
;取P1口各按键状态 ;取反各按键状态
;保留低七位按键值
EXIT_KEY
LOOP:LCALL DISPLAY ;进入长按处理
#07H LOOP1
R4 LOOP3
;调时快进间隔时间基准加1
LOOP1:CJNE R1, LOOP2:CJNE R4,
46H
#03H,LOOP2 ;如果调秒时长按,则不处理
#99H,LOOP3
R4, #70H ;确认长按后,加快调时快进速度
;调加功能子程序
;调减功能子程序 ;等待键释放 ;子程序返回
;子程序返回
LCALL ADD_KEY LCALL DEC_KEY
LOOP3:JNZ LOOP MOV A, R5 RET
EXIT_KEY:RET ;------------ ;延时子程序 ;------------
;输出键值
DELAY:MOV R7, #200 DJNZ R7, $ RET
DELAY1:MOV R3, #50 MOV TMOD, #00H MOV TH1, #63H MOV TL1, #18H SETB
;置延时初值 ;延时400us ;置定时循环初值
;设定定时器1为工作方式0 ;装载定时初值TH1
;子程序返回
;装载定时初值TL1
37
TR1 ;开定时器1
LP1:JBC TF1, LP2 SJMP LP1 LP2:MOV
TH1, #63H
;查询定时溢出 ;重新装载定时初值TH1 ;重新装载定时初值TL1
;继续查询溢出
MOV TL1, #18H DJNZ R3, LP1 RET
;----------------- ;选择键处理子程序 ;-----------------
SET_KEY:CJNE R5, INC CJNE MOV RET
R1, R1,
;循环定时50次 ;子程序返回
#01H,EXIT ;选择键键值
;调整选择功能标志加一
R1
#4,EXIT #0
MOV 54H, #00H
;---------- ;加1子程序 ;----------
ADD_KEY:CJNE CJNE MOV ADD DA MOV CJNE MOV MOV ADD DA MOV CJNE MOV
R1, A, A, A 53H, A, 53H, A, A,
52H, A, 52H,
R5,
;调时闪烁清零
;子程序返回
#02H,EXIT ;加1键值
;选择键功能标志为1调时,否则跳出
;时值送累加器 ;时值加1 ;十进制调整
;加1后的值再送回时值存储单元 ;时值不等于
#01H,NEXT1 53H #01H
A #00H 52H #01H A
#60H,EXIT #00H
#24H,EXIT
NEXT1:CJNE R1, #02H,NEXT2 ;选择键功能标志为2调分,否则跳出
A ;十进制调整
NEXT2:CJNE R1,
#03H,EXIT ;选择键功能标志为3调秒,否则跳出
38