📄 pcf8563.c
字号:
//----------------------------------------------------------------------
void delay(void) //延时程序
{
delay_us(3);
}
//----------------------------------------------------------------------
void I2CStart(void) //启动
{
SDAOUT;
SCL_0;
delay();
SDA_1;
delay();
SCL_1;
delay();
SDA_0;
delay();
SCL_0;
}
//----------------------------------------------------------------------
void I2CStop(void)//关闭
{
SDAOUT;
SCL_0;
delay();
SDA_0;
delay();
SCL_1;
delay();
SDA_1;
delay();
SCL_0;
}
//----------------------------------------------------------------------
unsigned char WaitAck(void)//接收应答
{
unsigned char errtime=255;//因故障接收方无ACK,超时值为255。
SDAOUT;
delay();
SDA_1;
delay();
SDAIN;
SCL_1;
delay();
while(SDA_IN) {errtime--; if (!errtime) return 0;}
SCL_0;
return 1;
}
//----------------------------------------------------------------------
void SendAck(void)//发送应答
{
SDAOUT;
delay();
SDA_0;
delay();
SCL_1;
delay();
delay();
SCL_0;
}
//----------------------------------------------------------------------
void SendNotAck(void)//不发送应答
{
SDAOUT;
delay();
SDA_1;
delay();
SCL_1;
delay();
delay();
SCL_0;
}
//----------------------------------------------------------------------
void I2CSendByte(unsigned char ch)//发送一字节数据
{
unsigned char i=8;
SDAOUT;
while (i--)
{
SCL_0;
delay();
if(ch&0x80) SDA_1;
else SDA_0;
ch<<=1;
delay();
SCL_1;
delay();
delay();
}
SCL_0;
}
//----------------------------------------------------------------------
unsigned char I2CReceiveByte(void)//接收一字节数据
{
unsigned char i=8;
unsigned char ddata=0;
SDAOUT;
SDA_1;
SDAIN;
while (i--)
{
ddata<<=1;
SCL_0;
delay();
delay();
SCL_1;
delay();
ddata|=SDA_IN;
delay();
}
SCL_0;
return ddata;
}
//----------------------------------------------------------------------
void GetPCF8563(void) //读取时间和日期数据
{
I2CStart();
I2CSendByte(0xa2);
WaitAck();
I2CSendByte(0x02);
WaitAck();
I2CStart();
I2CSendByte(0xa3);
WaitAck();
rdata[6]=I2CReceiveByte(); //秒
SendAck();
rdata[5]=I2CReceiveByte(); //分
SendAck();
rdata[4]=I2CReceiveByte(); //时
SendAck();
rdata[3]=I2CReceiveByte(); //日
SendAck();
rdata[2]=I2CReceiveByte(); //星
SendAck();
rdata[1]=I2CReceiveByte(); //月
SendAck();
rdata[0]=I2CReceiveByte(); //年
SendNotAck();
I2CStop();
rdata[6]&=0x7f; //把一些没用的位屏蔽掉
rdata[5]&=0x7f;
rdata[4]&=0x3f;
rdata[3]&=0x3f;
rdata[2]&=0x07;
rdata[1]&=0x1f;
}
//----------------------------------------------------------------------
void c8563t_init(void) //时钟芯片初始化
{
I2CStart(); //打开总线,开始初始化
I2CSendByte(0xa2);
WaitAck();
I2CSendByte(0x00);
WaitAck();
I2CSendByte(0x00);
WaitAck();
I2CSendByte(0x00);
WaitAck();
I2CSendByte(wdata[6]); //秒
WaitAck();
I2CSendByte(wdata[5]); //分
WaitAck();
I2CSendByte(wdata[4]); //时
WaitAck();
I2CSendByte(wdata[3]); //日
WaitAck();
I2CSendByte(wdata[2]); //星
WaitAck();
I2CSendByte(wdata[1]); //月
WaitAck();
I2CSendByte(wdata[0]); //年
WaitAck();
I2CSendByte(0x80);
WaitAck();
I2CSendByte(0x80);
WaitAck();
I2CSendByte(0x80);
WaitAck();
I2CSendByte(0x80);
WaitAck();
I2CSendByte(0x80);
WaitAck();
I2CSendByte(0x00);
WaitAck();
I2CStop(); //关闭总线,初始化结束
}
//--------------------------------------------------------
unsigned char BCD_TO_BIN(unsigned char i)//BCD 数转化为二进制数
{
unsigned char j;
j=i>>4;
j&=0x0f;
j*=10;
j+=i&0x0f;
return (j);
}
//--------------------------------------------------------
unsigned char BIN_TO_BCD(unsigned char i)//二进制数转化为BCD 数
{
unsigned char j;
j=i/10;
j<<=4;
j&=0xf0;
j|=i%10;
return (j);
}
//----------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -