STM32对时钟芯片PCF8563的编程

合集下载

时钟由FPC8563产生,程序如下-推荐下载

时钟由FPC8563产生,程序如下-推荐下载

#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit scl1=P2^0;//定义数码管时钟线sbit sda1=P2^1;//定义数码管数据线sbit scl3=P2^4;//定义数码管时钟线sbit sda3=P2^5;//定义数码管数据线sbit scl4=P2^6;//定义数码管时钟线sbit sda4=P2^7;//定义数码管数据线sbit scl=P0^6;//定义8563 I2C的时钟线sbit sda=P0^7; //定义8563 I2C的数据线uchar a,miao,shi,fen,number, b;uint day,week,month,year;uchar code tab[]={0x11,0x7d,0x23,0x29,0x4d,// 0 1 2 3 4 //0x89,0x81,0x3d,0x01,0x09, // 5 6 7 8 9 //0x05,0xc1,0x93,0x61,0x83,0x87 }; // A B C D E F void delay(){ ;; }//=========8563起始信号子程序========== void start(){sda=1;delay();scl=1;delay();sda=0;delay();}//==========8563终止信号子程序========= void stop(){sda=0;delay();scl=1;delay();sda=1;delay();}//=========8563应答信号子============== void respons(){uchar i; scl=1;delay();while((sda==1)&&(i<250))i++; //若无应答,重新开始发送地址scl=0;delay();}//======8563总线初始化子=========void init(){sda=1;delay();scl=1;delay();}//===========写入1字节子程==============void write_byte(uchar date){uchar i,temp;temp=date; //写入数据datefor(i=0;i<8;i++){temp=temp<<1;scl=0;delay();sda=CY; //往数据线送date最高位,循环8次送完datedelay();scl=1;delay();scl=0;delay();}sda=1; //释放数据总线,以便读取应答信号delay();}//===========读取1字节子程序=========== uchar read_byte(){uchar i,k;scl=0;delay();sda=1;delay();for(i=0;i<8;i++) //读回时是一位一位的所以要读8次{scl=1; // scl置1数据才稳定才可以读取数据delay();k=(k<<1)|sda; //sda送过来的数据送到k的最底位,循环8次从最高位读完sda上的数据scl=0;delay();}return k; //程序执行完返回k的值}//============延时子程序=============void delay1(uchar x){uchar a,b;for(a=x;a>0;a--)for(b=100;b>0;b--);}//===========写一8位数据子程序======== void write_add(uchar address,uchar date){start(); //调用起始信号子程序,开始写入信号write_byte(0xa2); //找芯片所在地址respons(); //调用应答信号write_byte(address);//找芯片内部存储器地址respons();write_byte(date);// 写入数据,写进芯片内部存储器respons();stop(); //调用终止信号子程序,终止信号写入}//===========读一8位数据子程序======= uchar read_add(uchar address){uchar date;start(); //调用起始信号子程序write_byte(0xa2); //取芯片地址respons();write_byte(address);//取芯片内部存储器地址respons();start(); //调用起始信号子程序,开始读取信号write_byte(0xa3);//芯片读地址respons();date=read_byte();//把读取字节子程序的返回值给datestop();return date; // 程序执行完返回date的值}//===============写时间子程序=========== void write_8563(uchar w_miao,uchar w_fen,uchar w_ shi,uchar w_day,uchar w_week,uchar w_month,uchar w_year){ init();start();write_add(0x00,0x00);write_add(0x01,0x00);write_add(0x02, w_miao);delay1(100);write_add(0x03,w_fen);delay1(100);write_add(0x4,w_shi);delay1(100);write_add(0x05,w_day);delay1(100);write_add(0x06,w_week);delay1(100);write_add(0x7,w_month);delay1(100);write_add(0x8,w_year);delay1(100);}//===============读时间子程序==========void read_8563(){miao=read_add(0x02)&0x7f;//获取秒数据miao=((miao&0xf0)>>4&0x0f)*10+(miao&0x0f);/ /BCD码转换成10进制数if(miao>=60){miao=0;}fen=read_add(0x03)&0x7f;//获取分钟fen=((fen&0xf0)>>4&0x0f)*10+(fen&0x0f);//BCD 码转换成10进制数if(fen>=60){fen=0;}shi=read_add(0x04)&0x3f;//获取小时shi=((shi&0xf0)>>4&0x0f)*10+(shi&0x0f);//BCD 码转换成10进制数if(shi>=24){shi=0;}day=read_add(0x05)&0x3f;//获取日数据day=(( day&0xf0)>>4&0x0f)*10+( day&0x0f);// BCD码转换成10进制数if( day>=31){ day=0;}week=read_add(0x06)&0x07;//获取星期if(week>6){week=0;}month=read_add(0x07)&0x1f;//获取月month=((month&0xf0)>>4&0x0f)*10+(month&0x0 f);//BCD码转换成10进制数if(month>=24){month=0;}year=read_add(0x08)&0xff;//获取年shi=((year&0xf0)>>4&0x0f)*10+(year&0x0f);//BC D码转换成10进制数delay1(100);}/******************************************* ******************************************************** *************///============数码管移位子程========void shift1(){uchar i,t;number=tab[b];scl1=0;for(i=0;i<8;i++){t=number&0x80; //与、判断,0 1, 0x80为二进制数10000000sda1=t; // 往数据线送最高位scl1=1; //上跳 number=number<<1; //左移一位scl1=0; //下跳}}void shift3(){uchar i,t;number=tab[b];scl3=0;for(i=0;i<8;i++){t=number&0x80; //与、判断,0 1, 0x80为二进制数10000000sda3=t; // 往数据线送最高位scl3=1; //上跳number=number<<1; //左移一位scl3=0; //下跳}}void shift4(){uchar i,t;number=tab[b];scl4=0;for(i=0;i<8;i++){t=number&0x80; //与、判断,0 1, 0x80为二进制数10000000sda4=t; // 往数据线送最高位scl4=1; //上跳number=number<<1; //左移一位scl4=0; //下跳}}//============数码管显示程序======== void dispaly(){b=miao%10;//秒个位shift3();b=miao/10;//秒十位shift3();b=fen%10;shift4();b=fen/10;shift4();b=shi%10;shift4();b=shi/10;shift4();b=week%10;//秒个位shift1();b=day%10;shift1();b=day/10;shift1();b=month%10;shift1();b=month/10;shift1();b=year%10; //年个位shift1();b=(year%100)/10;//年十位shift1();b=(year%1000)/100;//年百位shift1();b=year/1000;shift1();delay1(500);}//===========主程序===============void main(){init();delay1(500);write_8563(0x50,0x59,0x23,0x11,0x01,0x09,0x2008);/ /初始化秒分时,日,星期,月,年delay1(500); //调用延时函数while(1){read_8563(); //读取秒时分dispaly(); //显示秒分时}}你单独能读出时,分,秒说明你在8563的时序读写上没错.能显示,说明显示部分没问题.当然如果你要读年也可以,你再仔细看一下8563的PDF,年的百位千位的读取可以通过07H 月/世纪寄存器来读值计算.也就是最高位第7位,有个标志C,你可以读取它来判断百位和千位的值的.当年寄存器由99变化为00时,C就有变化了.这样你软件上稍作处理就可以了.至于你说同时读取年月日星期时分秒时时小时读不出来,你仔细看一下你的程序:shi=read_add(0x04)&0x3f;//获取小时shi=((shi&0xf0)>>4&0x0f)*10+(shi&0x0f);//BCD码转换成10进制数if(shi>=24){shi=0;}year=read_add(0x08)&0xff;//获取年shi=((year&0xf0)>>4&0x0f)*10+(year&0x0f);//BCD 码转换成10进制数(shi应为year)delay1(100);"shi"这个变量你在读取小时的时候已经用到了,为什么读取年的时候还要用它呢,按程序执行的顺序那你不是把以前读取的小时值给覆盖了吗.所以你应该重新定义一个变量来存放年的10进制值啊.所以你一起读的时候不会出来小时也就正常了.加入按键设置时间秒加一程序如下,miao为秒,key为按键为什么不能实现按键秒加 1if(key2==0){ delay1(10)if(key2==0){ while(!key);//等待松键write_add(0x00, 0x20);//芯片时钟停止运行miao=read_add(0x02)&0x7f;//读取秒数据miao=((miao&0xf0)>>4&0x0f)*10+(mi ao&0x0f);//BCD码转换成10进制数miao=miao++; //秒加一if(miao>=60){miao=0;}write_add(0x02,miao);//写秒数据miao=read_add(0x02)&0x7f;//读取秒数据miao=((miao&0xf0)>>4&0x0f)*10+(mi ao&0x0f);//BCD码转换成10进制数}}write_add(0x00, 0x00);//芯片时钟运行时钟由FPC8563产生,程序如下 display0(); //调用显示程序。

PCF8563驱动(STM32F103系列)

PCF8563驱动(STM32F103系列)
功能描述: 从PCF8563读出全部时间值
*********************************************************************************************************/
* 函数名称: PCF8563_I2C_Start(void)
* 功能描述: PCF8563_I2C启动信号
*********************************************************************************************************/
* 函数名称: PCF8563_I2C_Stop(void)
* 功能描述: PCF8563_I2C停止信号
*********************************************************************************************************/
/*********************************************************************************************
* File:PCF8563.c
* Author:
* Desc:
* History:
*********************************************************************************************/
void Delay_us(int Time)
{
while(Time--);

PCF8563时钟读取芯片程序 STM32

PCF8563时钟读取芯片程序 STM32

//FM24CL16引脚定义
#define PCF_Part GPIOC
#define PCF_SCL GPIO_Pin_9
#define PCF_SDA GPIO_Pin_10
#define SCL_H GPIO_SetBits(PCF_Part,PCF_SCL);
07h 月/世纪 C - - 01~12 BCD 码格式数
08h 年 00~99 BCD 码格式数
09h 分钟报警 AE 00~59 BCD 码格式数
0Ah 小时报警 AE - 00~23 BCD 码格式数
0BH 日报警 AE - 01~31 BCD 码格式数
0CH 星期报警 AE - - - - 0~6
#include "PCF8563.h"
u8 c8563_Store[7]={0x50,0x28,0x15,0x05,0x04,0x02,0x15}; //2015.1.1 1时1分1秒
u8 g8563_Store[7];
extern char rtc_num[6];
////上午时间段、下午
return ack;
}
/********************************************
内部函数.输入数据
出口:B
********************************************/
delay_us(10); //延时
SCL_L; //拉低时钟线
delay_us(10); //延时
delay_us(10); //延时
SDA_L; //产生下降沿
delay_us(10); //延时

PCF8563芯片时序程序

PCF8563芯片时序程序

PCF8563芯片时序程序实时时钟,日历芯片 PCF8563 的驱动方实时时钟,日历芯片 PCF8563 的驱动方法PCF8563是低功耗的CMOS 实时时钟,日历芯片,它提供一个可编程时钟输出,一个中断输出和掉电检测器,所有的地址和数据通过I2C 总线接口串行传递。

最大总线速度为 400Kbits/s,每次读写数据后,内嵌的字地址寄存器会自动产生增量。

它在实际的开发中有着广泛的应用,如移动电话、便携仪器、传真机、电池电源产品等。

其特性如下:1、低工作电流:典型值为0.25μA(VDD=3.0V,Tamb=25?时)。

2、世纪标志3、大工作电压范围:1.0,5.54、低休眠电流;典型值为0.25μA(VDD=3.0V,Tamb=25?)5、 400KHz 的I2C 总线接口(VDD=1.8,5.5V 时)。

6、可编程时钟输出频率为:32.768KHz,1024Hz,32Hz,1Hz。

7、报警和定时器。

8、掉电检测器。

9、内部集成的振荡器电容。

10、片内电源复位功能。

11、I2C 总线从地址:读,0A3H;写,0A2H。

12、开漏中断引脚。

PCF8563的引脚配置图:引脚功能详述如下:名称引脚编号功能描述OSCI 1 振荡器输入OSCO 2 振荡器输出/INT 3 中断输出(开漏;低电平有效)VSS 4 地SDA 5 串行数据I/OSCL 6 串行时钟输入CLKOUT 7 时钟输出 (开漏)VDD 8 正电源PCF8563的功能框图:功能描述:PCF8563有16 个,位寄存器:一个可自动增量的地址寄存器,一个内置32.768KHz的振荡器(带有一个内部集成的电容),一个分频器(用于给实时时钟RTC 提供源时钟),一个可编程时钟输出,一个定时器,一个报警器,一个掉电检测器和一个400KHz I2C 总线接口。

所有16 个寄存器设计成可寻址的8 位并行寄存器,但不是所有位都有用。

前两个寄存器(内存地址00H,01H)用于控制寄存器和状态寄存器,内存地址02H,08H 用于时钟计数器(秒~年计数器),地址09H,0CH 用于报警寄存器(定义报警条件),地址0DH 控制CLKOUT 管脚的输出频率,地址0EH 和0FH 分别用于定时器控制寄存器和定时器寄存器。

PCF8563调试

PCF8563调试
ucTimeBuff[0]=0x02;
I2CRead(PCF8563+1, ucTimeBuff, 1, ucTimeBuff, 7,NULL); /* 读取外部PCF8563时钟 */
while(1) {
if(I2CGetFlag() == I2C_READ_END) {
break;
}
OSTimeDly(1);
ucTimeBuff[6] = HEC_to_BCD(pTime->Day);
ucTimeBuff[7] = HEC_to_BCD(pTime->Week);
ucTimeBuff[8] = HEC_to_BCD(pTime->Month);
if (pTime->Year >= 2000){
ucTimeBuff[8] |= 0x80;
return 0;
}
/*********************************************************************************************************
** Function name: pcf8563GetTime
** Descriptions: 获取PCF8563的时间
ucTimeBuff[2] = 0x12; //控制/状态寄存器2
ucTimeBuff[3] = HEC_to_BCD(pTime->Second);
ucTimeBuff[4] = HEC_to_BCD(pTime->Minute);
ucTimeBuff[5] = HEC_to_BCD(pTime->Hour);
INT32S pcf8563GetTime (PCF8563_Time *pTime)

STM32对时钟芯片PCF8563的编程

STM32对时钟芯片PCF8563的编程

这是用STM32对PCF8563编程的程序、模拟IIC,经验证可用~移植用到的文件:IIC.h IIC.c PCF8563.h PCF8563.c ,我把它们全都复制到了这个Word文档里。

使用要初始化的函数:void PCF8563_Init(void). 就唯一这个。

全局变量: u8 PCF8563_Time[7]; 程序初始的值是给PCF8563设置的时间,程序中读取返回的值是PCF8563当时的时间。

我这里使用的IIC的SCL,SDA的引脚分别为PA.0 PA.1,具体看IIC.h和IIC.C。

只要修改好两个引脚的初始化配套你手上的板子这,就能成功移植~Delay_nus(20):这是一个延迟20us的函数。

IIC.h:#ifndef _IIC_H_#define _IIC_H_#include "stm32f10x.h"/* Private typedef -----------------------------------------------------------*//* Private define ------------------------------------------------------------*//*#define I2C_Speed 100000#define I2C1_SLAVE_ADDRESS7 0xA0#define I2C_PageSize 256 *///SCL PA0//SDA PA1#define SCL_H() GPIO_SetBits(GPIOA, GPIO_Pin_0)#define SCL_L() GPIO_ResetBits(GPIOA, GPIO_Pin_0)#define SDA_H() GPIO_SetBits(GPIOA, GPIO_Pin_1)#define SDA_L() GPIO_ResetBits(GPIOA, GPIO_Pin_1)//返回0,和1#define Read_SDA() GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)u8 IIC_ReadByte(void);void IIC_WriteByte(u8 byte);void IIC_WaitAck(void);void IIC_Stop(void);void IIC_Start(void);void IIC_Init(void);void I2C_Ack(void);void I2C_NoAck(void);//取回八个字节的数据:秒,分,时,天,星期,月份,年份。

PCF8563日历时钟芯片原理及应用设计

PCF8563日历时钟芯片原理及应用设计

PCF8563日历时钟芯片原理及应用设计PCF8563是一款实时时钟芯片,用于保存日期、时间和闹钟功能,并在需要时提供准确的时间。

它集成有时钟芯片、电历寄存器和电压降器,可以通过I2C总线进行控制和通信。

下面将详细介绍PCF8563的原理以及应用设计。

一、PCF8563的工作原理二、PCF8563的应用设计1.实时时钟系统:PCF8563广泛应用于各种实时时钟系统,例如电子钟、温度计、保险柜等。

它可以提供准确的时间,并可以进行一定的时钟校准,以确保时间的准确性。

2.日历显示:PCF8563可以与液晶显示器或LED显示器等进行连接,实现日期和时间的显示。

通过读取芯片中的日期和时间寄存器,可以将日期和时间信息显示在屏幕上。

3.闹钟功能:PCF8563内置有闹钟功能,可以设置闹钟时间和日期,并在闹钟触发时发出中断信号。

通过与外部蜂鸣器或报警器等连接,可以实现闹铃功能。

4.计时器功能:PCF8563可以用作计时器,例如测量一些过程的时间。

通过读取和记录时钟寄存器中的时间值,可以实现计时功能,并根据需要进行时钟校准。

5.电池电量监测:PCF8563可以监测电池电量,并在电池电量低于一定阈值时发出警告信号。

这对于需要长时间运行的系统非常有用,可以在电池电量低时及时更换电池。

三、总结PCF8563是一款功能强大的实时时钟芯片,可以提供准确的日期和时间,并具有闹钟和计时功能等。

它可以与各种外部设备进行通信,实现多种应用设计。

无论是日历显示系统还是闹钟功能系统,PCF8563都能够提供稳定和准确的时间支持。

PCF8563 实时时钟 日历 产品数据手册说明书

PCF8563 实时时钟 日历 产品数据手册说明书

PCF8563实时时钟/日历第11版——2015年10月26日产品数据手册1. 简介PCF8563是一款低功耗的CMOS1实时时钟/日历芯片,支持可编程时钟输出、中断输出和低压检测。

所有地址和数据通过双线双向I2C总线串联传输,最高速率:400 kbps。

每次读写数据字节后,寄存器地址自动累加。

2. 特性和优势◼基于32.768kHz的晶振,提供年、月、日、星期、时、分和秒计时◼Century flag◼时钟工作电压:1.0 - 5.5 V(室温)◼低备用电流;典型值为0.25 μA(V DD = 3.0 V,T amb =25 °C)◼400 kHz 双线I2C总线接口(V DD = 1.8 - 5.5 V)◼可编程时钟输出(32.768 kHz、1.024 kHz、32 Hz和1Hz)◼报警和定时器功能◼集成晶振电容器◼内部上电复位(POR)◼I2C总线从机地址:读:A3h;写:A2h◼开漏中断管脚3. 应用◼移动电话◼便携式仪器◼电子计量◼电池驱动产品1. 有关本资料表所使用的缩略语及首字母缩略语的定义,请参考第18节。

4. 订购信息表1. 订购信息[1] 不推荐用于新产品设计。

替代零件为PCF8563T/5。

[2] 不推荐用于新产品设计。

替代零件为PCF8563TS/5。

5. 标示表2. 标记代码6. 功能框图图1. PCF8563功能框图7. 引脚配置信息7.1 引脚配置图2. HVSON10的引脚配置(PCF8563BS) 图3. SO8的引脚配置(PCF8563T)图4. TSSOP8的引脚配置(PCF8563TS)7.2 引脚说明表3. 引脚说明[1] 晶粒芯片焊盘(外露式焊盘)通过高电阻(非导电的)芯片附着连接到VSS,并应进行电气隔离。

将外露式焊盘焊接到电气隔离的PCB铜焊盘上,以获得更好的传热效果,这是一种较好的工程实践,但由于RTC不会消耗太多功率,因此并不需要这样做。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

这是用STM32对PCF8563编程的程序、模拟IIC,经验证可用~移植用到的文件:IIC.h IIC.c PCF8563.h PCF8563.c ,我把它们全都复制到了这个Word文档里。

使用要初始化的函数:void PCF8563_Init(void). 就唯一这个。

全局变量: u8 PCF8563_Time[7]; 程序初始的值是给PCF8563设置的时间,程序中读取返回的值是PCF8563当时的时间。

我这里使用的IIC的SCL,SDA的引脚分别为PA.0 PA.1,具体看IIC.h 和IIC.C。

只要修改好两个引脚的初始化配套你手上的板子这,就能成功移植~Delay_nus(20):这是一个延迟20us的函数。

IIC.h:#ifndef _IIC_H_#define _IIC_H_#include "stm32f10x.h"/* Private typedef -----------------------------------------------------------*//* Private define ------------------------------------------------------------*//*#define I2C_Speed 100000#define I2C1_SLA VE_ADDRESS7 0xA0#define I2C_PageSize 256 *///SCL PA0//SDA PA1#define SCL_H() GPIO_SetBits(GPIOA, GPIO_Pin_0)#define SCL_L() GPIO_ResetBits(GPIOA, GPIO_Pin_0)#define SDA_H() GPIO_SetBits(GPIOA, GPIO_Pin_1)#define SDA_L() GPIO_ResetBits(GPIOA, GPIO_Pin_1)//返回0,和1#define Read_SDA() GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)u8 IIC_ReadByte(void);void IIC_WriteByte(u8 byte);void IIC_WaitAck(void);void IIC_Stop(void);void IIC_Start(void);void IIC_Init(void);void I2C_Ack(void);void I2C_NoAck(void);//取回八个字节的数据:秒,分,时,天,星期,月份,年份。

#endifIIC.c:#include "IIC.h"#include "delay.h"/**/void IIC_Init(void){GPIO_InitTypeDef GPIO_InitStructure;/* Configure I2C1 pins: SCL and SDA */RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出,可以在不用改变成输入的情况下读取IO的电平GPIO_Init(GPIOA, &GPIO_InitStructure);SCL_H(); //拉高SDA_H();}void IIC_Start(void){/* SDA_H();SCL_H();delay_nus(20);SDA_L();delay_nus(20);*/SDA_H();SCL_H();delay_nus(20);SDA_L();delay_nus(20);SDA_L();delay_nus(20);}void IIC_Stop(void){SCL_L(); //1delay_nus(20);// 2SDA_L(); // 3. 1,2,3这三行不可缺少delay_nus(20);SCL_H();delay_nus(20);SDA_H();delay_nus(20);}void IIC_WaitAck(void){u16 k;SCL_L();SDA_H();delay_nus(20);SCL_H();k = 0;while((Read_SDA()!= 0) && (k < 60000))k++;delay_nus(20);SCL_L();delay_nus(20);}void IIC_WriteByte(u8 byte){u8 i = 0;for(i = 0; i < 8; i++){SCL_L();delay_nus(20);if(byte & 0x80){SDA_H();}else{SDA_L();}delay_nus(20);SCL_H();delay_nus(20);byte<<=1;}SCL_L();delay_nus(20);}u8 IIC_ReadByte(void){u8 i,ReadByte;SDA_H();for(i = 0; i < 8; i++){ReadByte <<= 1;SCL_L();delay_nus(20);SCL_H();delay_nus(20);if(Read_SDA()){ReadByte |= 0x01;}else{ReadByte &= ~(0x01);}}return ReadByte;}void I2C_Ack(void){SCL_L();delay_nus(20);SDA_L();delay_nus(20);SCL_H();delay_nus(20);SCL_L();delay_nus(20);}void I2C_NoAck(void){SCL_L();delay_nus(20);SDA_H();delay_nus(20);SCL_H();delay_nus(20);SCL_L();delay_nus(20);}PCF8563.h:#ifndef _PCF8563_H_#define _PCF8563_H_#include "IIC.h"#define ReadCode 0xa3#define WriteCode 0xa2void PCF8563_Init(void);u8 PCF8563_ReaDAdress(u8 Adress);void PCF8563_WriteAdress(u8 Adress, u8 DataTX);//取回7个字节的数据:秒,分,时,天,星期,月份,年份。

//全局变量extern u8 PCF8563_Time[7];void PCF8563_ReadTimes(void);//在CLKOUT上定时1S输出一个下降沿脉冲void PCF8563_CLKOUT_1s(void);#endifPCF8563.c:#include "PCF8563.h"//全局变量,程序初始的值就是要初始化的时间,//用途:1:初始化时间。

2:读取返回时间// 秒,分,时,天,星期,月份,年份。

u8 PCF8563_Time[7] = {50, 59, 23, 31, 6, 12, 12};void PCF8563_Init(void){IIC_Init();//十进制码转换成BCD码PCF8563_Time[0] = ((PCF8563_Time[0]/10) << 4) | (PCF8563_Time[0]%10);PCF8563_Time[1] = ((PCF8563_Time[1]/10) << 4) | (PCF8563_Time[1]%10);PCF8563_Time[2] = ((PCF8563_Time[2]/10) << 4) | (PCF8563_Time[2]%10);PCF8563_Time[3] = ((PCF8563_Time[3]/10) << 4) | (PCF8563_Time[3]%10);// PCF8563_Time[4] = ((PCF8563_Time[4]/10 << 4)) | (PCF8563_Time[4]%10); //星期不用转换PCF8563_Time[5] = ((PCF8563_Time[5]/10 << 4)) | (PCF8563_Time[5]%10);PCF8563_Time[6] = ((PCF8563_Time[6]/10 << 4)) | (PCF8563_Time[6]%10);PCF8563_CLKOUT_1s();PCF8563_WriteAdress(0x00, 0x20); //禁止RTC source clock//初始化PCF8563的时间PCF8563_WriteAdress(0x02, PCF8563_Time[0]);PCF8563_WriteAdress(0x03, PCF8563_Time[1]);PCF8563_WriteAdress(0x04, PCF8563_Time[2]);PCF8563_WriteAdress(0x05, PCF8563_Time[3]);PCF8563_WriteAdress(0x06, PCF8563_Time[4]);PCF8563_WriteAdress(0x07, PCF8563_Time[5]);PCF8563_WriteAdress(0x08, PCF8563_Time[6]);PCF8563_WriteAdress(0x00, 0x00); //Enable RTC sorce clock}u8 PCF8563_ReaDAdress(u8 Adress){u8 ReadData;IIC_Start();IIC_WriteByte(0xa2);IIC_WaitAck();IIC_WriteByte(Adress);IIC_WaitAck();IIC_Start();IIC_WriteByte(0xa3);IIC_WaitAck();ReadData = IIC_ReadByte();IIC_Stop();return ReadData;}void PCF8563_WriteAdress(u8 Adress,u8 DataTX)IIC_Start();IIC_WriteByte(0xa2);IIC_WaitAck();IIC_WriteByte(Adress);IIC_WaitAck();IIC_WriteByte(DataTX);IIC_WaitAck();IIC_Stop();}//取回八个字节的数据:秒,分,时,天,星期,月份,年份。

相关文档
最新文档