3.4 DS12C887的内存空间
DS12C887的内存空间共128个字节,其中11个字节专门用于存储时间、星期、日历和闹钟信息;4个字节专门用于控制和存放状态信息;其余113个字节为用户可以使用的普通RAM空间。图11为日历时钟芯片DS12C887的内存空间映射示意图。[
21
图11 日历时钟芯片DS12C887内存空间映射示意图
地址0x00-0x09共10个寄存器分别存放的是秒、秒闹钟、分钟、分闹钟、小时、时闹钟、星期、日、月和年信息,地址0x32为世纪信息寄存器(解决了“两千年问题”)地址0x0A~0x0D四个寄存器分别为寄存器A、B、C、D,它们用于控制和存放某些状态信息;其余的113字节地址空间是留给用户使用的普通内存空间。
根据此地址映射关系(见图11)和芯片选的设置(由单片机的P2.0端口反相后提供)可以得到每个特定寄存器在程序中的地址,即为0x0100加上图11中的地址偏移。比如,日信息寄存器的地址为0x0107,控制寄存器B的地址为0x010B等。
在所有的128字节中,寄存器C和D为只读寄存器,寄存器A的第7位属于只读位,秒字节的高阶位也是只读的,其余字节均为可直接读写字节。
时钟、日历信息可以通过读取合适的内存字节获得;时钟、日历和闹钟可以通过写合适的内存字节进行设置或初始化。对应时钟、日历和闹钟的10个寄存器字节可以是二进制形式或者BCD码形式,在写这些寄存器时,寄存器B的SET位必须置1。
寄存器A字节的内容如下:
MSB LSB UIP DV2 DV1 DV0 RS3 RS2 RS1 RS0 ·UIP: 更新(UIP)位用来标志芯片是否即将进行更新。当UIP位为l时,更新即将开始;当它为0时,表示在至少244μs内芯片不会更新,此时,时钟、日历和闹钟信息可以通过读写相应的字节获得和设置。UIP位为只读位并且不受复位信号(RESET)的影响。通过把寄存器B中的SET位设置为1可以禁止更新并将UIP位清0。
·DV0,DV1,DV2:
这3位是用来开关晶体振荡器和复位分频器。当[DV0 DV1 DV2]=[010]时,晶体振荡器开启并且保持时钟运行;当[DV0 DV1 DV2]=[11X]时,晶体振荡器开
22
启,但分频器保持复位状态。
·RS3、RS2、RS1.、RS0:
作用:1)设置周期中断允许位(PIE);2)设置方波输出允许位(SQWE);3)两位同时设置为有效并且设置频率;4)全部禁止。
寄存器B字节的内容如下:
MSB LSB SET ·SET
PIE AIE UIE SQWE DM 24/12 DSE 当SET=0,芯片更新正常进行;当SET=1,芯片更新被禁止。SET位可读写,并不会受复位信号的影响。
·PIE:
当PIE=0,禁止周期中断输出到IRQ;当PIE=1,允许周期中断输出到IRQ。 ·AIE:
当AIE=0,禁止闹钟中断输出到IRQ;当AIE=1,允许闹钟中断输出到IRQ。 ·UIE:
当UIE=0,禁止更新结束中断输出到IRQ;当UIE=1,允许更新结束中断输出到IRQ。
此位在复位或设置SET为高时清0。 ·SQWE:
当SQWE=0,SQW脚为低;当SQWE=1,SQW输出设定频率的方波。 ·DM:
DM=0,二进制;DM=1,BCD。此位不受复位信号影响。 ·24/12:
此位为1时,24时制;为0时,12小时制。 ·DSE:
夏令时允许标志。在四月的第一个星期日的1∶59∶59AM,时钟调到3∶00∶00AM;在十月的最后一个星期日的1∶59∶59AM,时钟调到1∶00∶00AM。
寄存器C字节的内容如下:
MSB LSB IRQF ·IRQF
PF AF UF 0 0 0 0 当有以下情况中的一种或几种发生时,中断请求标志位(IRQF)置高: PF=PIE=lAF=AIE=lUF=UIE=1
IRQF?PF?PIE?AF?AIE?UF?UIE
IRQF一旦为高IRQ脚输出低。
所有标志位在读寄存器C或复位后清0。 ·PF:周期中断标志。·AF:闹钟中断标志。·UF:更新中断标志。·BIT0~BIT3 第0位到第3位无用,不能写入,只读,且读出的值恒为0。 寄存器D字节的内容如下:
MSB LSB
23
VRT 0 0 0 0 0 0 0 ·VRT 当VRT=0时表示内置电池能量耗尽,此时RAM中的数据的正确性就不能保证了。
·BIT6~ BIT0
第0位到第6位无用,只读,且读出的值恒为0。芯片DS12C887的113字节普通RAM空间为非易失性RAM空间,它不专门用于某些特别功能,而是可以在微处理器程序中作为非易失性内存空间使用。[14]
4 软件设计
4.1软件设计分两部分:时钟部分以及显示部分。
Lcd.h
#ifndef __char_lcd_h__ #define __char_lcd_h__
//----------------------------------------------------------------- // 数据类型宏定义
//----------------------------------------------------------------- #define uchar unsigned char #define uint unsigned int
//----------------------------------------------------------------- // I/O口定义:控制/数据线接口
//----------------------------------------------------------------- sbit rs=P2^2; //寄存器选择端口 sbit rw=P2^1; //读写选择端口 sbit ep=P2^0; //使能信号端口
//----------------------------------------------------------------- // 外部变量声明
//-----------------------------------------------------------------
//----------------------------------------------------------------- // 外部函数声明
//----------------------------------------------------------------- extern void lcd_init(void); // LCD初始化
extern bit lcd_bz(void); // 检测LCD BF的状态 extern void lcd_wcmd(uchar cmd); // 写LCD的指令代码 extern void lcd_wdat(uchar dat); // 写LCD显示的数据
extern void lcd_pos(uchar pos); // 写LCD的指令代码地址 //extern void CG_Write (void);
extern void delay(uchar ms); // 延时
24