📄 2005-7简易电子钟的设计源程序.txt
字号:
简易电子钟的设计源程序
5 简易电子钟程序清单
键盘设定:
A键(启动/调整)接P1.0;
B键(时加1)接P1.1;
C键(分加1)接P1.2;
D键(秒加1)接P1.3。
显示器设定:
P0.7~P0.0段控线,接LED的显示段dp,g,f,e,d,c,b,a;
P2.5~P2.0位控线,从左至右(LED5,LED4,LED3,LED2,LED1,LED0)。
定时器/计数器的设定:
定时器/计数器0,定时功能,工作方式1,提供125毫秒的定时时间。
系统中断源的设定:
定时器/计数器0溢出中断8次即得到秒计时单位。
内部数据存储单元定义:
内部RAM 7EH,7DH,7CH,7BH,7AH,79H作LED5~LED0的显示缓冲存储单元;
INTCISHU EQU 46H ;计数溢出次数,即1秒计时的溢出次数;
20H(存放取反后的键值)
SECGE EQU 30H ;秒个位存储单元
SECSH EQU 31H ;秒十位存储单元
MINGE EQU 32H ;分个位存储单元
MINSH EQU 33H ;分十位存储单元
HOUGE EQU 34H ;时个位存储单元
HOUSH EQU 35H ;时十位存储单元
位定义:
KEYAA BIT 20H.0 ;A键处理结果位标志
KEYBB BIT 20H.1 ;B键处理结果位标志
KEYCC BIT 20H.2 ;C键处理结果位标志
KEYDD BIT 20H.3 ;D键处理结果位标志
堆栈设定:
栈底:内部RAM 60H。
子程序功能表:
DISP(显示子程序);
DISP0(时钟单元内容送显示缓冲单元子程序);
KEY(键盘扫描子程序);
KEYCHULI(键处理子程序);
DL(延时2毫秒子程序);
CLR0(时钟十位、个位数缓冲单元清0子程序);
DAAD1(十进制加1子程序)。
键功能程序:
ADDHOUR(B键处理(时加1));
ADDMIN(C键处理(分加1));
ADDSEC(D键处理(秒加1))。
中断服务程序功能表:
PITO(定时器/计数器0中断服务程序)。
常数、表格首地址:
系统初始化后提示符“P.”字符代码表首地址(DISBH);
显示字符段选码表(共阳极代码首地址TAB)。
程序清单
ORG 0000H
START: AJMP MAIN
ORG 000BH
LJMP PITO
ORG 0030H
MAIN: MOV SP, #60H ;确立堆栈区
MOV PSW, #00H
MOV R0, #20H ;RAM区首地址
MOV R7, #5FH ;RAM区单元个数
ML: MOV @R0, #00H
INC R0
DJNZ R7, ML
MOV TMOD, #01H ;定时器/计数器0,工作方式1
MOV TL0, #0DCH ;装计数初值
MOV TH0, #0BH
CLR TR0 ;关闭定时器/计数器0
SETB EA ;EA置1,中断总允许
CLR ET0 ;ET0清0,定时器/计数器0中断禁止
MOV INTCISHU, #08H ;计数溢出次数,即1秒计时的溢出次数
TSF: MOV DPTR, #DISBH ;系统提示符“P.”字符代码表首地址
MOV R5, #06H
MOV R0, #79H
DISPTSF:CLR A
MOVC A, @A+DPTR
MOV @R0, A
INC R0
INC DPTR
DJNZ R5, DISPTSF
LCALL DISP ;调显示子程序显示提示符“P.”
KEY1: LCALL KEY ;调键盘扫描子程序
JZ TSF
JNB KEYAA, TSF ;A键没按下,则转TSF
KEYSFSF:LCALL KEYCHULI ;判A键释放
JZ YUNXIN
LCALL DISP
LJMP KEYSFSF
YUNXIN: SETB TR0 ;启动定时器/计数器0
SETB ET0 ;定时器/计数器0中断允许,进入时钟运行状态
LCALL DISP0
LCALL DISP
LCALL KEY
JZ YUNXIN
JNB KEYAA, YUNXIN
KEYSF: LCALL KEYCHULI ;判A键释放
JZ SETCLK
LCALL DISP0
LCALL DISP
LJMP KEYSF
SETCLK: CLR TR0 ;关闭定时器/计数器0,进入时钟调整状态
LCALL DISP0
LCALL DISP
LCALL KEY ;调键扫
JZ SETCLK
JNB KEYAA, A1
KEYSF0: LCALL KEYCHULI ;判A键释放
JZ YUNXIN ;进入时钟运行状态
LCALL DISP0
LCALL DISP
LJMP KEYSF0
A1: JNB KEYBB, A2
KEYSF1: LCALL KEYCHULI
JZ ADDHOUR ;转B键处理(时加1),处理完毕转SETCLK
LCALL DISP0
LCALL DISP
LJMP KEYSF1
A2: JNB KEYCC, A3
KEYSF2: LCALL KEYCHULI
JZ ADDMIN ;转C键处理(分加1),处理完毕转SETCLK
LCALL DISP0
LCALL DISP
LJMP KEYSF2
A3: JNB KEYDD, A4
KEYSF3: LCALL KEYCHULI
JZ ADDSEC ;转D键处理(秒加1),处理完毕转SETCLK
LCALL DISP0
LCALL DISP
LJMP KEYSF3
A4: LCALL DISP0
LCALL DISP
LJMP SETCLK
ADDHOUR(B键处理(时加1))功能程序
ADDHOUR: LCALL DISP0
LCALL DISP
MOV R0, #HOUSH ;时十位存储单元地址
LCALL DADD1
MOV A, R2
XRL A, #24H ;判是否到24时
JNZ ADDHOUR1 ;不到,转ADDHOUR1
LCALL CLR0 ;到24时,时显示缓冲单元清0
ADDHOUR1: LCALL DISP0
LCALL DISP
LJMP SETCLK ;不跳出时钟调整状态
ADDMIN(C键处理(分加1))功能程序
ADDMIN: LCALL DISP0
LCALL DISP
MOV R0, #MINSH ;分十位存储单元地址
LCALL DADD1
MOV A, R2
XRL A, #60H ;判是否到60分
JNZ ADDMIN1 ;不到,转ADDMIN1
LCALL CLR0 ;到60分,分显示缓冲单元清0
ADDMIN1: LCALL DISP0
LCALL DISP
LJMP SETCLK ;不跳出时钟调整状态
ADDSEC(D键处理(秒加1))功能程序
ADDSEC: LCALL DISP0
LCALL DISP
MOV R0, #SECSH ;秒十位存储单元地址
LCALL DADD1 ;十进制秒加1
MOV A, R2
XRL A, #60H ;判是否到60秒
JNZ ADDSEC1 ;不到,转ADDSEC1
LCALL CLR0 ;到60秒,秒显示缓冲单元清0
ADDSEC1: LCALL DISP0
LCALL DISP
LJMP SETCLK ;不跳出时钟调整状态
键盘扫子程序KEY
出口:A,20H(存放取反后的键值)
KEY: LCALL KEYCHULI ;调键处理子程序
JZ EXIT
LCALL DISP ;去抖动
LCALL DISP
LCALL KEYCHULI ;调键处理子程序
EXIT: RET
键处理子程序KEYCHULI
出口:A,20H(存放取反后的键值)
KEYCHULI: PUSH PSW ;保护现场
CLR RS1
SETB RS0
MOV P1, #0FFH ;先向P1口写1
MOV A, P1
CPL A
ANL A, #0FH ;屏蔽P1口高4位
MOV 20H, A ;保存取反后的键值
POP PSW ;恢复现场
RET
显示子程序DISP
入口:显示缓冲单元79H、7AH、7BH、7CH、7DH、7EH(LED0、LED1、LED2、LED3、LED4、LED5)
P0.7~P0.0段控线,接LED的显示段dp、g、f、e、d、c、b、a
P2.5~P2.0位控线,从左至右(LED5、LED4、LED3、LED2、LED1、LED0)
DISP: PUSH DPH ;现场保护
PUSH DPL
PUSH ACC
PUSH PSW
CLR RS1
SETB RS0
MOV R1, #79H ;显示缓冲单元首地址
MOV R2, #01H ;从右至左开始扫描
DISP1: MOV A, @R1
MOV DPTR, #TAB
MOVC A, @A+DPTR
MOV P0, A ;送段控
MOV P2, R2 ;送位控
LCALL DL ;延时2毫秒
MOV A, R2
JB ACC.5, DISP2
RL A
INC R1
MOV R2, A
AJMP DISP1
DISP2: POP PSW ;恢复现场
POP ACC
POP DPL
POP DPH
RET
系统初始化后提示符“P.”字符代码表
DISBH: DB 10H,10H,10H,10H,10H,11H;提示符“P.”字符序号
显示字符段选码表(共阳极代码)
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;0~DL
DL: SETB RS1
SETB RS0
MOV R7, #02H
DL1: MOV R6, #0FFH
DL2: DJNZ R6, DL2
DJNZ R7, DL1
CLR RS1
SETB RS0
RET
时钟单元内容送显示缓冲单元子程序DISP0
入口:时钟存储单元 (35H~30H)
出口:显示缓冲单元 (7EH~79H)
DISP0: CLR RS1 ;保护现场
SETB RS0
PUSH ACC
PUSH PSW
MOV R6, #06H
MOV R1, #SECGE ;秒个位存储单元地址
MOV R0, #79H ;秒个位显示缓冲存储单元地址
DISP3: MOV A, @R1
MOV @R0, A
INC R1
INC R0
DJNZ R6, DISP3
POP PSW ;恢复现场
POP ACC
RET
中断服务程序PITO
定时器/计数器0,定时功能,工作方式1,提供125毫秒的定时时间,定时器/计数器0溢出中断8次即得到秒计时单位。
SECGE EQU 30H ;秒个位存储单元
SECSH EQU 31H ;秒十位存储单元
MINGE EQU 32H ;分个位存储单元
MINSH EQU 33H ;分十位存储单元
HOUGE EQU 34H ;时个位存储单元
HOUSH EQU 35H ;时十位存储单元
INTCISHU EQU 46H ;要求的计数溢出次数,即1秒计时的溢出次数
PITO: PUSH DPL ;现场保护
PUSH DPH
PUSH PSW
PUSH ACC
SETB RS1
SETB RS0
MOV TL0, #0DCH ;装计数初值
MOV TH0, #0BH
MOV A, INTCISHU ;溢出次数减1
DEC A
MOV INTCISHU,A
JNZ RET0 ;不满8次,转RET0返回
MOV INTCISHU,#08H ;满8次,开始计时操作
MOV R0, #SECSH ;秒十位存储单元地址
LCALL DADD1 ;十进制秒加1
MOV A, R2
XRL A, #60H ;判是否到60秒
JNZ RET0 ;不到,转RET0返回
LCALL CLR0 ;到60秒,秒显示缓冲单元清0
MOV R0, #MINSH ;分十位存储单元地址
LCALL DADD1 ;十进制分加1
MOV A, R2
XRL A, #60H ;判是否到60分
JNZ RET0 ;不到,转RET0返回
LCALL CLR0 ;到60分,分显示缓冲单元清0
MOV R0, #HOUSH ;时十位存储单元地址
LCALL DADD1 ;十进制时加1
MOV A, R2
XRL A, #24H ;判是否到24时
JNZ RET0 ;不到,转RET0返回
LCALL CLR0 ;到24时,时显示缓冲单元清0
RET0: POP ACC ;恢复现场
POP PSW
POP DPH
POP DPL
RETI
十进制加1子程序DADD1
入口:R0 出口:R0,R2
DADD1: MOV A, @R0
DEC R0
SWAP A ;十位数占高4位
ORL A, @R0 ;个位数占低4位
ADD A, #01H
DA A
MOV R2, A ;全值暂存R2中
ANL A, #0FH
MOV @R0, A ;个位值送显示缓冲单元
MOV A, R2
INC R0
ANL A, #0F0H
SWAP A
MOV @R0, A ;个位值送显示缓冲单元
RET
时钟十位、个位数缓冲单元清0子程序CLR0
入口:R0 出口:R0
CLR0: CLR A
MOV @R0, A ;十位数缓冲单元清0
DEC R0
MOV @R0, A ;个位数缓冲单元清0
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -