IIC代码

void Delay5us()		//@11.0592MHz
{
		unsigned char i;
		_nop_();
		i = 11;
		while (--i);
}

void Delay10ms()		//@11.0592MHz
{
		unsigned char i, j;
		i = 108;
		j = 145;
		do
		{
				while (--j);
		} while (--i);
}

//起始条件
void IIC_Start(void)
{
		SDA = 1;
		SCL = 1;
		Delay5us();
		SDA = 0;
		Delay5us();
		SCL = 0;	
}

//停止条件
void IIC_Stop(void)
{
		SDA = 0;
		SCL = 1;
		Delay5us();
		SDA = 1;
}

//应答
void IIC_Ack(unsigned char ackbit)
{
		if(ackbit) 
		{	
				SDA = 0;
		}
		else 
		{
				SDA = 1;
		}
		Delay5us();
		SCL = 1;
		Delay5us();
		SCL = 0;
		SDA = 1; 
		Delay5us();
}

//等待应答 
bit IIC_WaitAck(void)
{
		SDA = 1;
		Delay5us();
		SCL = 1;
		Delay5us();
		if(SDA)    
		{   
				SCL = 0;
				IIC_Stop();
				return 0;
		}
		else  
		{ 
				SCL = 0;
				return 1;
		}
}

//向IIC发送一个字节  
void IIC_SendByte(unsigned char byt)
{
		unsigned char i;
		for(i=0;i<8;i++)
		{   
				if(byt&0x80) 
				{	
						SDA = 1;
				}
				else 
				{
						SDA = 0;
				}
				Delay5us();
				SCL = 1;
				byt <<= 1;
				Delay5us();
				SCL = 0;
		}
}

//从IIC接收一个字节 
unsigned char IIC_RecByte(void)
{
		unsigned char da;
		unsigned char i;
		
		for(i=0;i<8;i++)
		{   
				SCL = 1;
				Delay5us();
				da <<= 1;
				if(SDA) 
				da |= 0x01;
				SCL = 0;
				Delay5us();
		}
		return da;
}

/*PCF8591初始化 */
void Pcf8591Init(unsigned char channel)
{
		IIC_Start();		   	
		IIC_SendByte(0x90);		
		IIC_WaitAck();			
		IIC_SendByte(channel);	
		IIC_WaitAck();			
		IIC_Stop();				
		Delay10ms();		
}

/*PCF8591读取数据  */
unsigned Pcf8591Reard(void)
{
		unsigned char temp;
		IIC_Start();			
		IIC_SendByte(0x91);		
		IIC_WaitAck();			
		temp = IIC_RecByte();	
		IIC_Ack(0);				
		IIC_Stop();			
		return temp;
}

/*向AT24C02写数据 */
void Write_AT24C02(unsigned char add,unsigned char date)
{
		IIC_Start();			
		IIC_SendByte(0xa0);		 
		IIC_WaitAck();			 
		IIC_SendByte(add);		
		IIC_WaitAck();			 
		IIC_SendByte(date);		 
		IIC_WaitAck();			 
		IIC_Stop();				
		Delay10ms();
}

/*从AT24C02读数据*/
unsigned char Read_AT24C02(unsigned char add)
{
		unsigned char temp;
		IIC_Start();
		IIC_SendByte(0xa0);		
		IIC_WaitAck();
		IIC_SendByte(add);		
		IIC_WaitAck();
		
		IIC_Start();
		IIC_SendByte(0xa1);		
		IIC_WaitAck();
		temp = IIC_RecByte();	 
		IIC_Ack(0);
		IIC_Stop();
		return temp;	
}

你可能感兴趣的:(IIC代码)