;---------------------------------- ;显P.程序
;---------------------------------- START:
MOV A, #0FEH TT:
;位选
MOV R6, #2 ;闪烁次数
MOV P2, A ;将#0FEH赋值给P2口
MOV P0, #0CH ;段码\LCALL DELAY1 ;\显示亮度
JNB P1.0, TRB ;键是否按下,没按下则转移 DJNZ R6, TT ;控制循环,R6不为零则转移 LCALL DELAY1 ;控制循环右移时间 RR A ;位选右移 MOV R6, #2 ;重新赋值R6
JB P1.0, TT ;键是否按下,没按下则转移 TRB: LCALL DELAY KAI: SETB P1.0 CLR
A
MOV P0, #0FFH LCALL DELAY1
;延时去抖 ;置位P1.0
JNB P1.0, KAI ;再次判断键是否按下
;状态恢复 ;把P1口置一 ;调延时
SETB 48H ;用于调时闪烁标志
SETB 47H ;用于产生脉冲用于调时快进的脉冲 MOV R1, #0 ;键功能标志:0计时、1调时、2调分、3调秒
;------------------------------- ;清16位寄存器及初始化
;50H 用于控制秒基准时钟源的产生 ;51H 清零秒寄存器 ;52H 清零分寄存器 ;53H 清零时寄存器
;5FH 用于秒个位;5EH 用于秒十位 ;5DH 用于分个位;5CH 用于分十位 ;5BH 用于时个位;5AH 用于时十位
31
;54H 用于控制调时闪烁 ;------------------------------- MOV R6, #10H
CLEARJCQ:MOV @R0, #00H ;清寄存器 INC R0
;间址突破口指向下一地址单元
DJNZ R6, CLEARJCQ ;清零00H之后的16个内存单元 MOV IP, #02H ;定时器0置高优先级 SETB EA SETB ET0
;开总中断允许
;开定时器0中断
;赋定时初值TH0
MOV R0, #50H ;初始化
MOV TMOD, #01H ;设定定时器0工作方式1 MOV TH0, #3CH SETB TR0 ;-------- ;主程序 ;--------
MAIN:LCALL DISPLAY LCALL KEY_SCAN JZ MAIN
LCALL SET_KEY 面的调整
LCALL ADD_KEY LCALL DEC_KEY ;--------------- ; 显示处理程序 ;---------------
DISPLAY:MOV A, ANL A, #0FH MOV A, 51H
MOV TL0, #0B0H ;赋定时初值TL0,定时50ms
;启动定时器0
MOV SP, #70H ;堆栈
;调显示子程序 ;调键扫描子程序
;无键按下则跳到主程序 ;键处理子程序
JB 46H, MAIN ;如果已进行调时快进,则不再执行下
;调用增加键处理子程序,加一 ;调用减少键处理子程序,减一
LJMP MAIN ;重新循环
51H ;读秒值
;屏蔽高4位 ;读秒值
32
MOV 5FH, A ;转换出秒个位,存入5FH
ANL A, #0F0H ;屏蔽低4位 SWAP A
;A高低半字节交换
MOV 5EH, A ;转换出秒十位,存入5EH
JB 46H, MIN ;如果调时快进,则跳过闪烁处理程序 CJNE R1, #3,MIN ;如果R1为3,闪烁秒位待调整 JB 48H, MIN MOV 5EH, #0AH ANL A, #0FH
;跳转至分处理程序段
;使该位为10,查表得使该位不显示
;读分值 ;屏蔽高4位
MOV 5FH, #0AH ;使该位为10,查表得使该位不显示 MIN:MOV A, 52H
MOV 5DH, A ;转换出分个位,存入5DH MOV A, 52H ;读分值 ANL A, #0F0H SWAP A JB
;屏蔽低4位
;累加器高低位交换
MOV 5CH, A ;转换出分十位,存入5CH
46H, HOUR ;如果调时快进,跳过闪烁处理程序
CJNE R1, #2,HOUR ;如果R1为2,闪烁分位待调整 JB 48H, HOUR ;跳转至时处理程序段 MOV 5DH, #0AH ;分个位 MOV 5CH, #0AH ;分十位 HOUR:MOV A, 53H ;读时值 ANL A, #0FH
;屏蔽高4位
MOV 5BH, A ;转换出时个位,存入5BH MOV A, 53H ;读时值 ANL A, #0F0H SWAP A
;屏蔽低4位 ;累加器高低位交换
MOV 5AH, A ;转换出时十位,存入5AH JB 46H, DISP ;跳过闪烁处理程序
CJNE R1, #1,DISP ;如果R1为1,闪烁时位待调整 JB 48H, DISP ;跳转至显示程序
MOV 5BH, #0AH ;使该位为10,查表得使该位不显示 MOV 5AH, #0AH ;------------------- ;数码管动态扫描显示
33
;-------------------
DISP:MOV DPTR, #TABLE MOVC A, @A+DPTR MOV P0, A CLR P2.0
;送常数表首地址
MOV A, 5FH ;秒个位
;取常数 ;常数送P0口 ;复位P2.0
LCALL
SETB MOV MOVC
MOV CLR LCALL SETB MOV MOV CLR LCALL SETB MOV MOVC MOV CLR LCALL SETB MOV MOVC MOV CLR
LCALL SETB MOV MOV CLR
DELAY
;调延时
P2.0 ;显示秒个位 A, 5EH ;秒十位 A,
@A+DPTR ;取常数
P0, A
;常数送P0口
P2.1
;复位P2.0
DELAY
;调延时
P2.1 ;显示秒十位 A, #0BFH ;“-”段码送累加器 P0, A ;“-”段码送P0口 P2.5
;复位P2.0
DELAY
;调延时
P2.5 ;显示“-”
A, 5DH ;分个位 A, @A+DPTR
;取分个位段码
P0, A ;分个位段码送P0 P2.3
;复位P2.0 DELAY
;调延时
P2.3 ;显示分个位 A, 5CH ;分十位送累加器 A, @A+DPTR ;取分十位段码
P0, A
;分十位段码送P0口 P2.4
;复位P2.0
DELAY
;调延时
P2.4 ;显示分十位 A, #0BFH ;“-”段码送累加器 P0,
A
;“-”段码送P0口
P2.2 ;复位P2.0
34