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

📄 rw2401_256.c

📁 24c01-24c256全系列的C程序
💻 C
字号:

//**********************************************************************************
//**  一个通用的24C01-24C256共9种EEPROM的字节读写操作程序,                  ******
//**  程序有五个入口条件,分别为读写数据缓冲区指针,                           ******
//**  进行读写的字节数,EEPROM首址,EEPROM控制字节,                          ******
//**  以及EEPROM类型。此程序结构性良好,具有极好的容错性,程序机器码也不多:   ******
//**********************************************************************************

#pragma  ot(6,SIZE)

#include "REG51RX.H"
#include "fj51_io_pin.h"
#include "DIS.H"
#include  <intrins.h>



#define  ERRORCOUNT 10
#define  EepromType  1

//enum  eepromtype  {M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256};
//enum  eepromtype EepromType;

#define M2416 4
//DataBuff为读写数据输入/输出缓冲区的首址
//ByteQuantity 为要读写数据的字节数量
//Address 为EEPROM的片内地址
//ControlByte 为EEPROM的控制字节,具体形式为(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1,
//表示读操作,R/W=0为写操作,A2,A1,A0为EEPROM的页选或片选地址;
//EepromType为枚举变量,需为M2401至M24256中的一种,分别对应24C01至24C256;
//函数返回值为一个位变量,若返回1表示此次操作失效,0表示操作成功;
//ERRORCOUNT为允许最大次数,若出现ERRORCOUNT次操作失效后,则函数中止操作,并返回1
//SDA和SCL由用户自定义,这里暂定义为P0^0和P0^1;
//其余的不用管,只要把只子程序放在你的程序中并调用它就可以了;

 bit   RW24XX11(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address,
              unsigned char ControlByte);

 bit   RW24XX(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address,
              unsigned char ControlByte)  //,enum eepromtype EepromType)
    { uchar yy;
      bit      errorflag=1;
      for(yy=0;yy<ByteQuantity;yy++)
           {  if(RW24XX11(DataBuff++,1,Address++,ControlByte)==0)
                      {    errorflag=0;
                      }

              else
                     {errorflag=1;   break;}
            }
       return(errorflag) ;
   }

/***********************************************************************************/
 bit   RW24XX11(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address,
              unsigned char ControlByte)  //,enum eepromtype EepromType)
    {
    void Delay(unsigned char DelayCount);
    void IICStart(void);
    void IICStop(void);
    bit  IICRecAck(void);
    void IICNoAck(void);
    void IICAck(void);
    unsigned char IICReceiveByte(void);
    void IICSendByte(unsigned char sendbyte);
    unsigned char data j,i=ERRORCOUNT;
    bit      errorflag=1;
    while(i--)
       {
       IICStart();
       IICSendByte(ControlByte&0xfe);       //写器件地址
       if(IICRecAck())                        //接收应答
           continue;       //无应答重新再来
       if(EepromType>M2416)
          {
          IICSendByte((unsigned char)(Address>>8));    //发长地址的高八位
          if(IICRecAck())
             continue;
          }
       IICSendByte((unsigned char)Address);            //发长地址的低八位
       if(IICRecAck())
           continue;
       if(!(ControlByte&0x01))
          {                       //如是写数据 时
          j=ByteQuantity;
          errorflag=0;                      //********clr errorflag
          while(j--)
            {
            IICSendByte(*DataBuff++);
            if(!IICRecAck())
               continue;
            errorflag=1;
            break;
            }

          if(errorflag==1)
            continue;
          break;
          }
       else                       //如是读数据 时
         {
         IICStart();
         IICSendByte(ControlByte);
         if(IICRecAck())
           continue;
         while(--ByteQuantity)
           {
           *DataBuff++=IICReceiveByte();
           IICAck();
           }
         *DataBuff=IICReceiveByte();        //read last byte data
         IICNoAck();
         errorflag=0;
         break;
         }
      }            //END WHILE  DE }

    IICStop();
    if(!(ControlByte&0x01))
          {
          Delay(255);
          Delay(255);
          Delay(255);
          Delay(255);
           Delay(255);
          Delay(255);
          Delay(255);
          }

    return(errorflag);
  }              //END SUB  DE }



/*****************以下是对IIC总线的操作子程序***/
/*****************启动总线**********************/
void IICStart(void)
{
    SCL=0;                  //
    SDA=1;
    SCL=1;
    _nop_();
    _nop_();
    _nop_();
    SDA=0;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    SCL=0;
    SDA=1;                  //
}

/*****************停止IIC总线****************/
void IICStop(void)
{
    SCL=0;
    SDA=0;
    SCL=1;
    _nop_();
    _nop_();
    _nop_();
    SDA=1;
    _nop_();
    _nop_();
    _nop_();
    SCL=0;
}

/**************检查应答位*******************/
bit IICRecAck(void)
{
    SCL=0;
    SDA=1;
    SCL=1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    CY=SDA;                 //因为返回值总是放在CY中的
    SCL=0;
    return(CY);
}

/***************对IIC总线产生应答*******************/
void IICACK(void)
{
    SDA=0;
    SCL=1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    SCL=0;
    _nop_();
    SDA=1;
}

/*****************不对IIC总线产生应答***************/
void IICNoAck(void)
  {
    SDA=1;
    SCL=1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    SCL=0;
  }

/*******************向IIC总线写数据*********************/
void IICSendByte(unsigned char sendbyte)           //先发高位
{
unsigned char data j=8;
for(;j>0;j--)
   {
   SCL=0;
   sendbyte<<=1;        //无论C51怎样实现这个操作,始终会使CY=sendbyte^7;
   SDA=CY;
   SCL=1;
   }
SCL=0;
}

/**********************从IIC总线上读数据子程序**********/
unsigned char IICReceiveByte(void)
{
//register
uchar receivebyte,i=8;
SCL=0;
while(i--)
   {
   SCL=1;
   receivebyte=(receivebyte<<1);
   if(SDA)
       receivebyte++;
   SCL=0;
   }
return(receivebyte);
}

/***************一个简单延时程序************************/
void Delay(unsigned char DelayCount)
{
while(DelayCount--);
}

//*********************************************************************************************
//一个通用的24C01-24C256共9种EEPROM的字节读写操作程序,*************************************
//*********************************************************************************************

⌨️ 快捷键说明

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