功 能: 数码管显示的电子钟
;------------------------------------------------------------------------------
ORG 0000H
AJMP START
ORG 000BH
AJMP TIME
ORG 0100H
START: MOV 30H, #00H ;半秒标志
MOV 31H, #00H ;状态标志,0FFH表示设置状态
MOV 32H, #00H ;闪烁显示控制,位为0对应的数码管
;在调时状态下时闪烁
MOV 20H, #00H ;1/20秒计数
MOV 21H, #00H ;秒计数
MOV 22H, #00H ;分计数
MOV 23H, #00H ;时计数
MOV IP, #02H ;IP,IE初始化
MOV IE, #82H
MOV TMOD, #01H ;设定定时器工作方式
MOV TL0, #0B0H ;定时器初值
MOV TH0, #3CH
SETB TR0 ;启动定时器0
MOV SP, #40H ;重设堆栈指针
MAIN: LCALL DISP ;调用显示子程序
LCALL KEYPR ;调用按键处理子程序
SJMP MAIN ;循环
;定时器0中断处理程序
TIME: PUSH ACC ;保护现场
PUSH PSW
MOV TL0, #0B4H ;赋定时初值
MOV TH0, #03CH
INC 20H ;1/20秒计数器加1
MOV A, 20H
CJNE A, #10, IRET ;未到半秒,返回
MOV 20H, #00H
MOV A, 30H ;修改半秒标志
CPL A
MOV 30H, A
JZ IRET
MOV A, 31H ;状态标志,为0FFH停止计时
JNZ IRET
MOV 20H, #00H ;一秒钟时间到
MOV A, 21H ;秒加1
INC A
MOV 21H, A
CJNE A, #60, IRET
MOV 21H, #00H ;一分钟时间到
MOV A, 22H ;分加1
INC A
MOV 22H, A
CJNE A, #60, IRET
MOV 22H, #00H ;一小时时间到
MOV A, 23H ;小时加1
INC A
MOV 23H, A
CJNE A, #24, IRET
MOV 23H, #00H ;24小时到,小时清零
IRET: POP PSW ;恢复现场
POP ACC
RETI ;中断返回
;显示子程序 ;显示缓冲区2AH - 2FH
DISP: MOV A, 21H ;处理秒 21H-->2FH,2EH
MOV B, #10
DIV AB
MOV 2FH, B
MOV 2EH, A
MOV A, 22H ;处理分钟22H-->2CH,2DH
MOV B, #10
DIV AB
MOV 2DH, B
MOV 2CH, A
MOV A, 23H ;处理小时23H-->2AH,2BH
MOV B, #10
DIV AB
MOV 2BH, B
MOV 2AH, A
MOV DPTR, #DISPTAB ;段码表首地址
MOV R0, #2AH ;缓冲区首地址
MOV R6, #20H ;数码管位选择
DISP1: MOV A, @R0
MOVC A, @A+DPTR
MOV P2, #00H
MOV B, A
MOV A, 30H ;半秒标志
JNZ VIS1 ;半秒标志不为0,处理闪烁
MOV A, B
JMP VIS3 ;半秒标志为0,不处理闪烁
VIS1: MOV A, B
MOV B, A
MOV A, R6
ANL A, 32H
JNZ VIS2 ;当前位不闪烁
MOV A, #00H ;当前位闪烁
JMP VIS3
VIS2: MOV A, B
VIS3: MOV B, A
MOV A, R6
ANL A, #14H ;处理点的位置,点用来分隔时,分,秒
JNZ D1 ;显示点
MOV A, B
JMP D2 ;不显示点
D1: MOV A, B
ORL A, #80H ;显示点
D2: MOV P0, A
MOV P2, R6
CALL DELAY ;延时
DISP2: INC R0
MOV A, R6
RRC A
MOV R6, A
JNZ DISP1 ;R6不为0,继续显示
MOV P2, #00H
RET
;按键判断程序
KEYPR: SETB P3.5 ;检测S31
JB P3.5, EXITKEY
LCALL DISP
JB P3.5, EXITKEY
MOV 21H, #00H ;进入设定状态
MOV 31H, #0FFH
MOV 32H, #33H
KW1: LCALL DISP
JNB P3.5, KW1
SETMIN: LCALL DISP
SETB P3.5
JB P3.5, SETMIN1
LCALL DISP
JB P3.5, SETMIN1
KW2: LCALL DISP
JNB P3.5, KW2
JMP SETHR ;进入小时设定状态
SETMIN1:SETB P3.6 ;设定分钟
JB P3.6, SETMIN
LCALL DISP
JB P3.6, SETMIN
KW3: LCALL DISP
JNB P3.6, KW3
MOV A, 22H
INC A
CJNE A, #60, INCMIN
MOV A, #00H
INCMIN: MOV 22H, A
JMP SETMIN
SETHR: MOV 32H, #0FH
LCALL DISP
SETB P3.5
JB P3.5, SETHR1
LCALL DISP
JB P3.5, SETHR1
KW4: LCALL DISP
JNB P3.5, KW4
JMP EXITKEY ;退出设定状态
SETHR1: SETB P3.6 ;设定小时
JB P3.6, SETHR
LCALL DISP
JB P3.6, SETHR
KW5: LCALL DISP
JNB P3.6, KW5
MOV A, 23H
INC A
CJNE A, #24, INCHR
MOV A, #00H
INCHR: MOV 23H, A
JMP SETHR
EXITKEY:MOV 31H, #00H
MOV 32H, #3FH
RET
DELAY: MOV R7, #0FFH
DJNZ R7, $
RET
;共阴数码管显示代码,最低位对应段a
;0,1,2,3,4,5,6,7,8,9
DISPTAB:DB 3FH, 06H, 5BH, 4FH, 66H
DB 6DH, 7DH, 07H, 7FH, 6FH
END