注: 以下例程内容来自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
三星的话,延时可以短点。
;--------------------------------------------------------
|