#include <regx51.h>
// external declarations
sbit sda = P1^1;
sbit scl = P1^2;
sbit led = P1^0;
void start();
void stop();
void delay(unsigned int);//in micro seconds
bit write(unsigned char data1)
void wait(unsigned int itime)
{
unsigned int i,j;
for(i=0;i<itime;i++)
for(j=0;j<10;j++); //10us delay ----clock freq = 12Mhz-----------
}
void start()
{
scl = 1;
sda = 1;
wait(5); //x10us delay
sda = 0;
wait(5); //x10us delay
scl = 0;
sda = 0;
}
void stop()
{
scl = 0;
sda = 0;
scl = 1;
wait(5); //x10us delay
sda = 1;
}
bit write(unsigned char data1)
{
bit ack;
unsigned char i;
for(i=0;i<8;i++)
{
scl = 0;
if(data1&0x80)
sda = 1;
else
sda = 0;
scl = 1;
data1 = data1 << 1;
wait(5); //x10us delay
scl = 0;
}
scl=0;
sda=1; //input...
wait(5); //x10us delay
ack=sda;
scl=0;
return ack;
}
void eeprom_write(char address,char data)
{
led = 1;
start();
led=write(0xA0); //i2c address
led=write(address); //byte address
led=write(data); //data itself
stop();
//you need at least 10ms to write the next data, so add a delay here...
}
void main(void)
{
sda=scl=1; // just in case... it's not needed in a 8051
eeprom_write(0x00, 0x50); // at address 0, value 50h
while(1); //eternal darkn... ejem.. loop...
}