上拉电阻用10K应该是没有问题的
写:发送STAR
|
发送A2
|
发送02 (要写的数的首地址,从秒开始写)
|
写秒
|
写分
|
……
|
写年
|
STOP
对8563的设置:(只用了时钟,其他报警,定时都不用)
发送STAR
|
发送A2
|
发送00 (寄存器0地址)
|
发送00 (寄存器0数据)
|
发送00 (寄存器1数据)
|
发送A2
|
发送09 (寄存器09地址)
|
发送80 (寄存器09数据)
|
发送80 (寄存器0A数据)
|
发送80 (寄存器0B数据)
|
发送80 (寄存器0C数据)
|
发送00 (寄存器0D数据)
|
发送00 (寄存器0E数据)
|
STOP
(注意应答位)
/**--------------------------------------------------------------------------------
调用方式:void I2CStart(void)
函数说明:私有函数,I2C专用。开始
---------------------------------------------------------------------------------*/
void I2CStart(void)
{
EA=0;
SDA=1; SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_(); //START
SCL=0;
}
/**--------------------------------------------------------------------------------
调用方式:void I2CStop(void)
函数说明:私有函数,I2C专用。停止
---------------------------------------------------------------------------------*/
void I2CStop(void)
{
SCL=0; SDA=0;
_nop_();_nop_();_nop_();_nop_(); _nop_(); //INI
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=1; //STOP
EA=1;
}
/**--------------------------------------------------------------------------------
调用方式:bool WaitAck(void)
函数说明:私有函数,I2C专用,等待从器件接收方的应答
---------------------------------------------------------------------------------*/
bool WaitAck(void)
{
uchar errtime=255; //因故障接收方无ACK,超时值为255。
SDA=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
while(SDA)
{errtime--;
if (!errtime)
{I2CStop();
// SystemError=0x11;
return false;}
}
SCL=0;
return true;
}
/**--------------------------------------------------------------------------------
调用方式:void SendAck(void)
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。
---------------------------------------------------------------------------------*/
void SendAck(void)
{
SDA=0; _nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1; _nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;
}
/**--------------------------------------------------------------------------------
调用方式:void SendNotAck(void)
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应
答信号。 }
--------------------------------------------------------------------------------*/
void SendNotAck(void)
{
SDA=1; _nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1; _nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;
}
/**--------------------------------------------------------------------------------
调用方式:void I2CSend(uchar ch)
函数说明:私有函数,发送一字节数。I2C专用
---------------------------------------------------------------------------------*/
void I2CSendByte(uchar ch)
{
uchar i=8;
while (i--)
{
SCL=0;_nop_();
SDA=(bit)(ch&0x80); ch < <=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
SCL=0;
}
/**--------------------------------------------------------------------------------
调用方式:uchar I2CReceive(void)
函数说明:私有函数,接收一字节数。I2C专用
---------------------------------------------------------------------------------*/
uchar I2CReceiveByte(void)
{
uchar i=8;
uchar ddata=0;
SDA=1;
while (i--)
{
ddata < <=1;
SCL=0; _nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1; _nop_();_nop_();_nop_();_nop_();_nop_();
ddata|=SDA;
}
SCL=0;
return ddata;
}
//---------------------------------------------------------------------------
//PCF8563T驱动程序
/**--------------------------------------------------------------------------------
调用方式:void GetPCF8563(ucha rdata *tmbf)
函数说明:读取时钟芯片PCF8563的时间,一次把时间读取到tmbf中。顺序是:
0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
---------------------------------------------------------------------------------*/
void GetPCF8563(uchar data *tmbf)
{
uchar i;
I2CStart();
I2CSendByte(0xA2);WaitAck();
I2CSendByte(0x02);WaitAck();
I2CStart();
I2CSendByte(0xA3);WaitAck();
for(i=0;i <7;i++)
{tmbf[i]=I2CReceiveByte();
if (i!=6) SendAck();//除最后一个字节外,其他都要从MASTER发应答。
}
SendNotAck();
I2CStop();
}
/**--------------------------------------------------------------------------------
调用方式void iniPCF8563(void)
函数说明:初始化时钟
---------------------------------------------------------------------------------*/
void iniPCF8563(void)
{ I2CStart();
I2CSendByte(0xA2); WaitAck();
I2CSendByte(0x00); WaitAck();
I2CSendByte(0x00); WaitAck();
I2CSendByte(0x01); WaitAck();
I2CStart();
I2CSendByte(0xA2); WaitAck();
I2CSendByte(0x09); WaitAck();
I2CSendByte(0x80); WaitAck(); //09
I2CSendByte(0x80); WaitAck(); //0a
I2CSendByte(0x80); WaitAck(); //0b
I2CSendByte(0x80); WaitAck(); //0c
I2CSendByte(0x00); WaitAck(); //0d
I2CSendByte(0x00); WaitAck(); //0e
I2CStop();
delay(1);
}
/**--------------------------------------------------------------------------------
调用方式:void SetPCF8563(ucha datr *tmbf)
函数说明:设置时钟。tmbf是要写入的时间(BCD格式)。0x07中D7高为19,低为20;
0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
---------------------------------------------------------------------------------*/
void SetPCF8563(uchar *tmbf)
{uchar i;
I2CStart();
I2CSendByte(0xA2); WaitAck();
I2CSendByte(0x02); WaitAck();
for(i=0;i <7;i++)
{I2CSendByte(tmbf[i]); WaitAck();}
I2CStop();
}