⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.c

📁 I2C驱动I2C驱动I2C驱动I2C驱动I2C驱动
💻 C
字号:

#include "globe.h"    

void Delay(void)
{
	uint8_t temp = 10;		//	mdy
	while(--temp)
		__wait_nop();
}	

void i2c_start(void)
{	
	I2C_SDA_DIR	= OUTPUT;
	I2C_SDA		= HIGH;
	I2C_SCL		= HIGH;
	Delay();
	I2C_SDA		= LOW;
	Delay();
	I2C_SCL		= LOW;	
	Delay();
}

void i2c_stop(void)
{	
	I2C_SDA_DIR	= OUTPUT;
	I2C_SDA		= LOW;
	I2C_SCL		= HIGH;
	Delay();
	I2C_SDA		= HIGH;
	Delay();
	I2C_SCL		= LOW;	
	Delay();	
}
void i2c_init(void)
{	
	I2C_SCL_DIR	= OUTPUT;
	I2C_SDA_DIR	= OUTPUT;
	Delay();
	I2C_SCL		= LOW;
	i2c_stop();
}

uint8_t i2c_send_byte(uint8_t data)
{
	uint8_t i;
	uint8_t temp = 0;
	I2C_SDA_DIR	= OUTPUT;
	for(i=0; i<8; i++)
	{						
		if(data & 0x80)
			I2C_SDA	= 1;
		else
			I2C_SDA	= 0;			
		data	<<= 1;
		I2C_SCL		= HIGH;
		Delay();					//	for lcd module need more delay.
		I2C_SCL		= LOW;
	}
	I2C_SDA_DIR	= INPUT;
	Delay();
	I2C_SCL		= HIGH;	
	while(I2C_SDA)					//	Wait slave ack.
	{			
		if(++temp > I2C_TIMEOUT)
		{										
			return(0);			
		}
	}
	I2C_SDA_DIR	= OUTPUT;
	I2C_SCL		= LOW;			
	return(1);
}

uint8_t i2c_clock(void)
{
	uint8_t temp;
	I2C_SCL		= HIGH;
	Delay();
	temp 		= I2C_SDA;
	I2C_SCL		= LOW;	
	return(temp);	
}

uint8_t i2c_receive_byte(void)
{
	uint8_t i;
	uint8_t data	= 0;
	I2C_SDA_DIR	= INPUT;
	for(i=0; i<8; i++)
	{
		data	<<= 1;
		if( i2c_clock() )
		{
			data += 1;				
		}						
	}
	I2C_SDA_DIR	= OUTPUT;
	return(data);
}

void i2c_ack(void)
{
	I2C_SDA_DIR	= OUTPUT;
	I2C_SDA		= LOW;
	i2c_clock();
	I2C_SDA		= HIGH;
}

uint8_t i2c_receive_byte0(void)
{
	uint8_t i;
	uint8_t data	= 0;
	I2C_SDA_DIR	= INPUT;
	for(i=0; i<8; i++)
	{
		data	>>= 1;
		if( i2c_clock() )
		{
			data |= 0x80;
		}
		else
			data &= 0x7F;			
	}
	I2C_SDA_DIR	= OUTPUT;
	return(data);
}

uint8_t i2c_send_byte0(uint8_t data)
{
	uint8_t i;
	uint8_t temp = 0;
	I2C_SDA_DIR	= OUTPUT;
	for(i=0; i<8; i++)
	{						
		if(data & 0x01)
			I2C_SDA	= 1;
		else
			I2C_SDA	= 0;			
		data	>>= 1;
		I2C_SCL		= HIGH;
		Delay();					//	for lcd module need more delay.
		I2C_SCL		= LOW;
	}
	I2C_SDA_DIR	= INPUT;
	Delay();
	I2C_SCL		= HIGH;
	while(I2C_SDA)					//	Wait slave ack.
	{
		if(++temp > I2C_TIMEOUT)				
			return(0);			
	}
	I2C_SDA_DIR	= OUTPUT;
	I2C_SCL		= LOW;			
	return(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -