📄 pcf8563.c
字号:
#include <reg52.h>
#include <intrins.h>
#include "globedef.h"
#include "pcf8563.h"
#include "delay.h"
/**--------------------------------------------------------------------------------
调用方式:void I2CStart(void) ﹫2001/07/0 4
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void pcf8563_start(void)
{
// EA=0;
pcf8563_scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
pcf8563_sda=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
pcf8563_sda=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
pcf8563_scl=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
/**--------------------------------------------------------------------------------
调用方式:void I2CStop(void) ﹫2001/07/0 4
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void pcf8563_stop(void)
{
pcf8563_scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
pcf8563_sda=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
pcf8563_sda=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
pcf8563_scl=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
// EA=1;
}
/**--------------------------------------------------------------------------------
调用方式:bit I2CAck(void) ﹫2001/07/0 4
函数说明:私有函数,I2C专用,等待从器件接收方的应答
---------------------------------------------------------------------------------*/
void WaitAck(void)
{
// unsigned char errtime=255;//因故障接收方无ACK,超时值为255。
// pcf8563_sda = 1; //写1准备读
// _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
pcf8563_scl = 1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
// while(pcf8563_sda)
// {
// errtime--;
// if (!errtime)
// {
// pcf8563_stop();
// // pcf8563Error=0xaa;
// }
// }
pcf8563_scl=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
/**--------------------------------------------------------------------------------
调用方式:void SendAck(void) ﹫2001/07/0 4
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。
---------------------------------------------------------------------------------*/
void SendAck(void)
{
pcf8563_sda = 0; _nop_();_nop_();_nop_();// send ack
//第9位clk
pcf8563_scl = 1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
pcf8563_scl = 0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
/**--------------------------------------------------------------------------------
调用方式:void I2CSend(uchar ch) ﹫2001/07/0 5
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void pcf8563_sendbyte(unsigned char ch)
{
unsigned char i = 8;
while (i--)
{
pcf8563_scl=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
pcf8563_sda=(bit)((ch&0x80) >> 7);
ch<<=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
pcf8563_scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
pcf8563_scl=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
WaitAck();
}
/**--------------------------------------------------------------------------------
调用方式:uchar I2CReceive(void) ﹫2001/07/0 5
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
unsigned char pcf8563_receivebyte(void)
{
unsigned char i=8;
unsigned char ddata=0;
pcf8563_sda = 1; //写1为读做准备
while (i--)
{
ddata <<= 1;
pcf8563_scl = 0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
pcf8563_scl = 1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
ddata |= (unsigned char)pcf8563_sda;
}
pcf8563_scl = 0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
SendAck();
return ddata;
}
/**--------------------------------------------------------------------------------
调用方式:void GetPCF8563(uchar firsttype,uchar count,uchar *buff) ﹫2001/08/0 7
函数说明:读取时钟芯片PCF8563的时间,设置要读的第一个时间类型firsttype,并设置读取
的字节数,则会一次把时间读取到buff中。顺序是:
0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
---------------------------------------------------------------------------------*/
void set_pcf8563(unsigned char time_type,unsigned char time_value)
{
pcf8563_start();
pcf8563_sendbyte(0xa2); //器件地址,写
pcf8563_sendbyte(time_type); //发送数据-时间类型
pcf8563_sendbyte(time_value); //发送设置时间值
pcf8563_stop();
}
unsigned char get_pcf8563(unsigned char time_type)
{
unsigned char time_value;
pcf8563_start();
pcf8563_sendbyte(0xa2);
pcf8563_sendbyte(time_type);
pcf8563_start();
pcf8563_sendbyte(0xa3); //器件地址,读
time_value = pcf8563_receivebyte();
pcf8563_stop();
return time_value;
}
void init_pcf8563(void)
{
pcf8563_start();
pcf8563_sendbyte(0xa2); //器件地址,写
pcf8563_sendbyte(0x00); //地址0为控制状态寄存器
pcf8563_sendbyte(0x00); //发送数据-普通模式,开启时钟
pcf8563_stop();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -