;**********************************************************************:
;项目名称:数字式电子钟
;**********************************************************************;
;堆栈栈底80H;
;**********************************************************************;
;LED数码管显示器设定;
;P0.7---P0.0段控线,接LED的显示段dp,g,f,e,d,c,b,a
;P2.0---P2.7位控线,从左至右(LED7,LED6,LED5,LED4,LED3,LED2,LED1,LED0)
;显示缓冲区设定从左至右依次为78H,79H,7AH,7BH,7CH,7DH,7EH,7FH
;**********************************************************************;
;独立式键盘设定;
;8个按键S2至S9分别依次接在P1.0至P1.7口线;
;**********************************************************************;
;20H字节单元:十六进制,S2键键值01H,S3键键值02H,S4键键值04H,S5键键值08H,S6键键值10H,S7键键值20H,S8键键值40H,S9键键值80H
;**********************************************************************;
;定时器/计数器资源:
;T/C0:工作模式;功能;定时时间;查询或中断
;**********************************************************************;
;中断系统资源;
;T/C0
;**********************************************************************;
;键功能程序;
;KEYA (S2键键功能程序)
;KEYB (S3键键功能程序)
;KEYC (S4键键功能程序)
;KEYD (S5键键功能程序)
;**********************************************************************;
;中断服务程序;
;**********************************************************************;
;常数表格;
;DISBH(系统提示符P.字型代码序号表)
;DISBI(00-00-00字符的代码序号)
;TAB(共阳数码管字型代码表)
;**********************************************************************;
;子程序;
;DL(2毫秒延时子程序)
;DISP(数码管显示子程序)
;KEY(键扫描子程序);
;KEYCHULI(P1口数据处理子程序)
;加1子程序
;**********************************************************************;
;伪指令定义
SEC EQU 30H
MIN EQU 31H
HOUR EQU 32H
SECGE EQU 7FH
SECSHI EQU 7EH
MINGE EQU 7CH
MINSHI EQU 7BH
HOURGE EQU 79H
HOURSHI EQU 78H
;**********************************************************************;
;系统起始程序区
ORG 0000H
START: LJMP MAIN
ORG 000BH
LJMP TC0
;**********************************************************************;
;系统监控程序区
ORG 0030H
MAIN: MOV SP, #80H ;初始化数据
MOV PSW, #00H
MOV TMOD, #01H ;定时器0工作方式1
MOV TH0, #0D8H ;10MS
MOV TL0, #0F0H
SETB EA
SETB ET0
MOV R0, #20H ;RAM区首地址
MOV R7, #5FH ;RAM区单元个数 95个
CHUSHI:MOV @R0, #00H
INC R0 ;将RAM全部清零,初始化
DJNZ R7, CHUSHI
TSF: MOV DPTR, #DISBH ;系统初始化 "P."字符代码表首地址
MOV R5, #08H
MOV R0, #78H
DISPTSF:CLR A
MOVC A, @A+DPTR
MOV @R0, A
INC R0
INC DPTR
DJNZ R5, DISPTSF
D: LCALL DISP ;调显示子程序显示提示符"P."
LCALL KEY
JB 20H.0, KEYA
LJMP D
;**********************************************************************;
;键功能程序区
;S2键功能程序
KEYA: MOV SEC, #0 ;寄存器初始化,秒寄存器
MOV MIN, #0 ;分寄存器
MOV HOUR, #0 ;时寄存器
MOV DPTR, #DISBI ;"00-00-00"字符代码表首地址
MOV R5, #08H
MOV R0, #78H
DISPTSG:CLR A
MOVC A, @A+DPTR
MOV @R0, A
INC R0
INC DPTR
DJNZ R5, DISPTSG
KEYAS: SETB TR0 ;开定时器
DI: LCALL DISP
LCALL KEY
JB 20H.0, CP
LJMP DI
CP: CLR TR0 ;S2键按下,进入调整状态
DD: LCALL DISP
LCALL KEY
JB 20H.0, KEYAS
JB 20H.1, KEYB
JB 20H.2, KEYC
JB 20H.3, KEYD
LJMP DD
;S3键功能程序
KEYB: LCALL HOUR_ ;调时
LC: LCALL DISP
LCALL KEY
JB 20H.0, KEYAS
JB 20H.1, KEYB
JB 20H.2, KEYC
JB 20H.3, KEYD
LJMP LC
;S4键功能程序
KEYC: LCALL MIN_ ;调分
DIIS: LCALL DISP
LCALL KEY
JB 20H.0, KEYAS
JB 20H.1, KEYB
JB 20H.2, KEYC
JB 20H.3, KEYD
LJMP DIIS
;S5键功能程序
KEYD: LCALL SEC_ ;调秒
DISS: LCALL DISP
LCALL KEY
JB 20H.0, KEYAS
JB 20H.1, KEYB
JB 20H.2, KEYC
JB 20H.3, KEYD
LJMP DISS
;中断服务程序
TC0: PUSH ACC
PUSH B
PUSH PSW
SETB RS1
CLR RS0
MOV TH0, #0D8H
MOV TL0, #0F0H
INC 33H
MOV A, 33H
CJNE A, #100, RE
MOV 33H, #0
INC SEC
MOV A, SEC
MOV B, #10
DIV AB
MOV SECSHI,A
MOV SECGE, B
MOV A, SEC
CJNE A, #60, RE
INC MIN
MOV SEC, #00H
MOV SECGE, #0
MOV SECSHI,#0
MOV A, MIN
MOV B, #10
DIV AB
MOV MINSHI, A
MOV MINGE, B
MOV A, MIN
CJNE A, #60, RE
INC HOUR
MOV MIN, #00H
MOV MINGE, #0
MOV MINSHI,#0
MOV A, HOUR
MOV B, #10
DIV AB
MOV HOURSHI,A
MOV HOURGE, B
MOV A, HOUR
CJNE A, #24, RE
MOV HOUR, #0
MOV HOURGE,#0
MOV HOURSHI,#0
RE: POP PSW
POP B
POP ACC
REti
;延时1毫秒子程序
DL: PUSH PSW
SETB RS1
SETB RS0
MOV R7, #02H
DL1: MOV R6, #0FFH
DL2: DJNZ R6, DL2
DJNZ R7, DL1
POP PSW
RET
;显示子程序
;入口: 77H,78H,79H,7AH,7BH,7CH,7DH,7EH,7FH,
DISP: PUSH DPH
PUSH DPL
PUSH ACC
PUSH PSW
CLR RS1 ;改变当前寄存器组为组1
SETB RS0
MOV R1, #78H ;显示缓冲存储单元首地址
MOV R2, #0FEH ;从右至左显示,共阳极
DISP1:MOV A, @R1
MOV DPTR, #TAB
MOVC A, @A+DPTR
MOV P0, A ;送段控
MOV P2, R2 ;送位控
LCALL DL ;延时2毫秒 为什么这里要延时
MOV A, R2
JNB ACC.7, DISP2 ;为0转移;
RL A
INC R1
MOV R2, A
LJMP DISP1
DISP2: POP PSW ;恢复当前寄存器组的组号
POP ACC
POP DPL
POP DPH
RET
;键扫描子程序
KEY: LCALL KEYCHULI ;调P1口数据处理子程序
JZ EXIT ;没有键按下,转返回
LCALL DISP ;调显示子程序去抖动
LCALL DISP
LCALL KEYCHULI ;调P1口数据处理子程序
JZ EXIT ;没有键按下,转返回
MOV B, 20H ;保存取反后的键值
KEYSF: LCALL KEYCHULI ;调P1口数据处理子程序
JZ KEY1 ;键释放,转恢复键值
LCALL DISP ;调显示子程序延时
LJMP KEYSF ;等待释放
KEY1: MOV 20H, B ;键值送20H保存
EXIT: RET ;子程序返回
;P1口数据处理子程序
KEYCHULI:PUSH PSW ;保护现场
CLR RS1 ;改变当前寄存器组为组1
SETB RS0
MOV P1, #0FFH ;先向P1口写1
MOV A, P1 ;读P1口数据
CPL A ;P1口数据取反
MOV 20H, A ;保存取反后的键值
CLR RS1 ;恢复当前寄存器组为组0
CLR RS0
POP PSW ;恢复现场
RET ;子程序返回
;加1子程序
SEC_: INC SEC
MOV A, SEC
MOV B, #10
DIV AB
MOV SECSHI, A
MOV SECGE, B
MOV A, SEC
CJNE A, #60, EXI
MOV SEC, #0
MOV SECGE, #0
MOV SECSHI, #0
LJMP EXI
MIN_: INC MIN
MOV A, MIN
MOV B, #10
DIV AB
MOV MINSHI, A
MOV MINGE, B
MOV A, MIN
CJNE A, #60, EXI
MOV MIN, #0
MOV MINGE, #0
MOV MINSHI, #0
LJMP EXI
HOUR_: INC HOUR
MOV A, HOUR
MOV B, #10
DIV AB
MOV HOURSHI, A
MOV HOURGE, B
MOV A, HOUR
CJNE A, #24, EXI
MOV HOUR, #0
MOV HOURGE, #0
MOV HOURSHI, #0
EXI: RET
;常数表格区------------------------------------------------------------
;系统初始化后提示符"P."字符代码表
DISBH: DB 11H,10H,10H,10H,10H,10H,10H,10H ;"P."字符序号
DISBI: DB 00H,00H,12H,00H,00H,12H,00H,00H
;显示字符段选码表(共阳极代码)
TAB: DB 0C0H, 0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H ;0-8
DB 90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,0BFH;9,A,B,C,D,E,F,灭,p. END
|