This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

about EEPROM 24c64 communication with 89s52

help me for the following doubts:

i have interfaced EEPROM(24c64) with 89s52). but i can't understand what is the process in it. i know something about it. its having sda pin(pin 5) for serial data communication and scl pin (pin 6) for control signal.
question:
1. how to do the read and write operation on it.
2. In the following program doing some serial communication which is taken from engineersgarage.com www.engineersgarage.com/micro...T89C51-circuit

3. In that program what is device address
4. what is calculation in extracting MSB.
5. tell me simple procedure for do a own program.

//Program to interface Serial EEPROM AT24C02 with 8051 microcontroller (AT89C51)
#include<reg51.h>
#include<intrins.h>   //For using [_nop_()]
sbit sda=P1^0;
sbit scl=P1^1;
sbit led=P0^3;
bit ack;
sbit led1=P0^1;
sfr lcd_data_pin=0xA0;//p2 port
sfr output=0x80;//p0 port
sbit rs=P3^0;
sbit rw=P3^1;
sbit en=P3^6;
unsigned char reead,write,write2,i,j;
unsigned int temp;
void delay(unsigned int count)
{
        int i,j;
        for(i=0;i<count;i++)
                for(j=0;j<1275;j++);
}
void lcd_command(unsigned char comm)
{
        lcd_data_pin=comm;
        en=1;
        rs=0;
        rw=0;
        delay(1);
        en=0;
}
void lcd_data(unsigned char disp)
{
        lcd_data_pin=disp;
        en=1;
        rs=1;
        rw=0;
        delay(1);
        en=0;
}
void lcd_dataa(unsigned char *disp)
{
        int x;
        for(x=0;disp[x]!=0;x++)
        {
                lcd_data(disp[x]);
        }
}
void lcd_ini()
{
        lcd_command(0x38);                // for using 8-bit 2 row LCD
        delay(5);
        lcd_command(0x0F);        // for display on, cursor blinking
        delay(5);
        lcd_command(0x80);
        delay(5);
}
void aknowledge()         //acknowledge condition
{
        scl=1;
        _nop_();
        _nop_();
        scl=0;
}
void start()            //start condition
{
        sda=1;
        scl=1;
        _nop_();         //No operation
        _nop_();
        sda=0;
        scl=0;
}
void stop()                     //stop condition
{
        sda=0;
        scl=1;
        _nop_();
        _nop_();
        sda=1;
        scl=0;
}
void send_byte(unsigned char value)     //send byte serially
{
        unsigned int i;
        unsigned char send;
        send=value;
        for(i=0;i<8;i++)
        {
                sda=send/128;                   //extracting MSB
                send=send<<1;                     //shiftng left
                scl=1;
                _nop_();
                _nop_();
                scl=0;
        }
   ack=sda;                                     //reading acknowledge
   sda=0;
}
unsigned char read_byte()                       //reading from EEPROM serially
{
        unsigned int i;
        sda=1;
        reead=0;
        for(i=0;i<8;i++)
        {
                reead=reead<<1;
                scl=1;
                _nop_();
                _nop_();
                if(sda==1)
                        reead++;
                scl=0;
        }
        sda=0;
        return reead;                           //Returns 8 bit data here
}
void save()                                     //save in EEPROM
{
        start();
        send_byte(0xA0);                                                //device address
        aknowledge();
        send_byte(0x00);                                                //word address
        aknowledge();
        send_byte(5);                                                   //send data
        aknowledge();
        send_byte(65);
        aknowledge();
        stop();
        if(ack==0)
        {
                led1=1;
                delay(100);
                led1=0;
                delay(100);
                lcd_command(0x86);
                lcd_data('5');
                lcd_command(0x87);
                lcd_data('A');
        }
        else
                led1=1;
        aknowledge();
}
void Read()
{
        start();
        send_byte(0xA0);
        aknowledge();
        send_byte(0x00);
        aknowledge();
        start();
        send_byte(0xA1);                                         //device address
        aknowledge();
        i=read_byte();
        aknowledge();
        j=read_byte();
        aknowledge();
        stop();
        if(i==5)
        {
                led=0;
                delay(100);
                led=1;
                delay(100);
                write=i+48;
                lcd_command(0xC6);
                lcd_data(write);
        }
        else
         led=1;
        if(j==65)
        {
                lcd_command(0xC7);
                lcd_data(j);
        }
        aknowledge();
}

int main()
{
        lcd_ini();
        lcd_dataa("Sent :");
        lcd_command(0xC0);
        lcd_dataa("Read :");
        temp=0;
        while(1)
        {
                save();
                Read();
        }
        return 0;
}