;****************************** ;I2C ROUTINS *** ;Published By Mehdi N.Rahni *** ;****************************** ;I use this code for i2c devices such as LM75,DS1307,24C256 ;For defining any i2c device you must only consider hardwired addressing and address inputs ;So you can extend this code with limited changes ;Example: ;MOV DPTR,#125H ;MOV DYTA,#79H ;LCALL EEPROM_WRITE ;IN ADDRESS 125H DATA IS 79H ;MOV DPTR,#125H ;LCALL EEPROM_READ ;MOV A,DYTA ;NOW ACC IS 79H SDA EQU P2.6 SCL EQU P2.7 DYTA EQU 50H ADRES EQU 51H I2C_READ: ;reading 8 bits from i2c device MOV R7,#8 GFD: SETB SDA SETB SCL MOV C,SDA RLC A CLR SCL DJNZ R7,GFD MOV DYTA,A RET I2C_WRITE: ;writing 8 bits in to i2c device MOV R7,#8 WRITING: RLC A MOV SDA,C LCALL CLOCK DJNZ R7,WRITING RET I2C_START: ;start of i2c routine SETB SCL SETB SDA CLR SDA CLR SCL RET I2C_STOP: ;end of i2c routine SETB SCL CLR SDA SETB SDA CLR SCL RET CLOCK: ;synchronizing clock SETB SCL CLR SCL RET ACK: ;acknowledge from transmitter or receiver SETB SDA SETB SCL JB SDA,$ CLR SCL RET NO_ACK: ;no acknowledge from transmitter or receiver SETB SDA CLR SCL JNB SDA,$ SETB SCL RET ;************************* ;SERIAL EEPROM PACKAGE**** ;************************* EEPROM_WRITE: ;write in to eeprom LCALL I2C_START LCALL EEPROM_WRITE_ADDR LCALL ACK MOV A,DPH LCALL I2C_WRITE LCALL ACK MOV A,DPL LCALL I2C_WRITE LCALL ACK MOV A,DYTA LCALL I2C_WRITE LCALL ACK LCALL I2C_STOP LCALL DELAY_STOP RET EEPROM_READ: ;read from eeprom LCALL I2C_START LCALL EEPROM_WRITE_ADDR LCALL ACK MOV A,DPH LCALL I2C_WRITE LCALL ACK MOV A,DPL LCALL I2C_WRITE LCALL ACK LCALL I2C_START LCALL EEPROM_READ_ADDR LCALL ACK LCALL I2C_READ LCALL NO_ACK LCALL I2C_STOP RET EEPROM_READ_ADDR: ;A2,A1,A0 are zero MOV A,#10100001B LCALL I2C_WRITE RET EEPROM_WRITE_ADDR: ;A2,A1,A0 are zero MOV A,#10100000B LCALL I2C_WRITE RET DELAY_STOP: ;terminating write process MOV TMOD,#00000001B MOV TH0,#0EEH MOV TL0,#00H SETB TR0 SAC: JNB TF0,SAC CLR TR0 CLR TF0 RET