
// =============================================================
// EEPROM FILE ... 

#include<header_file.h>

bit FLOAT_VALUES = LOW;

int final = 0;

void MAIN_WRITE_FLOAT(BYTE FIRST_ADD, BYTE SECOND_ADD, float fl_BUFF)
{
	BYTE a, _buff_[16], *ptr = &fl_BUFF;
	
	final = sizeof(fl_BUFF);
	
	START();
	WRITE_EEPROM(WRITE_ADD);
	WRITE_EEPROM(FIRST_ADD);
	WRITE_EEPROM(SECOND_ADD);

	for(a = 0; a < 4; a++) WRITE_EEPROM(*(ptr++));
		
	STOP();	  
}

float MAIN_READ_FLOAT(BYTE FIRST_ADD, BYTE SECOND_ADD)
{
	BYTE *ptr, a;
	float fl_VAL;

	ptr = &fl_VAL;

	START();
	WRITE_EEPROM(WRITE_ADD);
	WRITE_EEPROM(FIRST_ADD);
	WRITE_EEPROM(SECOND_ADD);
	START();
	WRITE_EEPROM(READ_ADD);

	for(a = 0; a < 4; a++) {
		*(ptr++) = READ_EEPROM();
		if(a != 3) {
			SDA	= LOW;
			I2C_CLOCK_CYCLE();		
		}
	}

	STOP();

	return(fl_VAL);
}


void START()
{	
	SCL = HIGH;
	delay(5);
	SDA = HIGH;
	delay(5);
	SDA = LOW;
	delay(5);
	SCL = LOW;
	delay(5);
}

void STOP()
{	
	SCL = HIGH;
	delay(5);
	SDA = LOW;
	delay(5);
	SDA = HIGH;
	delay(5);
	SCL = LOW;						    
	delay(5);
}

// SINGLE BYTE WRITE FUNCTION

void MAIN_WRITE(BYTE FIRST_ADD, BYTE SECOND_ADD, BYTE b_DATA)
{
	START();
	WRITE_EEPROM(WRITE_ADD);
	WRITE_EEPROM(FIRST_ADD);
	WRITE_EEPROM(SECOND_ADD);
	WRITE_EEPROM(b_DATA);
	STOP();
}

// SINGLE BYTE READ FUNCTION

BYTE MAIN_READ(BYTE FIRST_ADD, BYTE SECOND_ADD)
{
	BYTE value = 0x00;

	START();
	WRITE_EEPROM(WRITE_ADD);
	WRITE_EEPROM(FIRST_ADD);
	WRITE_EEPROM(SECOND_ADD);
	START();
	WRITE_EEPROM(READ_ADD);
	value = READ_EEPROM();
	STOP();

	return(value);
}

void I2C_CLOCK_CYCLE()
{
	SCL = HIGH;
	delay(5);
	SCL = LOW;
	delay(5);		
}						

void ACKNOWLEDGE()
{
	BYTE _buff[16];

	SDA = HIGH;

	while(SDA)
		;

	I2C_CLOCK_CYCLE();

	SDA = LOW;	
}

void WRITE_EEPROM(BYTE value)
{
	BYTE count = 8, compare = 0x80;

	while(count--){
		SDA = ((value & compare) ? 1 : 0);
		I2C_CLOCK_CYCLE();
		compare >>= 1;
	}	
									  
	ACKNOWLEDGE();
}

BYTE READ_EEPROM()
{											 
	BYTE count = 8, value = 0x00;
	
	SDA = HIGH;

	while(count--){
		value |= ((SDA) ? 1 : 0);
		I2C_CLOCK_CYCLE();
		if(count) value <<= 1;
	}	
	return(value);
}
