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

📄 i2c.txt

📁 LCD1602.rar
💻 TXT
字号:
#include <at89x51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P2^0;
sbit SDA=P2^1;

void delay(uchar n)
{
	uint i;
	for(;n>0;n--)
		for(i=0;i<6000;i++);
}

/*启动I2C总线*/
void sta()
{
	SDA=1;
	SCL=1;
	_nop_();
	SDA=0;
	_nop_();
	SCL=0;
}

void stop( )/*停止I2C总线*/
{
	SDA=0;
	SCL=1;
	delay(1);
	SDA=1;
	delay(1);
}

void mack( )/*发送应答位*/
{
	SDA=0;
	SCL=1;
	_nop_();
	SCL=0;
	SDA=1;
}

void mnack( )/*发送非应答位*/
{
	SDA=1;
	SCL=1;
	_nop_();
	SCL=0;
	SDA=0;
}

void cack( )/*应答位检查*/
{
	SDA=1;
	SCL=1;
	F0=0;
	if(SDA==1)
	F0=1;
	SCL=0;
	_nop_( );
}

/*向虚拟I2C总线上发送1个数据字节*/
void wrbyt(uchar shu)
{
	uchar i;
	for(i=0;i<8;i++)
	{
		if((shu&0x80)>0)
		{
			SDA=1;
			SCL=1;
			_nop_();
			SCL=0;
		}
		else
		{
			SDA=0;
			SCL=1;
			_nop_();
			SCL=0;
		}
		shu=shu<<1;
	}
}

/*从I2C总线上读取1个数据字节*/
uchar rdbyt( )
{
	uchar nn=0xff,mm=0x80,uu=0x7f;
	uchar j;
	for(j=0;j<8;j++)
	{
		SDA=1;
		SCL=1;
		if(SDA==0)
			{nn=(nn&uu);}
		else
			{nn=(nn|mm);}
		nn=_crol_(nn,1);
		SCL=0;
	}
	return(nn);
}

void wrnbyta(uchar slaw,uchar gg[],uchar n)
{
	do
	{
		sta( );
		wrbyt(slaw);
		cack( );
	}
	while(F0==1);
		wrbyt(gg[n]);
		cack( );
}

/*向虚拟I2C总线上发送n个字节的数据
参数:写命令字、需要写到总线的数据、写数据长度
ff[]:前两个字节分别为高地址、低地址、接着是数据,其中数据长度=地址+数据
*/
void wrnbyt(uchar slaw,uchar ff[],uchar number)
{
	uchar idata k;
	do
	{
		sta( );
		wrbyt(slaw);
		cack( );
	}
	while(F0==1);
	for(k=0;k<number;k++)
	{
		wrbyt(ff[k]);
		cack( );
		while(F0==1)
		wrnbyta(slaw,ff,k);
	}
	stop( );
}

/*从虚拟I2C总线上读取n个字节的数据
前提:已初始化读取的首地址
参数:读命令字、保存数组、读取字节数
*/
void rdnbyt(uchar slar,uchar qq[],uchar number)
{
	uchar idata data0,l;
	do
	{
		sta( );
		wrbyt(slar);
		cack( );
	}
	while(F0==1);
	for(l=0;l<number-1;l++)
	{
		data0=rdbyt( );
		qq[l]=data0;
		mack( );
	}
	data0=rdbyt( );
	qq[l]=data0;
	mnack( );
	stop( );
}

//读任意地址单元数据
//参数:高地址、低地址
char eeprom_read(uchar addr_h,uchar addr_l)
{
	char a[2],temp[1];
	a[0]=addr_h;
	a[1]=addr_l;
	wrnbyt(0xa0,a,2);
	rdnbyt(0xa1,temp,1);
	return(temp[0]);
}

//写一字节到任意单元
void eeprom_write(uchar addr_h,uchar addr_l,uchar data1)
{
	char a[3];
	a[0]=addr_h;
	a[1]=addr_l;
	a[2]=data1;
	wrnbyt(0xa0,a,3);
}

void main()
{
	char out[]={0x00,0x00,0x01,0x02,0x03};//将0x01,0x02,0x03写到以0x0000为首地址eeprom中
	char intd[5];	//连续读数据缓存数组
	wrnbyt(0xa0,out,5);//将0x01,0x02,0x03写到以0x0000为首地址eeprom中
	wrnbyt(0xa0,out,2);//初始化首地址,如果不是0x0000,须将out数组初始化
	rdnbyt(0xa1,intd,3);//从初始化地址中读3个字节到intd数组中
	eeprom_write(0x00,0x10,0xaa);//将0xaa写到0x0010地址中去
	P0=eeprom_read(0x00,0x10);//读取0x0010地址中的数据
	while(1);
}

⌨️ 快捷键说明

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