📄 pcf8563.c
字号:
#include "Includes.h"
/*--------------------------------变量定义------------------------------------*/
INT8U GetClock[8],SetClock[8]; // 时间数据缓缓冲区
/*------------------------------PCF8563初始化---------------------------------*/
void PCF8563Init(void)
{
INT8U temp[8];
temp[0] = 0x00; // 写入超始地址
temp[1] = 0x00; // 状态寄存器1设置普通模式、芯片运行、电源复位无效
temp[2] = 0x00; // 状态寄存器2 清除报警标志位
if (GetClock[0]&0x80) // 秒寄存器设置正确读数
{
temp[3] = GetClock[0]&0x7f;
}
TWI_MasterSendNI(TARGET_ADDR, 4, temp);
temp[0] = 0x09; // 写入超始地址
temp[1] = 0x80; // 关闭分钟报警
temp[2] = 0x80; // 关闭小时报警
temp[3] = 0x80; // 关闭日报警
temp[4] = 0x80; // 关闭星期报警
temp[5] = 0x83; // CLKOUT输出1Khz方波
temp[6] = 0x83; // 关定时寄存器
temp[7] = 0x00; // 清除定时寄存器数值
TWI_MasterSendNI(TARGET_ADDR, 8, temp);
}
/*--------------------------------------读取时间--------------------------------
//读取时钟芯片PCF8563的时间,设置要读的第一个时间类型0x02,则会一次
//把时间读取到GetClock
// 顺序:0x02:秒0x03:分0x04:小时0x05:日0x06:星期0x07:月0x08:年
//I2C总线规定,每一个字节传送完成后,都要一个应答位。当主机接收时,
//器释放SDA线,是主机能产生一个结主机对最后一个字节不予应答,以向
//从机指出数据传送的结束,从发送结束信号。
//----------------------------------------------------------------------------*/
void GetPCF8563(void)
{
INT8U temp[8];
temp[0]=0x02; // 读取起始地址
/*发送地址*/
TWI_MasterSendNI(TARGET_ADDR, 1, temp);
/*接收数据*/
TWI_MasterReceiveNI(TARGET_ADDR, 7, temp);
/* 将时间转为十进制*/
GetClock[SECOND ]=(((temp[SECOND]&0x70)>>4)*10)+(temp[SECOND]&0x0f); // 秒
GetClock[MINUTE ]=(((temp[MINUTE]&0x70)>>4)*10)+(temp[MINUTE]&0x0f); // 分
GetClock[HOUR ]=(((temp[HOUR ]&0x30)>>4)*10)+(temp[HOUR ]&0x0f); // 时
GetClock[DAY ]=(((temp[DAY ]&0x30)>>4)*10)+(temp[DAY ]&0x0f); // 日
GetClock[WEEK ]= temp[WEEK ]&0x07; // 周
GetClock[MONTH ]=(((temp[MONTH ]&0x10)>>4)*10)+(temp[MONTH ]&0x0f); // 月
GetClock[YEAR ]=(((temp[YEAR ]&0xf0)>>4)*10)+(temp[YEAR ]&0x0f); // 年后两位
if ((temp[MONTH]&0x80)==0) // 世纪位C=0 指定世纪数为20 C=1 指定世纪数为19
{
GetClock[YEARH]=20;
}
else
{
GetClock[YEARH]=19;
}
}
/*------------------------------------调整时间----------------------------------
//调整时钟。0x02是要改的时间类型起始位,SetClock是新设置的时间值。
//0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
//---------------------------------------------------------------------------*/
void SetPCF8563(void)
{
INT8U i,temp[8];
temp[0]=0x02; // 读取起始地址
for (i=0;i<7;i++)
{
temp[i+1] = (SetClock[i]/10)<<4;
temp[i+1] = temp[i+1]|(SetClock[i]%10);
}
/*发送数据*/
TWI_MasterSendNI(TARGET_ADDR, 8, temp);
}
/*------------------------------------------------------------------------------
0ooo
ooo0 ( )
( ) ) /
\ ( (_/
\_)
------------------------------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -