
$MOD51
	ORG 00H
SCL	EQU P2.0
SDA	EQU P2.1
VERI	EQU 30H
	MOV IE,#00H
	MOV DPL,#10H
	MOV VERI,#01H
	ACALL EEPROM_WRITE
	NOP
	ACALL EEPROM_READ
	MOV P1,VERI
GO:	NOP
	AJMP GO

EEPROM_WRITE:
	LCALL I2C_START
	LCALL EE_ADD_WR
	JB PSW.5,EEPROM_WRITE
	MOV A,DPL
	LCALL I2C_WRITE
	LCALL ACK
	JB PSW.5,EEPROM_WRITE
	MOV A,VERI
	LCALL I2C_WRITE
	LCALL ACK
	JB PSW.5,EEPROM_WRITE
	LCALL I2C_STOP
	LCALL WAIT
	RET
EEPROM_READ:
	LCALL I2C_START
	LCALL EE_ADD_WR
	JB PSW.5,EEPROM_READ
	MOV A,DPL
	LCALL I2C_WRITE
	LCALL ACK
	JB PSW.5,EEPROM_READ
	LCALL I2C_START
	LCALL EE_ADD_RD
	LCALL I2C_READ
	LCALL NO_ACK
	LCALL I2C_STOP
	LCALL WAIT
	RET

EE_ADD_WR:
	MOV A,#0A0H
	LCALL I2C_WRITE
	LCALL ACK
	RET
EE_ADD_RD:
	MOV A,#0A1H
	LCALL I2C_WRITE
	LCALL ACK
	RET

I2C_WRITE:
	MOV R7,#8D
	CLR C
LOOP:	RLC A
	MOV SDA,C
	LCALL CLOCK
	DJNZ R7,LOOP
	RET
I2C_READ:
	MOV R7,#8D
LOOP2:	SETB SDA
	SETB SCL
	NOP
	NOP
	MOV C,SDA
	RLC A
	CLR SCL
	NOP
	NOP
	DJNZ R7,LOOP2
	MOV VERI,A
	RET

I2C_START:
	SETB SCL
	SETB SDA
	NOP
	CLR SDA
	NOP
	CLR SCL
	RET
I2C_STOP:
	SETB SCL
	CLR SDA
	NOP
	SETB SDA
	NOP
	CLR SCL
	RET

ACK:
	CLR SCL
	SETB SCL
	NOP
	JNB SDA,GO_ON
	SETB PSW.5
	CLR SCL
	RET
GO_ON:	CLR SCL
	RET
NO_ACK:
	CLR SCL
	SETB SDA
	SETB SCL
	NOP
	CLR SCL
	CLR SDA
	RET

CLOCK:
	SETB SCL
	NOP
	NOP
	CLR SCL
	RET
WAIT:
	MOV B,#41d
LOOP3:	MOV R1,#0FFH
LOOP4:	NOP	
	DJNZ R1,LOOP4		
	DJNZ B,LOOP3
	RET
END
