PCF8563的读地址 0xA2,
写地址 0xA3.
地址的前7位为从器件的实际地址,最后一位表示读写R/W的方向。
PCF8563初始化的时候,参考http://hi.baidu.com/wxsidbuojoblosq/item/508c1fc6b29ac90c0bd93afe,说是要检测0x02寄存器的最高位,
0x02H寄存器最高位是VL VL=0 表示保证准确时钟/日历时间,如果VL=1,则时钟/日历时间是没有保证的,也就是这时候时间不一定正确。
所以在初始化的时候,先获取0x02H寄存器的最高位,如果是1,那么就要初始化时间了。
在初始化秒,分,时,日,月,年...的时候问题并不是很大,除了星期和星期报警不以BCD格式编码外,其他的都是以BCD格式编码的。
因此在初始化的时候可以定义一个数组,这里的uchar code 和uchar的区别:
ucode 是在flash定义的数据代码存储空间,如定义表格等,用于存储16进制码--如下面的c8563_Store[7]
uchar 是在ram定义的存储空间,uchar是8位的,占一个寄存器,uchar是一个字节大小 范围(0-255)它多用来储存字母。如uchar p[2]={'a','b'};
uchar code c8563_Store[7]={
0x05, //秒
0x14, //分
0x15, //时
0x28, /* 28日 */
0x05, /* 星期5 */
0x06, /* 06月 */
0x13 /* 2013年 */
}
在读取PCF8563寄存器时间的时候,需要注意。因为它们并不是用到了全部的位数,所以需要相与一个特定的数,否则容易出现错误。
g8563_Store[0]=time[0]&0x7f; /*秒*/
g8563_Store[1]=time[1]&0x7f; /*分*/
g8563_Store[2]=time[2]&0x3f; /*小时*/
g8563_Store[3]=time[3]&0x3f; /*日*/
g8563_Store[4]=time[4]&0x07; /*星期*/
g8563_Store[5]=time[5]&0x1f; /*月/世纪*/
g8563_Store[6]=time[6]; /*年*/
没有和后面的16进制数相与,读出的值不准确。没有与之前读星期时读到的是0x1C,但是初始化的时候写的是0x04,0x1C&0x07后,结果是0x04。所以保险起见,还是不可以省掉后面的与操作。
没用到报警,所以初始话的时候先停止,PCF_WriteData(0x00,0x02),然后设置时间,最后启动PCF_WriteData(0x00,0x00)。过了一个晚上发现分钟差了,应该是精度不够的问题。如何保证PCF实时时钟的精度呢?在文档《保证PCF8563实时时钟精度的设计方法》一文中做了讲解。不行的话是不是能通过上位机发送时间校时,这个还没试过。
时间警告可以提供中断,利用该中断通知MCU,比如在00时关闭或打开外设之类的。