📄 r_w_pcf8563.c
字号:
/**--------------------
〖说明〗I2C总线驱动程序(用两个普通IO模拟I2C总线)
包括100Khz(T=10us)的标准模式(慢速模式)选择,
和400Khz(T=2.5us)的快速模式选择,
默认11.0592Mhz的晶振。
---------------------*/
#include <reg52.h>
#include<INTRINS.H>
sbit SDA = P2^6;
sbit SCL = P2^7;
#define Uchar unsigned char
#define uint unsigned int
#define Byte unsigned char
#define Word unsigned int
#define bool bit
#define true 1
#define false 0
extern Uchar SystemError;
#define SomeNOP(); _nop_();_nop_();_nop_();_nop_();
/*----------I2C相关函数列表---------*/
void I2CStart(void); /*发送I2C起始信号*/
void I2CStop(void); /*发送I2C终止信号*/
bool WaitAck(void); /*I2C等待回应*/
void SendAck(void); /*I2C发送回应*/
void SendNotAck(void); /*I2C不发送回应*/
void I2CSendByte(Byte ch); /*I2C发送一个字节*/
Byte I2CReceiveByte(void); /*I2C接收一个字节*/
/*-------PCF8563T驱动程序列表----------*/
void GetPCF8563(Uchar firsttype,Uchar count,Uchar *buff); /*从PCF8563读取*/
void SetPCF8563(Uchar timetype,Uchar value); /*对PCF8563写入数据*/
void SetAlarm(Uchar alarmtype,Uchar count); /*对PCF8563设置闹铃*/
void CleanAlarm(void); /*对PCF8563清除闹铃*/
//---------------------------------------------------------------------
//开始PCF8563T驱动程序
/**--------------------------------------------------------------------------------
调用方式:void GetPCF8563(Uchar firsttype,Uchar count,Uchar *buff)
函数说明:读取时钟芯片PCF8563的时间,设置要读的第一个时间类型firsttype,
并设置读取的字节数,则会一次把时间读取到buff中。顺序是:
0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
---------------------------------------------------------------------------------*/
void GetPCF8563(Uchar firsttype,Uchar count,Uchar *buff)
{
Uchar i;
I2CStart(); /*I2C起始位*/
I2CSendByte(0xA2); /*发送PCF8563写地址*/
WaitAck(); /*等待应答*/
I2CSendByte(firsttype); /*发送第一个时间类型firsttype*/
WaitAck(); /*等待应答*/
I2CStart(); /*I2C起始位*/
I2CSendByte(0xA3); /*发送PCF8563读地址*/
WaitAck(); /*等待应答*/
for (i=0;i<count;i++)
{
buff[i]=I2CReceiveByte();
if (i!=count-1) SendAck();/*除最后一个字节外,其他都要从MASTER发应答。*/
}
SendNotAck();
I2CStop();
}
/**--------------------------------------------------------------------------------
调用方式:void SetPCF8563(Uchar timetype,Uchar value)
函数说明:调整时钟。timetype是要改的时间类型,value是新设置的时间值(BCD格式)。
0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
---------------------------------------------------------------------------------*/
void SetPCF8563(Uchar timetype,Uchar value)
{
I2CStart();
I2CSendByte(0xA2);
WaitAck();
I2CSendByte(timetype);
WaitAck();
I2CSendByte(value);
WaitAck();
I2CStop();
}
/**--------------------------------------------------------------------------------
调用方式:void SetAlarmHour(Uchar count)
函数说明:设置报警闹钟在一天的第count点报警。例如:count=23,则在晚上11点报警。
---------------------------------------------------------------------------------*/
void SetAlarm(Uchar alarmtype,Uchar count)
{
SetPCF8563(0x01,0x02);
SetPCF8563(alarmtype,count);
}
/**--------------------------------------------------------------------------------
调用方式:void CleanAlarm(void) ﹫2001/08/0 7
函数说明:清除所有报警设置。
---------------------------------------------------------------------------------*/
void CleanAlarm(void)
{
SetPCF8563(0x01,0x00);
SetPCF8563(0x09,0x80);
SetPCF8563(0x0A,0x80);
SetPCF8563(0x0B,0x80);
SetPCF8563(0x0C,0x80);
// SetPCF8563(0x0D,0x00);
// SetPCF8563(0x0E,0x03);
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
/*********************I2C相关函数**********************/
/**--------------------------------------------------------------------------------
调用方式:void I2CStart(void) 函数说明:私有函数,I2C专用,I2C起始
---------------------------------------------------------------------*/
void I2CStart(void)
{
EA=0;
SDA=1; SCL=1; SomeNOP();//INI
SDA=0; SomeNOP(); //START
SCL=0;
}
/**--------------------------------------------------------------------------------
调用方式:void I2CStop(void)
函数说明:私有函数,I2C专用,I2C停止
---------------------------------------------------------------------------------*/
void I2CStop(void)
{
SCL=0; SDA=0; SomeNOP(); //INI
SCL=1; SomeNOP(); SDA=1; //STOP
EA=1;
}
/**--------------------------------------------------------------------------------
调用方式:bit I2CAck(void)
函数说明:私有函数,I2C专用,等待从器件接收方的应答
---------------------------------------------------------------------------------*/
bool WaitAck(void)
{
Uchar errtime=255; /*因故障接收方无ACK,超时值为255。*/
SDA=1;SomeNOP();
SCL=1;SomeNOP();
while(SDA)
{
errtime--;
if (!errtime)
{
I2CStop();
SystemError=0x11;
return false;
}
}
SCL=0;
return true;
}
/**--------------------------------------------------------------------------------
调用方式:void SendAck(void)
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。
---------------------------------------------------------------------------------*/
void SendAck(void)
{
SDA=0; SomeNOP();
SCL=1; SomeNOP();
SCL=0;
}
/**--------------------------------------------------------------------------------
调用方式:void SendAck(void)
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。
-------------------------------------------------------------------------------*/
void SendNotAck(void)
{
SDA=1; SomeNOP();
SCL=1; SomeNOP();
SCL=0;
}
/**--------------------------------------------------------------------------------
调用方式:void I2CSend(Uchar ch)
函数说明:私有函数,I2C专用,发送一个字节。
---------------------------------------------------------------------------------*/
void I2CSendByte(Byte ch)
{
Uchar i=8;
while (i--)
{
SCL=0; _nop_();
SDA=(bit)(ch&0x80);
ch<<=1; SomeNOP();
SCL=1; SomeNOP();
}
SCL=0;
}
/**----------------------------------------------------------------
调用方式:Uchar I2CReceive(void) ﹫2001/07/0 5
函数说明:私有函数,I2C专用,接收一个字节
---------------------------------------------------------------------------------*/
Byte I2CReceiveByte(void)
{
Uchar i=8;
Byte ddata=0;
SDA=1;
while (i--)
{
ddata<<=1;
SCL=0;SomeNOP();
SCL=1;SomeNOP();
ddata|=SDA;
}
SCL=0;
return ddata;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -