源程序
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TIME
;主程序部分
ORG 0100H
MAIN:MOVSP,#50H
MOV 20H,#00H ;秒钟
MOV 21H,#00H ;分钟
MOV 22H,#00H ;小时
MOV 23H,#01H
MOV 24H,#01H
MOV 25H,#00H
MOV 30H,#00H
MOV 31H,#00H
MOV 32H,#00H
MOV 33H,#00H
MOV 34H,#00H
MOV 35H,#00H
MOV TMOD,#01H ;16位计数器
MOV TH0,#03CH ;赋计数初值
MOV TL0,#0B0H
MOV IE,#87H ;允许外部中断1和外部中断0和T0溢出中断
SETB TR0 ;启动计数器T0
MOV R2,#14H
MOV P2,#0FFH
LOOP:LCALL DISPLAY1
JB P1.1,LOOP
LCALL SETTIME ;调用设定时间程序
LJMP LOOP
DELAY:MOV R4,#030H ;延时时间
DL00:MOV R5,#0FFH
DL11:MOV R6,#9H
DL12:DJNZ R6,DL12
DJNZ R5,DL11
DJNZ R4,DL00
RET
;设定时间程序
SETTIME:
L0:LCALL DISPLAY1 ;调用时间允许程序
MM1: JB P1.2,L1
MOV C,P1.2
JC MM1
LCALL DELAY1 ;调用延时
JC MM1
MSTOP1: MOV C,P1.2
JNC MSTOP1 ;判断P1.2是否释放释放则继续
LCALL DELAY1 ;调用延时
MOV C,P1.2
JNC MSTOP1
INC 22H ;小时增加1
MOV A,22H
CJNE A,#18H,GO12 ;判断小时是否到24时未到继续循环
MOV 22H,#00H ;小时复位
MOV 34H,#00H
MOV 35H,#00H
LJMP L0
L1:JBP1.3,L2
MOV C,P1.3
JC L1
LCALL DELAY1 ;延时
JC L1
MSTOP2: MOV C,P1.3
JNC MSTOP2 ;判断P1.3是否释放释放则继续
LCALL DELAY1 ;调用延时
MOV C,P1.3
JNC MSTOP2
INC 21H ;分钟增加一
MOV A,21H
CJNE A,#3CH,GO11
MOV 21H,#00H ;分钟复位
MOV 32H,#00H
MOV 33H,#00H
LJMP L0
GO11:MOV B,#0AH ;将A中的内容分成高低两部分
DIV AB
MOV 32H,B
MOV 33H,A
LJMP L0
GO12: MOV B,#0AH
DIV AB
MOV 34H,B
MOV 35H,A
LJMP L0
L2:JB P1.4,L0
MOV C,P1.4
JC L2
LCALL DELAY1 ;调用延时
MOV C,P1.4
JC L2
STOP1: MOV C,P1.4 ;判断按键P1.4是否释放?
JNC STOP1
LCALL DELAY1 ;调用延时
MOV C,P1.4
JNC STOP1
LJMP LOOP
DELAY1: MOV R4,#14H ;时间延时
DL001: MOV R5,#0FFH
DL111: DJNZ R5,DL111
DJNZ R4,DL001
RET
TIME: PUSH ACC ;现场保护
PUSH PSW
MOV TH0,#03CH ;赋初值
MOV TL0,#0B0H
DJNZ R2,RET0
MOV R2,#14H
MOV A,20H
CLR C
INC A ;秒钟自加1
CJNE A,#3CH,GO1 ;判断秒钟是否到60秒?
MOV 20H,#0 ;到60秒复位
MOV 30H,#0
MOV 31H,#0
MOV A,21H
INC A ;分钟自加1
CJNE A,#3CH,GO2 ;判断分钟是否到60分?
MOV 21H,#0H ;到60分复位
MOV 32H,#0
MOV 33H,#0
MOV A,22H
INC A ;时钟自加1
CJNE A,#18H,GO3 ;判断时钟是否到24时?
MOV 22H,#00H ;到24时复位
MOV 34H,#0
MOV 35H,#0
AJMP RET0
GO1: MOV 20H,A
MOV B,#0AH
DIV AB
MOV 31H,A
MOV 30H,B
AJMP RET0
GO2: MOV 21H,A
MOV B,#0AH
DIV AB
MOV 33H,A
MOV 32H,B
AJMP RET0
GO3: MOV 22H,A
MOV B,#0AH
DIV AB
MOV 35H,A
MOV 34H,B
AJMPRET0
RET0: POP PSW ;恢复现场
POP ACC
RETI
;运行部分
DISPLAY1: MOV R0,#30H
MOV R3,#0FEH
MOV A,R3
PLAY1: MOV P2,A
MOV A,@R0
MOV DPTR,#DSEG1 ;表首地址送DPTR
MOVC A,@A+DPTR
MOV P0,A
LCALL DL1
MOV P2,#0FFH ;送高电平到P2
MOV A,R3
RL A ;
JNB ACC.6,LD1
INC R0
MOV R3,A
LJMP PLAY1 ;调用查表程序
LD1:RET
;延时时间
DL1: MOV R7,#02H ;延时时间
DL: MOV R6,#020H
DL6: DJNZ R6,$
DJNZ R7,DL
RET
DSEG1:DB 3FH,06H,5BH,4FH,66H ;共阴极数码管编码表
DB6DH,7DH,07H,7FH,6FH
END
调试运行
|