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

problem in reading and sending data in eeprom using 8051(code given below)

//Program to display String on LCD

//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^1;
bit ack;
sbit led1=P0^2;
sbit sav=P0^4;
sbit up=P0^5;
sbit down=P0^6;
sfr lcd_data_pin=0xA0;//p2 port
sfr output=0x80;//p0 port
sbit rs=P3^1;

sbit en=P3^0;
unsigned char reead,write;
unsigned int temp,new_value1,new_value,test=0,num=0,i,j;
void init() // to initialize the output pins and Timer0
{ up=down=1;

TMOD=0x01;
TL0=0xf6;
TH0=0xFf;
IE=0x82;
TR0=1;
} 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; delay(1); en=0;
} void lcd_data(unsigned char disp)
{ lcd_data_pin=disp; en=1; rs=1; delay(1); en=0;
} lcd_strng(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 int value) //send byte serially
{

unsigned int i; unsigned int 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
{ init(); while(1) { if(up==0&&down==1) //check if up pin is pressed { test++; num=test; new_value=num%10; num=num/10; if(test==9) test=0;

} if(up==1&&down==0) //check if down pin is pressed { test--; num=test; new_value=num%10; num=num/10; if(test==0) test=9;

}

start(); send_byte(0xA0); //device address aknowledge(); send_byte(0x00); //word address aknowledge(); send_byte(new_value); //send data aknowledge(); stop(); if(ack==0) { /* new_value1=new_value1+48; */ led1=1; delay(100); led1=0; delay(100); lcd_command(0x86); lcd_data(new_value);

} 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(); stop(); if(i==new_value) { led=0; delay(100); led=1; delay(100); write=i+48; lcd_command(0xC6); lcd_data(write); } else led=1;

aknowledge();
}

void main()
{ lcd_ini();

lcd_strng("Sent :"); lcd_command(0xC0); lcd_strng("Read :"); temp=0; while(1) { save(); Read(); } }

Parents
  • I wonder why my code looks like:

    void main(void) {
        init();
        for (;;) {
            led_1_on();
            delay_ms(500);
            led_1_off();
            delay_ms(500);
        }
    }
    


    and your code looks like:

    void main(void) {
    init();
    for (;;) {
    led_1_on();
    delay_ms(500);
    led_1_off();
    delay_ms(500);
    }
    }
    

    Did you post with tabs? Did you, in that case, see any setting to specify what tab settings
    your post was expected to have? Didn't you see something strange in the preview, before you
    pressed Post?

    Even more interesting - how come your code looks like:

    led
    =
    1;
    aknowledge();
    }
    


    What web site did you find that recommended having an assign split over three lines?

    or:

    lcd_strng("Sent :")
    ;
    lcd_command(0xC0)
    ;
    lcd_strng("Read :")
    ;
    


    Since when was it made popular to have the ';' statement termination on a separate line?

    Is this how the source code looks in your own editor? Assigns over three lines, and the
    semicolon sometimes on separate lines?

    I don't believe you. Because your latest post contains the following:

    send_byte(0x00); //word
             address
    aknowledge();
    

    Notice that your // comment got split to two lines - the compiler can't accept that "address"
    word. So you have once more reposted code with already broken indentations, despite me
    specifically saying that it is a bad idea. You have, once more, posted code that can't be
    compiled.

Reply
  • I wonder why my code looks like:

    void main(void) {
        init();
        for (;;) {
            led_1_on();
            delay_ms(500);
            led_1_off();
            delay_ms(500);
        }
    }
    


    and your code looks like:

    void main(void) {
    init();
    for (;;) {
    led_1_on();
    delay_ms(500);
    led_1_off();
    delay_ms(500);
    }
    }
    

    Did you post with tabs? Did you, in that case, see any setting to specify what tab settings
    your post was expected to have? Didn't you see something strange in the preview, before you
    pressed Post?

    Even more interesting - how come your code looks like:

    led
    =
    1;
    aknowledge();
    }
    


    What web site did you find that recommended having an assign split over three lines?

    or:

    lcd_strng("Sent :")
    ;
    lcd_command(0xC0)
    ;
    lcd_strng("Read :")
    ;
    


    Since when was it made popular to have the ';' statement termination on a separate line?

    Is this how the source code looks in your own editor? Assigns over three lines, and the
    semicolon sometimes on separate lines?

    I don't believe you. Because your latest post contains the following:

    send_byte(0x00); //word
             address
    aknowledge();
    

    Notice that your // comment got split to two lines - the compiler can't accept that "address"
    word. So you have once more reposted code with already broken indentations, despite me
    specifically saying that it is a bad idea. You have, once more, posted code that can't be
    compiled.

Children
No data