hi i ve written the follwing program for interfacing 24c02 eeprom with 8051 using i2c protocol it works in proteous simulation but doesnot work in real time please help me to solve the program, thanks in advance ------------------------------------------------ lcd_output equ P1 rs equ P3.5 r_w equ P3.6 e equ P3.7 temp equ 0feh ;*************************************** ;ports used for i2c communication ;*************************************** sda equ P3.3 scl equ P3.4 ;**************************************** ;***************************************
mov r5,#08h acall startc
mov a,#10100000b ; write command acall send
mov a,#00h ;memory address acall send
mov a,#00h ;value acall send
mov a,#01h ;value acall send
mov a,#02h ;value acall send mov a,#03h ;value acall send mov a,#04h ;value acall send mov a,#05h ;value acall send mov a,#06h ;value acall send mov a,#07h ;value acall send acall stop
acall delay1 acall startc
mov a,#10100000b ; write command acall send ;device address
acall startc
mov a,#10100001b acall send
l3: acall recv
mov r0,#temp orl a,#30h mov @r0,a
acall display_setup acall display
djnz r5,l3
here: sjmp here ;---command-------------------------------------------------------------------------- command: mov lcd_output,a ;copy reg a to port 1 clr rs ;rs=0 for command clr r_w ;r/w=0 for write setb e ;e=1 for high pulse acall delay1;give lcd some time clr e ;e=0 for h-to-l pulse ret ;---data_display---------------------------------------------------------------------------- data_display: mov lcd_output,a ;copy reg a to port 1 setb rs ;rs=1 for data clr r_w ;r/w=0 for write setb e ;e=1 for high pulse acall delay1 ;give lcd some time clr e ;e=0 for h-to-l pulse ret ;---display_setup----------------------------------------------------------------------- display_setup: mov a,#38h ;init. lcd 2 lines ,5x7 matrix lcall command ;issue command mov a,#0ch ;lcd on, cursor off lcall command ;issue command mov a,#01h ;clear lcd command lcall command ;issue command ret ;---address---------------------------------------------------------- display: mov r0,#temp mov a,@r0
lcall data_display ret ;---delay_for_busy_flag------------------------------------------- delay1: mov r7,#0ffh delay_3: mov r6,#0ffh delay_4: djnz r6,delay_4 djnz r7,delay_3 ret
;**************************************** ;start condition for i2c communication ;**************************************** startc: setb scl setb sda nop nop clr sda nop nop clr scl setb sda ret
;***************************************** ;stop condition for i2c bus ;***************************************** stop: clr scl clr sda setb scl nop nop setb sda nop nop
ret
;***************************************** ;sending data to slave on i2c bus ;***************************************** send: mov r7,#08h back: clr scl rlc a mov sda,c setb scl nop nop nop djnz r7,back clr scl nop nop setb sda ;l1: jb sda, l1 acall ack ret
;***************************************** ;ack and nak for i2c bus ;***************************************** ack: clr sda setb scl clr scl setb sda ret
nak: setb sda setb scl clr scl setb scl ret
;***************************************** ;receiving data from slave on i2c bus ;***************************************** recv: mov r7,#08h back2: clr scl setb scl mov c,sda rlc a djnz r7,back2 clr scl nop nop setb sda acall ack ;l4: jb sda, l4 ret delay: mov r7,#4h here1: djnz r7,here1 ret end