51 단편기 I2C 버스 코드

1580 단어 실험 연습
I2C 버스 관련 함수:
void I2Cstart()//    
{	
	SDA=1;
	SCL=1;
	SDA=0;
	delay1ms(4);
	SCL=0;
	delay1ms(4);
}
void I2Cstop()//    
{
	SCL=0;
	delay1ms(4);
	SDA=0;
	delay1ms(4);
	SCL=1;
	delay1ms(4);
	SDA=1;
	delay1ms(4);
}
unsigned char I2Creadack()
{
	unsigned char i,byte;
	byte=0;
	for(i=0;i<8;i++)
	{
		SCL=0;
		SDA=1;
		delay1ms(4);
		byte<<=1;
		if(SDA==1)
		{
			byte|=0x01;
			delay1ms(4);
		}
	}
	SCL=0;
	delay1ms(4);
	SDA=0;
	delay1ms(4);
	SCL=1;
	delay1ms(4);
	SCL=0;
	return byte;
}
void I2Csend(unsigned char byte)//I2C      
{

	unsigned char mask,i;
	for(i=0;i<8;i++)
	{	
		SCL=0;
		if((mask&byte)==0)
		{
			SDA=0;
		}
		else
		{
			SDA=1;
		}
		mask>>=1;
		delay1ms(4);
		SCL=1;//          
		delay1ms(4);

	}
	SCL=0;
	SDA=1;		//              
	delay1ms(4);
	SCL=1;
	delay1ms(4);//     
	SCL=0;
}
unsigned char I2Cread(void)
{
	unsigned char i,byte;
	byte =0;
	for(i=0;i<8;i++)
	{
		SCL=0;
		SDA=1;//       
		delay1ms(4);
		SCL=1;//    
		delay1ms(4);
		byte<<=1;
		if(SDA==1)
		{
			byte|=0x01;
		}
		delay1ms(4);
	}
	SCL=0;
	delay1ms(4);
	SDA=0;//      
	delay1ms(4);
	SCL=1;
	delay1ms(4);
	SCL=0;
	return byte;
}
unsigned char I2Cread_eeprom(unsigned char addr)//I2C    
{
	unsigned char datebyte,datebyte2;
	I2Cstart();
	I2Csend(0xa0);//   
	I2Csend(addr);
	I2Cstart();
	I2Csend(0xa1);//   
	datebyte2=I2Creadack();
	datebyte=I2Cread();
	I2Cstop();
	return datebyte;

}

void write_eeprom(unsigned char addr,unsigned char datebyte)
{
	I2Cstart();
	I2Csend(0xa0);
	I2Csend(addr);
	I2Csend(datebyte);
	I2Cstop();
}

좋은 웹페이지 즐겨찾기