;****************************************************************
;项目名称: 数字式秒表设计;功能要求:数字式秒表上电或按键复位后能自动显示系统提示符“P.”,进入准备工作状态。该数字式秒表应具有开始、暂停、连续、清零和停止功能。
;****************************************************************
;堆栈栈底2FH;
;****************************************************************
;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口线;
;****************************************************************
;独立式键盘设定与功能;
;8个按键S1至S8分别依次接在P1.0至P1.7口线;
;S1的功能为复位
;S2的功能为启动/停止(标识符为22H.0当它为1时启动,为0时停止)
;S3的功能为暂停/继续(标识符为22H.1当它为1时暂停,为0时继续)
;S4的功能为清零
;****************************************************************
;定时器/计数器资源:
;T/C0:工作模式1;功能;定时时间;查询或中断
;****************************************************************
;中断系统资源;
;T/C0
;****************************************************************
;键功能程序;
;K1 (S2键键功能程序)
;K2 (S3键键功能程序)
;K3 (S4键键功能程序)
;********************************************************
;中断服务程序
;********************************************************
;常数表格;
;DISBH(系统提示符P.字型代码序号表)
;DISBI(00-00-00字符的代码序号)
;TAB (共阳数码管字型代码表)
;********************************************************
;子程序;
;DL (1毫秒延时子程序)
;DISP (数码管显示子程序)
;KEY (键扫描子程序);
;KEYCL (P1口数据处理子程序)
;ADD01 (加1子程序)
;*********************************************************
ORG 0000H
START: LJMP MAIN
ORG 000BH
LJMP ZHD
ORG 0030H
MAIN: MOV PSW, #00H
MOV SP, #2FH ;确立堆栈区
MOV R0, #20H ;RAM区首地址
MOV R7, #96 ;RAM区单元个数
MOV TMOD, #01H
SETB EA
SETB ET0
ML: MOV @R0, #00H
INC R0
DJNZ R7, ML
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
KEY0: LCALL DISP
LCALL KEY
JB 20H.0, K1
JB 20H.1, K2
JB 20H.2, K3
LJMP KEY0
KEY00: LCALL KEY
LCALL DISP
JB 20H.2, K3
LJMP KEY00
K1: JB 22H.1, KEY0
CPL 22H.0
JB 22H.0, 01 ;高电平则计时
CLR TR0 ;低电平则停止
LCALL DISP
LJMP KEY00
K01: MOV 7AH, #12H ;从零开始计时
MOV 7DH, #12H
MOV 7FH, #10H
MOV 79H, #00H
MOV 7BH, #00H
MOV 7CH, #00H
MOV 7EH, #00H
MOV 7FH, #00H
LCALL DISP
MOV TH0, #0D8H
MOV TL0, #0F0H
SETB TR0 ;启动定时器
LJMP KEY0
K2: JB 22H.0, K21 ;判断秒表是否启动,如不是启动状态则此次按键无效
LJMP KEY0
K21: CPL 22H.1
JB 22H.1, K22
SETB TR0 ;继续计时
LJMP KEY0
K22: CLR TR0 ;暂停秒表
LCALL DISP
LJMP KEY0
K3: JB 22H.0, KEY0 ;只有当停止是,清零键才有效
MOV R0, #79H ;秒表清零
LCALL CLR0
MOV R0, #7CH
LCALL CLR0
MOV R0, #7FH
LCALL CLR0
LJMP KEY0
ZHD: PUSH PSW
PUSH ACC
MOV TMOD, #01H ;定时器以工作方式1工作
SETB RS1 ;设定组号为2组
CLR RS0
MOV TH0, #0D8H
MOV TL0, #0F0H
MOV R0, #79H
LCALL ADD01
CJNE R2, #99, RETT ;判断100毫秒到没
MOV R0, #7CH
LCALL ADD01
CJNE R2, #60, RETT ;判断60秒到没
LCALL CLR0
MOV R0, #7FH
LCALL ADD01
CJNE R2, #60, RETT ;判断60分到没
LCALL CLR0
RETT: POP ACC
POP PSW
RETI
;*******************************************************
;常数表格区
;系统初始化后提示符“P.”字符代码表;
DISBH: DB 10H,10H,10H,10H,10H,10H,10H,11H;提示符“P.”字符序号显示字符段选码表(共阳极代码)
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.,-
;*******************************************************
;子程序区;
ADD01: MOV A, @R0
DEC R0
SWAP A
ORL A, @R0
ADD A, #01H
DA A
MOV R2, A
ANL A, #0FH
MOV @R0, A
MOV A, R2
ANL A, #0F0H
SWAP A
INC R0
MOV @R0, A
RET
CLR0 : MOV @R0, #00H
DEC R0
MOV @R0, #00H
RET
;键扫描子程序
KEY: LCALL KEYCL ;调P1口数据处理子程序
JZ EXIT ;没有键按下,转返回
LCALL DISP ;调显示子程序去抖动
LCALL DISP
LCALL KEYCL ;调P1口数据处理子程序
JZ EXIT ;没有键按下,转返回
MOV B, 20H ;保存取反后的键值
KEYSF: LCALL KEYCL ;调P1口数据处理子程序
JZ KEY1 ;键释放,转恢复键值
LCALL DISP
LCALL DISP ;调显示子程序延时
LJMP KEYSF ;等待释放
KEY1: MOV 20H, B ;键值送20H保存
EXIT: RET
;子程序返回
;P1口数据处理子程序
KEYCL: 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 ;子程序返回
;显示子程序
;入口: 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, #01H ;从右至左显示
MOV R5, #08H ;循环次数,即驱动数码管的位数
DISP1: MOV A, @R1
MOV DPTR, #TAB
MOVC A, @A+DPTR
MOV P0, A ;送段控
MOV P2, R2 ;送位控
LCALL DL ;延时1毫秒
MOV A, R2 ;位控码送A
RL A ;获得新的位控码
MOV R2, A ;保存新的位控码
INC R1 ;获得新的显示缓冲单元地址
DJNZ R5, DISP1 ;循环没有结束则继续
DISP2: POP PSW ;恢复现场
POP ACC
POP DPL
POP DPH
RET
;延时1ms子程序(晶振频率12MHz)DL
DL: MOV R7, #01H
DL1: MOV R6, #8EH
DL0: MOV R5, #02H
DJNZ R5, $
DJNZ R6, DL0
DJNZ R7, DL1
RET
END
|