⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 240x.c

📁 51edn开发板程序
💻 C
字号:
/*--------------------------------------------------------
            240x.c文件 240x-I2CROM的读写函数
  作者:Computer-lov     创建日期:2004.11.12    最后修改日期:2004.11.21
  版本:1.0
  Copyright (c) 2005 Computer-lov
-----------------------------------------------------------*/

#include "240x.h"

/********************************************************************
函数功能:延时子函数。
入口参数:无。
返    回:无。
备    注:无。
********************************************************************/
void delay(void)
{
 int8 i;
 for(i=0;i<1;i++);
}
////////////////////////End of function//////////////////////////////

/********************************************************************
函数功能:EEROM写一字节函数。
入口参数:device_addr:设备地址;data_addr:数据地址;w_data:数据。
返    回:是否成功。
备    注:无。
********************************************************************/
uint8 EepromWriteByte(uint8 device_addr,uint8 data_addr,uint8 w_data) 
{
 uint8 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:数据地址。
返    回:无。
备    注:无。
********************************************************************/
uint8 EepromReadByte(uint8 device_addr,uint8 data_addr) 
{
 uint8 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;                 //返回数据
}
//****************************************************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -