程序开始
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP CLOCK
ORG 0100H
主程序开始:
MAIN: MOV SP,#70H
MOV 6EH,#00H ;显示缓存器初始值设定
MOV 6DH,#00H
MOV 6CH,#00H
MOV 6BH,#00H
MOV 6AH,#00H
MOV 69H,#00H
MOV 50H,#00H ;秒,分,小时初始值设定
MOV 51H,#00H
MOV 52H,#00H
MOV DPTR,#0F003H ;8255端口定义,PA,PB为输出
MOV A,#80H
MOVX @DPTR,A
MOV 4FH,#00H
MOV TMOD,#01H ;定时器T0及TL0,TH0初始值设定
MOV TH0,#3CH
MOV TL0,#0B0H
SETB EA ;开总中断
SETB ET0 ;开定时器中断
SETB TR0
循环程序开始,并显示时间:
START: MOV A,50H
LCALL BCD
MOV 6AH,A ;显示秒十位
MOV 69H,B ;显示秒个位
MOV A,51H
LCALL BCD
MOV 6CH,A ;显示分十位
MOV 6BH,B ;显示分个位
MOV A,52H
LCALL BCD ;调用十六进制至BCD码转换子程序
MOV 6EH,A
MOV 6DH,B
LCALL DIS ;调用显示子程序
LCALL KEY ;调用键盘子程序
AJMP START
;主程序结束
BCD: MOV B,#0AH ;BCD码转换子程序
DIV AB
RET
CLOCK: PUSH ACC ;保护现场
PUSH PSW
CLR TR0
MOV TH0,#3CH ;定时参数重新设置
MOV TL0,#0B0H
SETB TR0
INC 4FH ;100ms单元加1
MOV A,4FH
CJNE A,#0AH,D0 ;100ms单元=10,就秒单元加1
MOV 4FH,#00H ;100ms单元内容清0
MOV A,50H
ADD A,#01H ;秒单元加1
MOV 50H,A
CJNE A,#3CH,D0 ;秒单元内容=60,则秒单元清0
MOV 50H,#00H
MOV A,51H ;分,时单元代码
ADD A,#01H
MOV 51H,A
CJNE A,#3CH,D0
MOV 51H,#00H
MOV A,52H
ADD A,#01H
LCALL RING ;报警子程序
MOV 52H,A
CJNE A,#18H,D0
MOV 52H,#00H
D0: POP PSW ;出栈,退出中断子程序
POP ACC
RETI
RING: MOV R3,A
CLR P1.0
LCALL DELL50
SETB P1.0
LCALL DELL50
DJNZ R3,RING
RET
键盘子程序:
KEY: JB P1.7,MSET ;秒设定子程序
LCALL DELL ;防抖动延时
JB P1.7,MSET
INC 50H
MOV A,50H
CJNE A,#3CH,SDIS
MOV 50H,#00H
SDIS: MOV A,50H
LCALL BCD
MOV 69H,B
MOV 6AH,A
SREP: LCALL DIS
JNB P1.7,SREP
MSET: JB P1.6,HSET ;分设定子程序
LCALL DELL
JB P1.6,HSET
INC 51H
MOV A,51H
CJNE A,#3CH,MDIS
MOV 51H,#00H
MDIS: MOV A,51H
LCALL BCD
MOV 6BH,B
MOV 6CH,A
MREP: CALL DIS
JNB P1.6,MREP
HSET: JB P1.5,SETEND ;小时设定子程序LCALL DELL
JB P1.5,SETEND
INC 52H
MOV A,52H
CJNE A,#18H,HDIS
MOV 52H,#00H
HDIS: MOV A,52H
LCALL BCD
MOV 6DH,B
MOV 6EH,A
HREP: LCALL DIS
JNB P1.5,HREP
SETEND: RET ;键盘设定子程序结束
显示子程序:
DIS: MOV R0,#69H ;建立显示首地址
MOV R3,#01H ;从右边开始显示
MOV A,R3 ;位控码初值
YB: MOV DPTR,#0F001H ;位控口地址,PB口MOVX @DPTR,A
MOV A,@R0
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#0F000H
MOVX @DPTR,A ;输出段控码
LCALL DELL ;延时
INC R0 ;转向下一单元
MOV A,R3
JB ACC.5,EEND ;判断是否到最高位,到则返回
RL A
MOV R3,A
SJMP YB ;继续扫描
EEND: RET
TAB: DB 3FH,06H,5BH,4FH,66H,6DH ;字形代码表
DB 7DH,07H,7FH,6FH,77H,7CH
DB 39H,5EH,79H,71H,73H,3EH
DB 31H,6EH,1CH,23H,40H,03H
DELL: MOV R5,#0AH 延时10ms
LP1: MOV R6,#32H
DJNZ R6,$
DJNZ R5,LP1
RET
DELL50: MOV R7,#0AH 延时50 MS
LCALL DELL
DJNZ R7,DELL50
RET
END。