资源描述
大连理工大学本科设计报告
题目:基于7290的LED时钟系统设计
课程名称: 单片机综合设计
学院(系): 电子信息与电气工程学部
专 业: 电子信息工程
班 级 电子0804
学 号: 200801204
学生姓名: 宋陆阳
成 绩:
2011 年 05 月 23 日
题目:基于7290的LED时钟系统设计
1 设计要求
1)显示功能:
a.用开关K1\K2切换用8位数码管显示当前“时-分-秒”;
b.用开关K1\K2切换用8位数码管显示当前“年-月-分”;
c.用开关K1\K2切换用8位数码管显示报警“日.时-分”。
2)修改功能:
a.能够通过按键操作修改当前时、分、秒并显示;
b.能够通过按键操作修改报警时、分并显示。
3) 错误提示功能:
当输入修改值不符合时间合法数值时即时大于24,分大于60,秒大于60,提示"Error"错误,并返回正常走表。
4)报警功能:
a.整点报时功能:59分55秒开始每秒响一下,且00秒频率提高;
b.定时报警:当当前走表时间与所设置的报警时间一致时,驱动蜂鸣器产生“DO.RA.MI.FA.SO.LA.XI.DUO.”的铃音进行定时报警。
2 设计分析及系统方案设计
1. 主程序结构:无限循环结构.
完成初始化功能:进行7290复位,初始化PCF8563T的时间数据,对中断INT0,INT1进行工作方式设置,开中断,并进入无限循环且等待中断产生.
2.中断INT0:顺序结构
每秒钟PCF8567的CLKOUT产生一个中断,从PCF8563T中读入数据进行调整拆分送入内存,时钟秒加一并显示,当K1=1,K2=1时,8位数码管显示当前“时-分-秒”;当K1=0时,8位数码管显示当前“年-月-分”;K1=1,K2=0时,8位数码管显示报警“日.时-分”.
判断当前时间是否为整点,若是,则从59分55秒开始每秒钟驱动蜂鸣器每秒响1000HZ铃音0.5秒,00秒频率提高;
判断当前时间是否与所设置报警时间相同,若满足要求,则驱动蜂鸣器产生一个“DO.RA.MI.FA.SO.LA.XI.DUO.”的铃声。
3.中断INT1:顺序结构
当有按键操作时产生中断。
读取键值,当按链介于“A—E”选择需修改的内容:A:修改当前时间“时”;B:修改当前时间“秒”;C:修改当前时间“分”;D:修改报警时间“时”;E:修改报警时间“分”,然后等待输入2次按键"0-9"所修改数据,当输入数据部符合时间格式时,即时大于24,分大于60,秒大于60,显示提示“Error”并返回主程序,当输入数据符合正常时间格式时,回显,并退出中断;若输入其它键则无操作退出中断.
3 系统电路图
ZLG7290B
PCF8563T
4 外围接口模块硬件电路功能描述
P3.2接PC8567的CLKOUT,每秒产生一次中断;
P3.3接ZLG7290B,当有按键操作时产生中断;
P1.3接蜂鸣器;
P1.2接开关K1,选择切换显示当前“时分秒”或“年月日”;
P1.4接开关K2,选择切换显示当前时间或报警“日时分”;
P1.7接ZLG7290复位键;
P1.0接I2C通讯线SDA;
P1.1接I2C通讯线SCK。
89C51:
89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器,89C2051是它的一种精简版本。89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
ZLG7290B:
ZLG7290B是广州周立功单片机发展有限公司自行设计的数码管动态显示驱动、建键盘扫描管理芯片。能够驱动8位共阴极结构的LED数码管或64位独立的LED,同时还能扫描管理多达64个按键(S1-S56、F0-F7)的扫描识别。其中8只健(F0-F7)可以作为功能键使用就像电脑键盘上的Ctrl、Shift、Alt键一样。另外ZLG7290B 内部还设置有连击计数器,能够使某些按键按下后不松手而连续有效。接口采用I2C结构。该芯片为工业级芯片,被广泛运用于仪器仪表等工业测量领域的电路设计中。
特点:直接驱动1英寸以下的8位LED共阴极数码管或独立的64位LED ;能够管理多达64只按键。具有自动去抖,其中8只按键可直接作为功能键使用;段电流可达20mA。位电流可达100mA以上;利用外接功率驱动器可以驱动一英寸以上的大型数码管;具有闪烁、段点亮、段熄灭、功能键、连击计数等功能;提供10种数字、21种字母的译码显示功能,也可以将字形码写入显示寄存器直接显示数据;系统仅使用键盘电路时,工作电流为1mA;与主控器之间采用I2C 接口,仅需两条信号线;工作电压范围:+3.3~+5.5V;工作温度范围:-40℃~+85℃;封装:DIP24(窄体) 或SOP-24.
PCF8563T:
PCF8563T 是低功耗CMOS实时时钟/日历芯片,它具有一个可编程的时钟输出,一个中断输出和掉电检测电路,与外部主控器之间通过I2C总线连接。最大总线速度为400KHZ。每次对其的读写操作内部的地址寄存器都会自动产生增量。PCF8563T内部具有16个8位的寄存器;一个可自动增量的地址寄存器;一个32.768KHZ的振荡器(具有集成的补偿电容),一个用与为实时时钟RTC提供时钟源的分频器;一个可编程的时钟输出电路;一个定时器;一个报警器;一个掉电检测电路和一个400KHZ的I2C总线接口
5 主程序中主要变量定义
变量名称
RAM单元/寄存器
功能
当前时间值
10H-1DH
程序初始时存储初始时间,
当运行后存当前时间
PC8563时间
20H-29H
存储从PC8563中读出当前的时间参数
当前时间1
30H-37H
存储处理无效位后当前日、月、年信息
当前时间2
38H-3FH
存储处理无效位后当前秒、时、分信息
报警时间
40H-47H
存储处理无效位后报警日、时、分信息
Data
50H-57H
存储“Error”的查表信息
数据个数
R7
I2C操作时读入数据个数
目标地址
R0
I2C操作时目标数据块首址
器件地址
R2
I2C操作时器件内部从地址
写地址
R3
I2C写操作时地址
读地址
R4
I2C读操作时地址
6 系统软件中各个子程序的功能描述
子程序名称
入口参数
出口参数
功能 描述
INT_RCT
无
无
走表中断子程序,并且
判断整点闹铃以及报警
INT_7290
无
无
按键中断子程序,
修改当前“时分秒”或者报警“时分”可以进行输入错误提示,回显等功能
ALARM
无
无
产生0.5秒1000HZ音频
ALARM1
R5、R6
无
产生指定频率音频0.5秒
CHAFEN
20H-2AH
30H-47H
对20H-2AH数据进行拆分
CF
A
R3、R4
把A拆分成独立BCD码
ADJUST
20H-26H
20H-26H
屏蔽PCF8563读出无关位
DIS_ERR
无
无
LED显示“Error”
RDKEY
无
A
读按键值
WR8563
写8563操作
DELAY
无
无
延时子程序
7 主程序程序流程图
开辟一个数据区10H-1DH存储时间、data-data+7存储显示命令参数
等待中断
主程序流程图
主程序
将10H-1DH存储时间、命令参数送PCF8563T中
A键?
查询按键?
按键定义
A键:修改小时
B键:修改分;
C键:修改秒;
D键:修改按键时;
E键:修改按键分;
Y
Y
N
Y
INT1
读取键值
查询按键?
N
读取键值
送小时的位
RETI
N
C键?
B键?
当前分钟处理
( 同小时
处理 )
当前秒处理
( 同小时
处理 )
开中断
Y
N
关中断
Y
Y
N
调拆分、查表送28H-2FH
送7290调显示
N
将51的10H-1DH的数据送PCF8563T
D键?
报警时处理
( 同小时
处理 )
D键?
报警时处理
( 同小时
处理 )
N
Y
Y
N
数据合法
N
Y
读取键值
送小时的时位
数据合法
Y
N
调程序显示"Error"
按键中断INT_7290
利用RDADD从PCF8563T中读出时间参数送20H-2AH
利用ADJUST屏蔽掉参数中的无用的位
中断服务NINTernetINTernet
调CHAFEN子程序将时间分别送28H-2FH、38H-3FH缓冲区
P1.2=1?
RETI
显示时分秒
显示年月日
N
Y
报警时间到
整点时间到
P1.4=1?
显示报警日时分
产生报警闹铃
产生整点闹铃
Y
Y
N
N
终端服务INT0 闹铃1000HZ,0.5ms ALARM:
程序入口
PUSH PSW
PUSH 07H
T0.T1初始化
R7←10
启动T0.T1
N
TF0=1?
Y
T0初值,TF0←0
驱动BUZZ
N
Y
TF1=1?
T1初值,TF1←0
N
R7-1→R7 R7=0?
Y
关闭T0.T1
POP 07H
POP PSW
8 程序清单
SDA BIT P1.0 ;定义I2C信号引脚
SCL BIT P1.1
WSLA EQU 070H
RSLA EQU 071H
DISDA EQU 20H ;源数据块首地址
DISCON EQU 08H ;写入数据个数
DATA_1 EQU 50H ;变量区首地址
WSLA_8563 EQU 0A2H ;PCF8563口地址
RSLA_8563 EQU 0A3H
WSLA_7290 EQU 70H ;ZLG7290口地址
RSLA_7290 EQU 71H
ORG 8000H
LJMP 8100H
ORG 8003H
LJMP INT_RCT
ORG 8100H
ORG 8013H
LJMP INT_7290
ORG 8100H
START: MOV SP,#60H
CLR P1.7 ;7290复位
LCALL DELAY
SETB P1.7
;***********************************************************
;设定PCF8563的时间和命令参数(参数和控制命令缓冲区10H-1DH)
;***********************************************************
MOV 10H,#00H ;启动控制字
MOV 11H,#1FH ;设置报警及定时器中断
MOV 12H,#55H ;秒单元
MOV 13H,#37H ;分单元
MOV 14H,#10H ;小时单元
MOV 15H,#26H ;日期单元
MOV 16H,#03H ;星期单元
MOV 17H,#05H ;月单元
MOV 18H,#10H ;年单元
MOV 19H,#36H ;设定分报警
MOV 1AH,#10H ;设定小时报警
MOV 1BH,#26H ;设定日报警
MOV 1CH,#03H ;设定星期报警
MOV 1DH,#83H ;设定CLKOUT的频率(1S)
MOV DATA_1, #13H ;变量缓冲区(显示 "Error " )
MOV DATA_1+1,#13H ;注意:
MOV DATA_1+2,#13H ;变量取值范围0-F
MOV DATA_1+3,#11H
MOV DATA_1+4,#12H
MOV DATA_1+5,#11H
MOV DATA_1+6,#11H
MOV DATA_1+7,#10H
;************************************************************
MOV R7,#0EH ;写入参数个数(时间和控制字)
MOV R0,#10H ;参数和控制命令缓冲区首地址
MOV R2,#00H ;从器件内部从地址
MOV R3,#WSLA_8563 ;准备向PCF8563T写入数据串
LCALL WRNBYT ;写入时间、控制命令到8563
SETB EA
MOV TCON,#00H
SETB EX0
CLR IT0
SETB EX1
SETB IT1
SJMP $ ;等待中断
;*************************************************************
; 中断服务INT_RCT子程序
;***************************************************************
INT_RCT:MOV R7,#0AH ;读出数个数
MOV R0,#20H ;目标数据块首址
MOV R2,#02H ;从器件内部从地址
MOV R3,#WSLA_8563
MOV R4,#RSLA_8563;准备读PCF8563T的时间参数
LCALL RDADD ;调读数据子程序,将读出的数据
;存放于单片机20-26H中
LCALL ADJUST ;调时间调整子程序
MOV 12H,20H
MOV 13H,21H
MOV 14H,22H
MOV 19H,27H
MOV 1AH,28H
MOV 1BH,29H
LCALL CHAFEN ;调拆分子程序(包含查表)
MOV A,22H ;判断是否到定时时间
CJNE A,28H,MMBUY
MOV A,21H
CJNE A,27H,MMBUY
MOV A,#00H
CJNE A,20H,MJ_1
MOV R5,#21H
MOV R6,#0F9H
CALL ALARM1
MJ_1: MOV A,#01H
CJNE A,20H,MJ_2
MOV R5,#0E0H
MOV R6,#0F9H
CALL ALARM1
MJ_2: MOV A,#02H
CJNE A,20H,MJ_3
MOV R5,#8BH
MOV R6,#0FAH
CALL ALARM1
MJ_3: MOV A,#03H
CJNE A,20H,MJ_4
MOV R5,#0D7H
MOV R6,#0FAH
CALL ALARM1
MJ_4: MOV A,#04H
CJNE A,20H,MJ_5
MOV R5,#67H
MOV R6,#0FBH
CALL ALARM1
MJ_5: MOV A,#05H
CJNE A,20H,MJ_6
MOV R5,#0E8H
MOV R6,#0FBH
CALL ALARM1
MJ_6: MOV A,#06H
CJNE A,20H,MJ_7
MOV R5,#5BH
MOV R6,#0FCH
CALL ALARM1
MJ_7: MOV A,#07H
CJNE A,20H,MMBUY
MOV R5,#8EH
MOV R6,#0FCH
CALL ALARM1
MMBUY: MOV A,#59H ;判断是否整点
CJNE A,21H,LC
MOV A,#55H
CJNE A,20H,LC_1
LCALL ALARM
LC_1: MOV A,#56H
CJNE A,20H,LC_2
CALL ALARM
LC_2: MOV A,#57H
CJNE A,20H,LC_3
CALL ALARM
LC_3: MOV A,#58H
CJNE A,20H,LC_4
CALL ALARM
LC_4: MOV A,#59H
CJNE A,20H,LC
CALL ALARM
LC: MOV A,#00H
CJNE A,21H,LCC
CJNE A,20H,LCC
MOV R5,#44H
MOV R6,#0FEH
CALL ALARM1
LCC: MOV R7,#08H
MOV R2,#10H
MOV R3,#WSLA_7290
JNB P1.2,YEARS ;使用P1.2控制显示内容
JNB P1.4,BAOJIN
MOV R0,#38H ;显示小时、分钟和秒
SJMP DISP
YEARS: MOV R0,#30H ;显示年、月和日期
SJMP DISP
BAOJIN: MOV R0,#40H
DISP: LCALL WRNBYT ;调7290显示
JNB P3.2,$
RETI
;**************************************************************
;ALARM
;**************************************************************
ALARM: PUSH PSW ;产生0.5秒1000HZ音频
PUSH 07H
MOV TMOD,#11H
MOV TL0,#33H
MOV TH0,#0FEH
MOV TL1,#0FCH
MOV TH1,#4BH
SETB TR0
SETB TR1
LOOPC: JNB TF0,$
MOV TL0,#33H
MOV TH0,#0FEH
CLR TF0
CPL P1.3
JB TF1,LOOPC
MOV TL1,#0FCH
MOV TH1,#4BH
CLR TF1
DJNZ R7,LOOPC
CLR TR0
CLR TR1
POP 07H
POP PSW
RET
ALARM1:PUSH PSW ;产生指定频率音频0.5秒
PUSH 07H
MOV TMOD,#11H
MOV TL0,R5
MOV TH0,R6
MOV TL1,#0FCH
MOV TH1,#4BH
SETB TR0
SETB TR1
LOOPD: JNB TF0,$
MOV TL0,R5
MOV TH0,R6
CLR TF0
CPL P1.3
JB TF1,LOOPD
MOV TL1,#0FCH
MOV TH1,#4BH
CLR TF1
DJNZ R7,LOOPD
CLR TR0
CLR TR1
POP 07H
POP PSW
RET
;************************************************************
;各子程序
;*************************************************************
ORG 8300H
CHAFEN: PUSH PSW ;对20H-2AH单元的参数拆分,
PUSH ACC ;查表后送28H-2FH(年月日)
PUSH 03H ;和38H-3FH (时分秒)
PUSH 04H
MOV A,20H ;取秒参数
LCALL CF ;拆分、查表在R4(H)、R3中
MOV 38H,R3 ;送秒的个位
MOV 39H,R4 ;送秒的十位
MOV 3AH,#02H ;送分隔符-
MOV A,21H ;取分参数
LCALL CF ;拆分、查表在R4(H)、R3中
MOV 3BH,R3 ;送分的个位
MOV 3CH,R4 ;送分的十位
MOV 3DH,#02H ;送分隔符-
MOV A,22H ;取小时参数
LCALL CF ;拆分、查表在R4(H)、R3中
MOV 3EH,R3 ;送小时的个位
MOV 3FH,R4 ;送小时的十位
MOV A,23H ;取日起参数
LCALL CF
MOV A,R3
ORL A,#01H
MOV R3,A
MOV 30H,R3
MOV 31H,R4
MOV A,25H ;取月参数
LCALL CF
MOV A,R3
ORL A,#01H
MOV R3,A
MOV 32H,R3
MOV 33H,R4
MOV A,26H ;取年参数
LCALL CF
MOV A,R3
ORL A,#01H
MOV R3,A
MOV 34H,R3
MOV 35H,R4
MOV 36H,#0FCH ;年的高两位处理
MOV 37H,#0DAH
MOV A,27H ;报警分
LCALL CF
MOV 40H,R3
MOV 41H,R4
MOV 42H,#02H
MOV A,28H ;报警时
LCALL CF
MOV 43H,R3
MOV 44H,R4
MOV 45H,#01
MOV A,29H ;报警日
LCALL CF
MOV 46H,R3
MOV 47H,R4
POP 04H
POP 03H
POP ACC
POP PSW
;*******************************************************************
CF: PUSH 02H ;将A中的数据拆分为两个独立的
PUSH DPH ; BCD码并查表
PUSH DPL ; 结果分别存于R4、R3中
MOV DPTR,#LEDSEG
MOV R2,A
ANL A,#0FH
MOVC A,@A+DPTR
MOV R3,A
MOV A,R2
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV R4,A
POP DPL
POP DPH
POP 02H
RET
;*******************************************************************
;将20H -26H中从PCF8563中读出的7个字节参数的无关位屏蔽掉(参见表8.7)
;*******************************************************************
ADJUST: PUSH ACC
MOV A,20H ;处理秒单元
ANL A,#7FH
MOV 20H,A
MOV A,21H ;处理分单元
ANL A,#7FH
MOV 21H,A
MOV A,22H ;处理小时单元
ANL A,#3FH
MOV 22H,A
MOV A,23H ;处理日期单元
ANL A,#3FH
MOV 23H,A
MOV A,24H ;处理星期单元
ANL A,#07H
MOV 24H,A
MOV A,25H ;处理月单元
ANL A,#1FH
MOV 25H,A
POP ACC
RET
;*************************************************************
;中断服务INT_7290子程序
;***************************************************************
INT_7290:PUSH 00H
PUSH 02H
PUSH 03H
PUSH 04H
PUSH 07H
PUSH ACC
PUSH PSW
LCALL RDKEY ;读取第一个按键值(功能键)
CJNE A,#0AH,MINUTE ;判断是A键吗?
;是A键时开始处理小时数据
AKEY_1: JB P3.3,$ ;以查询的方式等待下一次按键操作
LCALL RDKEY ;读取第二个按键值(小时的十位数?
SWAP A ;处理输入的数据(十位)
CJNE A,#00H,X_1
SJMP XX
X_1: CJNE A,#10H,X_2
SJMP XX
X_2: CJNE A,#20H,X_3
SJMP XX
X_3: LJMP DIS_ERR
XX: ANL 14H,#0FH
ORL 14H,A
JB P3.3,$ ;以查询的方式等待下一次按键操作
LCALL RDKEY ;读取第三个按键值(小时的个位数)
CJNE A,#00H,Y_1
LJMP YY
Y_1: CJNE A,#01H,Y_2
LJMP YY
Y_2: CJNE A,#02H,Y_3
LJMP YY
Y_3: CJNE A,#03H,Y_4
LJMP YY
Y_4: CJNE A,#04H,Y_5
LJMP YY
Y_5: LJMP DIS_ERR
YY: ANL 14H,#0F0H ;处理输入的数据(个位)
ORL 14H,A
LCALL WR8563
LJMP BACK
MINUTE: CJNE A,#0BH,SECOND ;判断是B键吗?是B键时开始处理分数据
AKEY_2: JB P3.3,$ ;以查询的方式等待下一次按键操作
LCALL RDKEY ;读取第二个按键值(分钟的十位数?
SWAP A ;处理输入的数据(十位)
CJNE A,#00H,Z_1
SJMP ZZ
Z_1: CJNE A,#10H,Z_2
SJMP ZZ
Z_2: CJNE A,#20H,Z_3
SJMP ZZ
Z_3: CJNE A,#30H,Z_4
SJMP ZZ
Z_4: CJNE A,#40H,Z_5
SJMP ZZ
Z_5: CJNE A,#50H,Z_6
SJMP ZZ
Z_6: LJMP DIS_ERR
ZZ: ANL 13H,#0FH
ORL 13H,A
JB P3.3,$ ;以查询的方式等待下一次按键操作
LCALL RDKEY ;读取第三个按键值(分钟的个位数)
ANL 13H,#0F0H ;处理输入的数据(个位)
ORL 13H,A
LCALL WR8563 ;将修改后的时间参数送PCF8563
LJMP BACK
SECOND: CJNE A,#0CH,HOUR_1 ;判断是C键吗?是C键时开始处理秒数据
AKEY_3: JB P3.3,$ ;以查询的方式等待下一次按键操作
LCALL RDKEY ;读取第二个按键值(秒的十位数?
SWAP A ;处理输入的数据(十位)
CJNE A,#00H,Q_1
SJMP QQ
Q_1: CJNE A,#10H,Q_2
SJMP QQ
Q_2: CJNE A,#20H,Q_3
SJMP QQ
Q_3: CJNE A,#30H,Q_4
SJMP QQ
Q_4: CJNE A,#40H,Q_5
SJMP QQ
Q_5: CJNE A,#50H,Q_6
SJMP QQ
Q_6: LJMP DIS_ERR
QQ: ANL 12H,#0FH
ORL 12H,A
JB P3.3,$ ;以查询的方式等待下一次按键操作
LCALL RDKEY ;读取第三个按键值(秒的个位数)
ANL 12H,#0F0H ;处理输入的数据(个位)
ORL 12H,A
LCALL WR8563 ;将修改后的时间参数送PCF8563
LJMP BACK
HOUR_1: CJNE A,#0DH,MIN_1 ;判断是D键吗?
;是D键时开始处理报警小时数据
AKEY_4: JB P3.3,$ ;以查询的方式等待下一次按键操作
LCALL RDKEY ;读取第二个按键值(小时的十位数?
SWAP A ;处理输入的数据(十位)
CJNE A,#00H,E_1
SJMP EE
E_1: CJNE A,#10H,E_2
SJMP EE
E_2: CJNE A,#20H,E_3
SJMP EE
E_3: LJMP DIS_ERR
EE: ANL 1AH,#0FH
ORL 1AH,A
JB P3.3,$ ;以查询的方式等待下一次按键操作
LCALL RDKEY ;读取第三个按键值(小时的个位数)
CJNE A,#00H,F_1
LJMP FF
F_1: CJNE A,#01H,F_2
LJMP FF
F_2: CJNE A,#02H,F_3
LJMP FF
F_3: CJNE A,#03H,F_4
LJMP FF
F_4: CJNE A,#04H,F_5
LJMP FF
F_5: LJMP DIS_ERR
FF: ANL 1AH,#0F0H ;处理输入的数据(个位)
ORL 1AH,A
LCALL WR8563
SJMP BACK
MIN_1: CJNE A,#0EH,BACK ;判断是E键吗?
;是E键时开始处理报警分数据
AKEY_5: JB P3.3,$ ;以查询的方式等待下一次按键操作
LCALL RDKEY ;读取第二个按键值(分钟的十位数?
SWAP A ;处理输入的数据(十位)
CJNE A,#00H,S_1
SJMP SS
S_1: CJNE A,#10H,S_2
SJMP SS
S_2: CJNE A,#20H,S_3
SJMP SS
S_3: CJNE A,#30H,S_4
SJMP SS
S_4: CJNE A,#40H,S_5
SJMP SS
S_5: CJNE A,#50H,S_6
SJMP SS
S_6: LJMP DIS_ERR
SS: ANL 19H,#0FH
ORL 19H,A
JB P3.3,$ ;以查询的方式等待下一次按键操作
LCALL RDKEY ;读取第三个按键值(分钟的个位数)
ANL 19H,#0F0H ;处理输入的数据(个位)
ORL 19H,A
LCALL WR8563 ;将修改后的时间参数送PCF8563
SJMP BACK
BACK: CJNE A,#0FH,DOWN
DOWN: CLR IE0 ;清标志
POP PSW
POP ACC
POP 07H
POP 04H
POP 03H
POP 02H
POP 00H
RETI
;***************************************************
; DISPAY "Error"
;***************************************************
DIS_ERR:PUSH 07H
PUSH 00H
PUSH 01H
PUSH 02H
PUSH 03H
MOV DPTR,#LEDSEG ;开始对变量查表
MOV R7,#DISCON ;写入数据个数
MOV R0,#DISDA ;源数据块首地址
MOV R1,#DATA_1
LOOP1: MOV A,@R1
MOVC A,@A+DPTR ;查表得对应的字形码
MOV @R0,A ;送显示缓冲区
INC R1
INC R0
DJNZ R7,LOOP1
MOV 28H,#00H
LOOP: MOV R7,#DISCON
MOV R2,#10H
MOV R3,#WSLA
MOV R0,#DISDA
LCALL WRNBYT ;调显示子程序
LCALL DELAY
LCALL DELAY
POP 03H
POP 02H
POP 01H
POP 00H
POP 07H
SJMP DOWN
;*********************************************************
; 读键值子程序 (;出口参数累加器A---获取到的键值)
;*********************************************************
RDKEY: MOV R0,#1FH ;键值缓冲单元
MOV R7,#01H ;取一个数据(键值)
MOV R2,#01H ;指向内部数据键值寄存器地址
MOV R3,#WSLA_7290 ;取器件地址(写)
MOV R4,#RSLA_7290 ;取器件地址(读)
LCALL RDADD ;读出7290的01H单元中的键值
MOV A,1FH ;取健值送缓冲单元
DEC A
RET
;******************************************************************
; 向日历芯片写入时间参数子程序
;将RAM的10H-1DH中的时间参数(含控制字)写入芯片的00H-0DH单元
;******************************************************************
WR8563: MOV R7,#0EH ;写入参数个数(时间和控制字)
MOV R0,#10H ;参数和控制命令缓冲区首地址
MOV R2,#00H ;从器件内部从地址
MOV R3,#WSL
展开阅读全文