/*****************************************************************************************************************************
本驱动定义了24C02I2CEPROM的操作函数,主要定义了以下几个函数可供调用
1.void iic_start() 用于产生启动信号
2.void iic_stop() 用于产生停止信号
3.void iic_write_byte(unsigned char a) 字节发送 参数为要发送的数据 主要用于发送命令,地址等数据 供本驱动内部调用
4.unsigned char iic_read_byte(void) 字节接收 主要用于接收24C02传回的数据 供本驱动内部调用
5.void iic_write(unsigned char comm,unsigned char addr,unsigned char iic_data) 数据写入 参数comm为命令字 addr为写入的地地址
iic_data为写入的数据
6.unsigned char iic_read(unsigned char comm,unsigned char addr) 数据读出 参数comm为命令字 addr为要读取的地址
请根据实际连接情况更改下面的连线
********************************************************************************************************************************/
sbit iic_SCL=P2^0; //定义时钟线
sbit iic_SDA=P2^1; //定义数据线
void iic_nop(void) //定义空操作 用于产线时序间的延时
{}
void iic_start() //定义启动信号
{
iic_SDA=1; //拉高数据线,以便产生启动信号
iic_nop();
iic_SCL=1;
iic_nop();
iic_nop();
iic_nop();
iic_nop();
iic_nop();
iic_SDA=0; //产生启动信号
iic_nop();
iic_nop();
iic_nop();
iic_nop();
iic_nop();
iic_SCL=0;
iic_nop();
iic_nop();
}
void iic_stop() //定义停止信号
{
iic_SDA=0;
iic_nop();
iic_SCL=1;
iic_nop();
iic_nop();
iic_nop();
iic_nop();
iic_nop();
iic_SDA=1;
iic_nop();
iic_nop();
iic_nop();
}
void iic_write_byte(unsigned char a) //定义字节发送函数
{
unsigned char i;
for(i=0;i<8;i++)
{
if(a&0x80)
{
iic_SDA=1;
}
else
{
iic_SDA=0;
}
iic_nop();
iic_SCL=1;
iic_nop();
iic_nop();
iic_nop();
iic_nop();
iic_nop();
iic_SCL=0;
a=a<<1;
}
iic_nop();
iic_nop();
iic_SDA=1;
iic_nop();
iic_nop();
iic_SCL=1;
iic_nop();
iic_nop();
iic_nop();
iic_SCL=0;
iic_nop();
iic_nop();
}
void iic_write(unsigned char comm,unsigned char addr,unsigned char iic_data) //定义数据写入函数
{
unsigned char i,a;
iic_start(); //发出启动信号
iic_write_byte(comm); //发送命令字
iic_write_byte(addr); //发送地址
iic_write_byte(iic_data); //发送要写入的数据
iic_stop(); //发送停止信号
for(i=0;i<100;i++) //延时5MS
for(a=0;a<50;a++);
}
unsigned char iic_read_byte(void) //定义字节读取函数 用于接收24C02传回的数据
{
unsigned i,c=0;
iic_SDA=1;
for(i=0;i<8;i++)
{
iic_nop();
iic_SCL=0;
iic_nop();
iic_nop();
iic_nop();
iic_nop();
iic_nop();
iic_SCL=1;
iic_nop();
iic_nop();
iic_nop();
iic_nop();
iic_nop();
c=c<<1;
if (iic_SDA==1)
{
c=c+1;
}
iic_nop();
iic_nop();
}
iic_SCL=0;
iic_nop();
iic_nop();
iic_nop();
iic_nop();
iic_nop();
iic_SDA=1;
iic_nop();
iic_nop();
iic_nop();
iic_SCL=1;
iic_nop();
iic_nop();
iic_nop();
iic_nop();
iic_nop();
iic_SCL=0;
iic_nop();
iic_nop();
return (c);
}
unsigned char iic_read(unsigned char comm,unsigned char addr) //定义数据读取函数
{
unsigned char a;
iic_start(); //发送启动信号
iic_write_byte(comm-1); //发送写命令字 用于假写入
iic_write_byte(addr); //发送地址
iic_start(); //重新启动总线
iic_write_byte(comm); //发送读命令字
a=iic_read_byte(); //读取数据
iic_stop(); //发送停止信号
return a;
}