读写EEROM存储器24C16的C语言程序例程
文章来源: 本站整理   更新时间: 2011-01-20

注: 以下例程内容来自QQ群聊天信息,经整理得到.

;--------------------------------------------------
;C语言读写24C16
;------------------------------------------------
小文子(19243322) 2011-1-19 :22:39
void IIC_Start(void) //IIC_Start
{
IIC_SDA = 1;
IIC_SCL = 1;
Delay(5);
IIC_SDA = 0;
Delay(5);
IIC_SCL = 0;
}

void IIC_Stop(void) //IIC_STOP
{
IIC_SDA = 0;
IIC_SCL = 1;
Delay(5);
IIC_SDA = 1;
Delay(5);
}

void IIC_Ack(void) //IIC_ACK
{
   IIC_SDA = 0;
   IIC_SCL = 1;
   Delay(5);
   IIC_SCL = 0;
   IIC_SDA = 1;
}

void IIC_NoAck(void) //IIC_NoAck (For Read Mode)
{
   IIC_SDA = 1;
   IIC_SCL = 1;
   Delay(5);
   IIC_SCL = 0;
   IIC_SDA = 0;
}

void IIC_TestAck(void)
{
   P0CON = 0xE2;
   Delay(1);
   IIC_SCL = 1;
   IIC_E0 = 0;
   Delay(1);
   if(IIC_SDA)
      {
              IIC_E0 = 1;
      }
   IIC_SCL=0;
   P0CON = 0xEA;
}

void IIC_Write8Bit(m8u write_byte) //Write One Byte
{
   m8u i;
   for(i=0;i<8;i++)
   {
           if(write_byte&0x80)
                   {
       IIC_SDA=1;
       }
   Delay(1);
   write_byte<<=1;
   IIC_SCL=1;
   Delay(1);
   IIC_SCL=0;
   IIC_SDA=0;
   }
}

m8u IIC_Read8Bit(void) //IIC_Read One Byte
{
m8u temp,Rbyte=0;
P0CON = 0xE2; //
  
for(temp=0;temp<8;temp++)
{
    IIC_SDA=1;
    IIC_SCL=1;
    Delay(1); //短延时
       Rbyte<<=1;
    if(IIC_SDA)
            {
       Rbyte |= 0x01;
      }
    IIC_SCL=0;
}
P0CON = 0xEA; //
return(Rbyte);



}

void WriteIIC(m8u RomPage, m8u *Wdata,m8u RomAddress,m8u number)
{
IIC_Start();
IIC_Write8Bit(IIC_DEVICE_ADDR_W|(RomPage<<1));
IIC_TestAck();
if(IIC_E0)
{
    IIC_NACK=1;
    return;
}
IIC_Write8Bit(RomAddress);
IIC_TestAck();
if(IIC_E0==1)
{
    IIC_NACK=1;
    return;
}
for(;number!=0;number--)
{
    IIC_Write8Bit(*Wdata);
    IIC_TestAck();
    if(IIC_E0)
    {
       IIC_NACK=1;
       return;
    }
    Wdata++;
}
IIC_Stop();
}



void ReadIIC(m8u RomPage, m8u *RamAddress,m8u RomAddress,m8u bytes)
{
IIC_Start();
IIC_Write8Bit(IIC_DEVICE_ADDR_W|(RomPage<<1));
IIC_TestAck();
if(IIC_E0)
{
    IIC_NACK=1;
    return;
}
IIC_Write8Bit(RomAddress);
IIC_TestAck();
if(IIC_E0)
{
    IIC_NACK=1;
    return;
}
IIC_Start();
IIC_Write8Bit(IIC_DEVICE_ADDR_R|(RomPage<<1));
IIC_TestAck();
if(IIC_E0)
{
    IIC_NACK=1;
    return;
}
while(bytes!=1)
{
    *RamAddress=IIC_Read8Bit();
    IIC_Ack();
    RamAddress++;
    bytes--;
}
*RamAddress=IIC_Read8Bit();
IIC_NoAck();
IIC_Stop();
}

;-----------------------------------------------------
小文子(19243322) 2011-1-19 :22:39
上面是24C16的
小文子(19243322) 2011-1-19 :22:39
可以读任意页任意地址任意长度的数据。
L B(363192137) 2011-1-19 :22:41
THANKS
小文子(19243322) 2011-1-19 :22:44
#define IIC_DEVICE_ADDR_W 0xA0
#define IIC_DEVICE_ADDR_R 0xA1
小文子(19243322) 2011-1-19 :22:45
洗澡去先,上面的代码没问题的,三星 AVR都可以直接用。
小文子(19243322) 2011-1-19 :22:45
三星的话,延时可以短点。
;--------------------------------------------------------

相关备注:
 
三星单片机开发网首页