24C02 IICEPROM驱动

/*****************************************************************************************************************************
  本驱动定义了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; 
}

转载于:https://www.cnblogs.com/jinghai/archive/2011/12/27/2303869.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值