ORG 0000H
LJMP MAIN
ORG 000BH
LJMP INTT0
ORG 0030H
;===================================================主程序
MAIN: MOV SP,#75H
CLR 00H ;===========================================================================消斗标志位
CLR 02H ;===========================================================================显示闪烁标志,1闪烁,0不闪
MOV 21H,#0 ;====================================功能标志单元21H,0为时钟运行态,1为秒调节,2为分调节,3为小时调节。
MOV R5,#50
MOV R6,#2
MOV 6DH,#23
MOV 6EH,#59
MOV TMOD,#01H ;T0为方式1
MOV TH0,#0D8H ;T0赋初值(10MS,fosc=12MHz)
MOV TL0,#0F0H
SETB EA ;CPU开中断
SETB ET0 ;T0开中断
SETB TR0
SETB TR1 ;T0启动运行
MLP: SJMP MLP
;==================================================显示子程序
DISP: MOV DPTR,#TAB1
MOV A,70H
MOVC A,@A+DPTR
MOV P0,A
CLR P2.0 ;时的十位显示
LCALL D1MS
SETB P2.0
MOV A,71H
MOVC A,@A+DPTR
ANL A,#7FH
MOV P0,A
CLR P2.1 ;时的个位显示
LCALL D1MS
SETB P2.1
MOV DPTR,#TAB2
MOV A,72H
MOVC A,@A+DPTR
MOV P0,A
CLR P2.2 ;分的十位显示
LCALL D1MS
SETB P2.2
MOV A,73H
MOVC A,@A+DPTR
ANL A,#7FH
MOV P0,A
CLR P2.3 ;分的个位显示
LCALL D1MS
SETB P2.3
RET ;=======================显示程序出口
;===============================================
TAB1: DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H
TAB2: DB 40H,0C3H,0A4H,86H,8BH,92H,98H,0C7H,80H,83H ;TAB1: DB 40H,0F9H,0A4H,0B0H,99H,92H ;需要送到数码管显示的数据
;DB 82H,0F8H,80H,90H,0FFH
;TAB2: DB 40H,0CFH,0A4H,06H,8BH,92H,98H,0C7H,80H,83H
;===========================================================延时子程序
D1MS: MOV R7,#249 ;1T
D1MSLP: NOP ;2TX256
NOP
DJNZ R7,D1MSLP ;2TX256=996T
NOP ;1T
RET;=============延时子程序出口
;=======================================================================================中断子程序
INTT0: MOV TH0,#0D8H ;T0重赋初值
MOV TL0,#0F0H
DJNZ R5,INTRET ;100次中断为一秒
MOV R5,#50 ;下一次中断100次
CPL 02H ;===========================================显示闪烁标志,1闪烁,0不闪。1秒亮,1秒灭
DJNZ R6,INTRET
MOV R6,#2
MOV A,21H ;======时钟运行状态
CJNE A,#0,INTRET ;======时钟运行状态,21H=0。如时钟为调整状态,则时钟不随中断而变
INC 6EH ;
MOV A,6EH
CJNE A,#60,INTRET
MOV 6EH,#0
INC 6DH ;
MOV A,6DH
CJNE A,#24,INTRET
MOV 6DH,#0
INTRET:LCALL KEYA ;调用键处理程序,每一次中断对按键进行一次扫描。
LCALL BIN2BCD ;调用转换子程序
LCALL XS_FL ;调用显示闪烁子程序
LCALL DISP ;调用显示子程序
RETI ;=======================================中断子程序出口
;===================================================================================键处理子程序
KEYA: ORL P1,#07H ;置P1.0 、P1.2、P1.3为输入态
MOV A,P1
CPL A ;高电平有效
ANL A,#07H ;屏蔽高5位,保留有效低三位
JZ GRET1 ;无键按下,返回
JBC 00H, KEYAP ;========================================================消抖标志位,1为有键操作
SETB 00H
SJMP GRET ;消抖标志位置1后返回,等到下一次中断时在响应按键操作,从而达到消抖作用。
GRET1: CLR 00H ;==========================================防抖清0
CLR 01H ;==================01H标志位,判键是否已有过操作。键已放开,则键操作标志位请0,从而达到防止对时钟进行连续调整的作用。
GRET: RET ;========================================================键处理子程序出口
KEYAP: JB ACC.0,KA0
JB ACC.1,KA1
JB ACC.2,KA2
SJMP GRET
;====================================================================KA0键处理程序
KA0: JB 01H,CLR21H ;判断KA0键操作是否已有过处理,01H=1,则已处理过;否则没有处理过。
INC 21H ;KA0键每按一次,时钟状态调整一次
MOV A,21H
CJNE A,#4,CLR21H ;到时调整状态时,在按一次KA0键,时钟回到正常运行状态。
MOV 21H,#0
CLR21H:
SETB 01H ;键程序已处理,标志位01H置1
SJMP GRET
;====================================================================KA1键处理程序(加1键)
KA1: JB 01H,N60 ;如KA0键操作已处理,则返回
MOV A,21H ;
CJNE A,#0,N1 ;时钟正常运行状态,则返回
SJMP N60
N60:
SETB 01H ;键程序已处理
SJMP GRET ;程序出口
N1: CJNE A,#2,N2 ;分调整状态
INC 6EH ;
MOV A,6EH
CJNE A,#60,N60
MOV 6EH,#0
SJMP N60
N2: CJNE A,#3,N3 ;时调整状态
INC 6DH ;
MOV A,6DH
CJNE A,#24,N3
MOV 6DH,#0
N3: SJMP N60
;====================================================================KA2键处理程序(减1键)
KA2: JB 01H,DN60 ;如KA1键操作已处理,则返回
MOV A,21H ;
CJNE A,#0,DN1 ;时钟正常运行状态
SJMP DN60
DN60:
SETB 01H ;键程序已处理
SJMP GRET
DN1: CJNE A,#2,DN2 ;分调整状态
DEC 6EH ;
MOV A,6EH
CJNE A,#255,DN60
MOV 6EH,#59
SJMP DN60
DN2: CJNE A,#3,DN3 ;时调整状态
DEC 6DH ;
MOV A,6DH
CJNE A,#255,DN3
MOV 6DH,#23
DN3: SJMP DN60
;====================================================================转换子程序
BIN2BCD:
MOV A,6DH
MOV B,#10
DIV AB
MOV 70H,A
MOV 71H,B
MOV A,6EH
MOV B,#10
DIV AB
MOV 72H,A
MOV 73H,B
MOV A,6FH
MOV B,#10
DIV AB
MOV 74H,A
MOV 75H,B
RET ;===================转换子程序出口
;====================================================================闪烁子程序
XS_FL: MOV A,21H
CJNE A,#0,FL1
SJMP FLRET ;如是时钟运行状态,返回
MFL: MOV 74H,#10
MOV 75H,#10
SJMP FLRET
FL1: CJNE A,#2,FL2 ;分调整状态
JB 02H,MFL1
LCALL BIN2BCD
SJMP FLRET
MFL1: MOV 72H,#10
MOV 73H,#10
SJMP FLRET
FL2: CJNE A,#3,FLRET ;时调整状态
JB 02H,MFL2
LCALL BIN2BCD
SJMP FLRET
MFL2: MOV 70H,#10
MOV 71H,#10
FLRET: RET ;===================闪烁子程序出口
;====================================================================
END ;======================================================================================================程序结束 |