#ifndef __i2c__H_
#define __i2c__H_

#define uchar unsigned char
#define uint  unsigned int

sbit led=P2^2;
sbit SDA=P2^3;
sbit SCL=P2^2;

//延时函数********
void delayus(uint us)
{
   while(us--);
}

void delayms(uint ms)
{
	uchar i;
	while(ms--)
	for(i=0;i<125;i++);
}

//初始化
void IIC_init()
{
	SDA=1;
	delayus(1);
	SCL=1;
	delayus(1);
}
					  
//开始信号
void IIC_start()
{
	SDA=1;
	delayus(1);
	SCL=1;
	delayus(1);
	SDA=0;
	delayus(1);
}

//结束信号	  
void IIC_stop()
{
	SDA=0;
	delayus(1);
	SCL=1;
	delayus(1);
	SDA=1;
	delayus(1);
}


//应答信号
void IIC_respons()
{
	uchar i;
	SCL=1;
	delayus(1);
	while((SDA==1)&&(i<255)) i++;
	SCL=0;
	delayus(1);
}

//写1字节数据
void WriteByte(uchar dat)
{
	uchar i,temp;
	temp=dat;
	for(i=0;i<8;i++)
	{
	    temp=temp<<1;
		SCL=0;
		delayus(1);
		SDA=CY;
		delayus(1);
		SCL=1;
		delayus(1);
	 }
	SCL=0;
	delayus(1);
	SDA=1;
	delayus(1);
}

//读1字节数据
uchar ReadByte()
{
	uchar i,temp1;
	SCL=0;
	delayus(1);
	SDA=1;
	delayus(1);
	for(i=0;i<8;i++)
	{
	    SCL=1;
		delayus(1);
		temp1=(temp1<<1)|SDA;
		SCL=0;
		delayus(1);
  	}
  return temp1;
}


//指定地址写数据
void write_add(uchar add,uchar dat)
{
	 IIC_start();
	 WriteByte(0xa0);
	 IIC_respons();
	 WriteByte(add);
	 IIC_respons();
	 WriteByte(dat);
	 IIC_respons();
	 IIC_stop();
}

//**指定地址开始写存储区************************
void wr_iic(uchar addr,uchar code *table,uint length)
{
   while(length--)
    { 	
	   write_add(addr,*table);
       addr++;
	   table++;
	   led=1;
	   delayms(100);
       led=0;
	}
}

//指定地址读数据
uchar read_add(uchar add)
{
	uchar dat;
	IIC_start();
	WriteByte(0xa0);
	IIC_respons();
	WriteByte(add);
	IIC_respons();
	IIC_start();
	WriteByte(0xa1);
	IIC_respons();
	dat=ReadByte();
	IIC_stop();
	return dat;
}

#endif