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

📄 i2ctest1.c

📁 利用非单片机资源口
💻 C
字号:
#include <p18f4620.h>
#define I2CDataIn      		PORTCbits.RC4
#define I2CDataOut		LATCbits.LATC4

#define I2CDataDir  		TRISCbits.TRISC4
#define I2CClk        		LATCbits.LATC3
#define I2CCLKDir		TRISCbits.TRISC3
#define  SUCCESS 				0
#define  FAILED1				1
#define  FAILED2 				2
#define uchar unsigned char
#define uint unsigned int


void DelayMicroTime(uint);
void InitialI2cPort();
void StartI2c();
void Out8Bits(uchar  byte);
void GiveAck();
void StopI2c();
uchar  AckCheck();


void DelayMicroTime(uint z)
{
	while(z)
	z--;
}

void InitialI2cPort()
{
	I2CDataDir=0;//初始化时都是0
	I2CCLKDir =0;
	I2CClk=1;
	DelayMicroTime(80);
	I2CDataOut=1;
}

//ok  sda=1;scl=1;sda=0;scl=0
void StartI2c()
{
	I2CDataDir=0;
	I2CDataOut=1;
	I2CClk=1;
	DelayMicroTime(150);
	I2CDataOut=0;
	DelayMicroTime(150);
	I2CClk=0;
}

void Out8Bits(uchar  byte)
{
	uchar i;
	I2CDataDir=0;
	for(i=0;i<8;i++)
	{
		I2CClk=0;
		DelayMicroTime(50);
		if(byte&0x0080)
			I2CDataOut=1;
		else
			I2CDataOut=0;
		DelayMicroTime(50);
		byte<<=1;
		I2CClk=1;
		DelayMicroTime(50);
	}
	I2CClk=0;
	I2CDataDir=1;//输入方向
	I2CDataOut=1;
	DelayMicroTime(80);
}



uchar  AckCheck()
{
	uchar result;
	I2CClk=1;
	DelayMicroTime(80);
	if(I2CDataIn==0)
		result=SUCCESS;
	else 
		result=FAILED1;
	DelayMicroTime(80);
	I2CClk=0;
	DelayMicroTime(80);
	return result;
}

void GiveAck()
{
	I2CClk=0;
	I2CDataDir=0;
	I2CDataOut=0;
	DelayMicroTime(80);
	I2CClk=1;
	DelayMicroTime(80);
	I2CClk=0;
	DelayMicroTime(80);
	I2CDataDir=1;
}

void In8Bits(uchar  *byte)
{
	uchar i;
	I2CClk=0;
	DelayMicroTime(80);
	I2CDataIn=1;
	I2CDataDir=1;
	*byte=0;
	for(i=0;i<8;i++)
	{
		*byte<<=1;
		DelayMicroTime(80);
		I2CClk=1;
		DelayMicroTime(80);
		if(I2CDataIn==1)
			*byte|=0x01;
		   else
		   	*byte&=0xfe;
		I2CClk=0;
	}
}

//ok  scl=0;sda=0;scl=1;sda=1
void StopI2c()
{
	I2CClk=0;
	I2CDataDir=0;
	I2CDataOut=0;
	DelayMicroTime(80);
	I2CClk=1;
	DelayMicroTime(80);
	I2CDataOut=1;
	DelayMicroTime(80);
}

unsigned char  DummyWrite(uchar address)
{
	StartI2c();
	Out8Bits(0xa0);
	if(AckCheck()!=SUCCESS)
		return FAILED1;
	Out8Bits(address);
	if(AckCheck()!=SUCCESS)
		return FAILED1;
	StopI2c();

	return SUCCESS;

}
uchar  ReadAt24c02(uchar *buffer,uchar length)
{
	uchar  i;
	StartI2c();
	Out8Bits(0xa1);
	if(AckCheck()!=SUCCESS)
		return FAILED1;
	for(i=0;i<length;i++)
	 {
	 In8Bits(&buffer[i]);
	 if(i!=length-1)
	 	{
		GiveAck();
		}
	 }
	StopI2c();

	return SUCCESS;
}

uchar WriteAt24c02(uchar address,uchar *buffer,char length)
{
	uchar  i;
	StartI2c();
	DelayMicroTime(50);
	Out8Bits(0xa0);
	if(AckCheck()!=SUCCESS)
		return FAILED1;
	Out8Bits(address);
	if(AckCheck()!=SUCCESS)
		return FAILED1;
	for(i=0;i<length;i++)
	 {
	 Out8Bits(buffer[i]);
	if(AckCheck()!=SUCCESS)
		return FAILED1;
	 }
	StopI2c();
	return SUCCESS;
}


void main()
{
	uchar a[8],b[8];
	uchar i;
	for (i=0;i<8;i++)
	{
		a[i]=1+i;
		b[i]=9+i;
	}
	InitialI2cPort();
	DelayMicroTime(30000);
	DummyWrite(0x00);
	DelayMicroTime(30000);
	ReadAt24c02(b,8);
//	WriteAt24c02(0x00,a,8);
	while(1);
}

⌨️ 快捷键说明

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