📄 pcf8563.c
字号:
#include <reg52.h> /* special function registers 8052 */
#define HIGH 1
#define LOW 0
#define FALSE 0
#define TRUE ~FALSE
#define READ 0xA3
#define WRITE 0xA2
sbit SCL =P2^3;
sbit SDA =P2^2;
extern void delay(unsigned int); /*延时子程序*/
/*提供I2C总线工作时序中的起始位*/
void I_start_8563(void)
{
SCL=HIGH;
delay(1);
SDA=LOW;
delay(1);
SCL=LOW;
delay(1);
}
/*提供I2C总线工作时序中的停止位*/
void I_stop_8563(void)
{
SDA=LOW;
delay(2);
SCL=HIGH;
delay(2);
SDA=HIGH;
delay(2);
SCL=LOW;
delay(2);
}
/*总线初始化*/
void pcf8563_init(void)
{
SCL=LOW;
I_stop_8563();
}
/*提供总线时钟信号,可发送数据,也可接受数据*/
bit I_clock_8563(void)
{
bit sample;
SCL=HIGH;
delay(1);
sample=SDA;
SCL=LOW;
delay(1);
return(sample);
}
/*发送8位数据,请求应答信号,如果受到则返回1,否则返回0*/
bit I_send_8563(unsigned char I_data)
{
register unsigned char i;
for (i=0;i<8;i++)
{
SDA=(bit)(I_data & 0x80);
I_data=I_data<<1;
I_clock_8563();
}
SDA=HIGH;
return(~I_clock_8563());
}
/*接受8位数据*/
unsigned char I_receive_8563(void)
{
unsigned char I_data=0;
register unsigned char i;
for (i=0;i<8;i++)
{
I_data*=2;
if(I_clock_8563())
I_data++;
}
return(I_data);
}
/*发送应答信号*/
/*
void I_Ack(void)
{
SDA=LOW;
I_clock();
SDA=HIGH;
}
*/
/*发送地址*/
bit E_address_8563(unsigned char Address)
{
I_start_8563();
if(I_send_8563(WRITE))
return(I_send_8563(Address));
else
return(FALSE);
}
/*读pcf8563,成功返回所读的值,不成功返回0*/
unsigned char pcf8563_read(unsigned char read_add)
{
unsigned char retval;
pcf8563_init();
if (E_address_8563(read_add))
{
I_start_8563();
if (I_send_8563(READ))
{
retval=(I_receive_8563());
I_clock_8563();
I_stop_8563();
return(retval);
}
else
{
I_stop_8563();
return(0);
}
}
else
{
I_stop_8563();
return(0);
}
}
/*写pcf8563,成功返回1,不成功返回0*/
unsigned char pcf8563_write(unsigned char data_wrt,unsigned char add_wrt)
{
pcf8563_init();
if(E_address_8563(add_wrt) && I_send_8563(data_wrt))
{
I_stop_8563();
delay(5);
return(1);
}
else
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -