原创 at24c512多字节读写函数 欢迎测试

2009-11-10 20:13 4304 19 21 分类: MCU/ 嵌入式

刚写的at24c512多字节读写函数,欢迎测试。


/********************************************************************
函数功能:EEPROM写一字节函数。
入口参数:device_addr:设备地址;data_addr:数据地址;w_data:数据。
返    回:是否成功。
备    注:无。
********************************************************************/
unsigned char EepromWriteByte(unsigned char device_addr,unsigned char data_addr,unsigned char w_data)
{
 unsigned char i,Device_Addr;
 delay();
 SDA=0;                          //产生一个起始位  
 delay();
 Device_Addr=device_addr;        //EEROM的地址暂存
 for(i=0;i<7;i++)                //输出设备地址
 {
  SCL="0";
  delay();
  SDA="device"_addr&0x80;         //SDA上输出一位数据,高位在前
  device_addr<<=1;
  delay();
  SCL="1";
  delay();
 }
 SCL=0;
 delay();
 SDA=0;                          //SDA上输出0,表示写操作
 delay();
 SCL=1;
 delay();
 SCL=0;
 delay();
 SDA=1;                          //释放SDA线
 delay();
 SCL=1;
 delay();
 if(SDA){return 1;}               //如果设备未响应,则返回出错代码1
 for(i=0;i<8;i++)                //输出数据地址
 {
  SCL="0";
  delay();
  SDA="data"_addr&0x80;           //SDA上输出一位数据,高位在前
  data_addr<<=1;      
  delay();
  SCL="1";
  delay();
  delay();
 } 
 SCL=0;
 delay();
 SDA=1;                          //释放SDA线
 delay();
 SCL=1;
 delay();
 if(SDA){return 2;}             //如果设备未响应,则返回出错代码2
 for(i=0;i<8;i++)                //输出要写入的数据
 {
  SCL="0";
  delay();
  SDA="w"_data&0x80;               //SDA上输出一位数据,高位在前
  w_data<<=1;
  delay();
  SCL="1";
  delay();
 } 
 SCL=0;
 delay();
 SDA=1;                          //释放SDA线
 delay();
 SCL=1;
 delay();
 if(SDA){return 3;}               //如果设备未响应,则返回出错代码3
 SCL=0;
 delay();
 SDA=0;
 delay();
 SCL=1;
 delay();
 SDA=1;                         //产生一个停止位,停止操作
 for(i=0;i<250;i++)             //等待数据写入
 {
  delay();
 }
 for(i=0;i<250;i++)delay();
 return 0;                     //正确写入,返回0
}
////////////////////////End of function//////////////////////////////


/********************************************************************
函数功能:从EEROM中读取一字节函数。
入口参数:device_addr:设备地址;data_addr:数据地址。
返    回:无。
备    注:无。
********************************************************************/
unsigned char EepromReadByte(unsigned char device_addr,unsigned char data_addr)
{
 unsigned char i,r_data,Device_Addr;
 SDA=0;                          //产生一个起始位  
 delay();
 Device_Addr=device_addr;        //EEROM的地址暂存
 for(i=0;i<7;i++)                //输出设备地址
 {
  SCL="0";
  delay();
  SDA="device"_addr&0x80;         //SDA上输出一位数据,高位在前
  device_addr<<=1;
  delay();
  SCL="1";
  delay();
 }
 SCL=0;
 delay();
 SDA=0;                    //SDA上输出0,表示写操作
 delay();
 SCL=1;
 delay();
 SCL=0;
 delay();
 SDA=1;                    //释放SDA线
 delay();
 SCL=1;
 delay();
 if(SDA) return 0x0100;   //如果设备未响应,则返回出错代码0x0100
 for(i=0;i<8;i++)         //输出数据地址
 {
  SCL="0";
  delay();
  SDA="data"_addr&0x80;    //SDA上输出一位数据,高位在前
  data_addr<<=1;      
  delay();
  SCL="1";
  delay();
  delay();
 } 
 SCL=0;
 delay();
 SDA=1;                     //释放SDA线
 delay();
 SCL=1;
 delay();
 if(SDA) return 0x0200;     //如果设备未响应,则返回出错代码0x0200
 SCL=0;
 delay();
 SDA=1;
 delay();
 SCL=1;
 delay();
 SDA=0;                      //产生一个重启动位
 delay();
 device_addr=Device_Addr;    //EEROM的地址
 for(i=0;i<7;i++)            //输出设备地址,一个7位的地址
 {
  SCL="0";
  delay();
  SDA="device"_addr&0x80;     //SDA上输出一位数据,高位在前
  device_addr<<=1;
  delay();
  SCL="1";
  delay();
 }
 SCL=0;
 delay();
 SDA=1;                     //SDA上输出1,表示读操作
 delay();
 SCL=1;
 delay();
 SCL=0;
 delay();
 SDA=1;                     //释放SDA线
 delay();
 SCL=1;
 delay();
 if(SDA) return 0x0300;    //如果设备未响应,则返回出错代码0x0300
 for(i=0;i<8;i++)          //从EEROM中读出数据
 {
  SCL="0";
  delay();
  r_data<<=1;
  delay();
  SCL="1";
  if(SDA)r_data=r_data|0x01;   //保存一位数据
  delay();
 } 
 SCL=0;
 delay();
 SDA=1;                        //置SDA高电平,表示停止读出
 delay();
 SCL=1;
 delay();
 SCL=0;
 delay();
 SDA=0;
 delay();
 SCL=1;
 delay();
 SDA=1;                         //产生一个停止位,停止读操作
 return r_data;                 //返回数据
}
//****************************************************************************************

文章评论2条评论)

登录后参与讨论

用户377235 2015-5-20 15:29

512数据地址是16位的

用户377235 2012-10-17 23:31

测试过吗?
相关推荐阅读
用户925035 2009-11-15 00:44
通用按键消抖函数 -- 数据与过程分离
AUTO:  nicksean 不务正业          项目里经常处理按键消抖, 本来这个消抖的过程是与具体按下的键无关的, 可以前的代码总是在消抖的同时处理具体的按键值, 再加上长按 短按 组合...
用户925035 2009-11-13 13:16
液晶ST7920串行显示
液晶显示128*64以7920为主控制器,采用3线制,比较经济简单。代码如下.....
用户925035 2009-11-13 13:11
DS18B20 C51完整版
使用WINBOND W78C516单片机,11.0592MHZ晶振,用共阳LED数码管P0口输出段码,P1口扫描/*******************************************...
用户925035 2009-11-12 13:19
74HC164驱动数码管
          74HC164是串行输入,并行输出接口器件,可用在单向的并行输出/并行地址锁存等. 74HC164因为价格便宜,容易使用特别适合使用在在需要用到数码管显示IO口又比较紧张的电子产品...
用户925035 2009-11-10 19:59
旋转编码器
    很好的旋转编码器的读码程序,设旋转编码器的输出波形如下                 ______        ______        ______        ______正转时:...
我要评论
2
19
关闭 站长推荐上一条 /2 下一条