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

📄 24c08.c

📁 AT24c08(I2C存储器)的读写数据
💻 C
字号:
/*===============================================================
 
  程序名称:I2C存储器(24c08)的读写						  
  -----------------------------------------------
  ( http://www.bluepw.com  http://www.bluepw.cn )


 Agni 07-EV开发板 存储器24c08与单片机接线方式:

	P2.2--SCL
	P2.1--SDA

 注:(1):主芯片AT89S52使用11.0592M晶振

	(2):Keil uV3 3.30编译运行通过

	(3):本例程在 Agni 07-EV 开发平台上成功运行通过

	(4):蓝极风电子技术网版权所有,只供学习参考,不得应用于商业用途.

==================================================================*/
#include<at89x52.h>     //包括一个52标准内核的头文件
#include<24c08_lcd.h>
#define uchar unsigned char //定义一下方便使用
#define uint  unsigned int
#define ulong unsigned long

#define	WriteDeviceAddress 0xa0	  //定义器件在IIC总线中的地址
#define	ReadDviceAddress 0xa1
sbit	SCL=P3^4;
sbit	SDA=P3^5;

sbit	K1=P3^0;
uchar k;
void keyscan(void);

//定时函数
void DelayMs(uint number) 
{
	uchar temp;
	for(;number!=0;number--) 
	{
		for(temp=112;temp!=0;temp--) ;
	}
}

void key_delay(void)  //延时
{
	int t;
	for(t=0;t<500;t++);
}

//开始总线
void Start() 
{
	SDA=1;
	SCL=1;
	SDA=0;
	SCL=0;
}

//结束总线
void Stop() 
{
	SCL=0;
	SDA=0;
	SCL=1;
	SDA=1;
}


//发ACK0
void NoAck() 
{
	SDA=1;
	SCL=1;
	SCL=0;
}

//测试ACK
bit TestAck() 
{
	bit ErrorBit;
	SDA=1;
	SCL=1;
	ErrorBit=SDA;
	SCL=0;
	return(ErrorBit);
}

//写入8个bit到24c02
void Write8Bit(uchar input) 
{
	uchar temp;
	for(temp=8;temp!=0;temp--) 
	{
		SDA=(bit)(input&0x80);
		SCL=1;
		SCL=0;
		input=input<<1;
	}
}

//写入一个字节到24c02中
void Write24c02(uchar ch,uchar address) 
{
	Start();
	Write8Bit(WriteDeviceAddress);
	TestAck();
	Write8Bit(address);
	TestAck();

	Write8Bit(ch);
	TestAck();
	
	Stop();
	DelayMs(10);
}

//从24c02中读出8个bit
uchar Read8Bit() 
{
	uchar temp,rbyte=0;
	for(temp=8;temp!=0;temp--) 
	{
		SCL=1;
		rbyte=rbyte<<1;
		rbyte=rbyte|((uchar)(SDA));
		SCL=0;
	}
	return(rbyte);
}

//从24c02中读出1个字节
uchar Read24c02(uchar address) 
{
	uchar ch;

	Start();
	Write8Bit(WriteDeviceAddress);
	TestAck();
	Write8Bit(address);
	TestAck();
	Start();
	Write8Bit(ReadDviceAddress);
	TestAck();
	ch=Read8Bit();
	NoAck();
	Stop();
	return(ch);
}


//写入按键次数到24c02,并读出来显示在4个LED上
void main(void)	// 主程序
{
	uchar c1=0;
	uchar m;
	Init_lcd();
	while(1)
	{
		m=Read24c02(0xff);	 	//读出24c02第一个地址数据
		keyscan();
		switch(k)
		{
			case 1:	m=m+1;k=3;break;
			case 2: m=m-1;k=3;break;
			default:break;
		}
		Show(0x80,16," I2C存储器测试  ");
		Write24c02(m,0xff);	//写入24c02
		Show_dig(0x90,m);
	}

}

void keyscan(void)	 //键盘扫描函数
{
	unsigned char a;					
	P2 = 0xf0;				 //键盘初始化
	if(P2!=0xf0)			 //有键按下?
	{
		key_delay();		 //延时
		if(P2!=0xf0)		 //确认真的有键按下?
		{
			P2 = 0xfe;		 //使行线P2.4为低电平,其余行为高电平
			key_delay();
			a = P2;			 //a作为缓存
			switch (a)		 //开始执行行列扫描
			{
				case 0xee:k=0;break;
				case 0xde:k=1;break;
				case 0xbe:k=2;break;
				case 0x7e:k=3;break;
				default:P2 = 0xfd;	   //使行线P2.5为低电平,其余行为高电平

				a = P2;
				switch (a)
				{
					case 0xed:k=4;break;
					case 0xdd:k=5;break;
					case 0xbd:k=6;break;
					case 0x7d:k=7;break;
					default:P2 = 0xfb;	   //使行线P2.6为低电平,其余行为高电平

					a = P2;
					switch (a)
					{
						case 0xeb:k=8;break;
						case 0xdb:k=9;break;
						case 0xbb:k=10;break;
						case 0x7b:k=11;break;
						default:P2 = 0xf7;	  //使行线P2.7为低电平,其余行为高电平

						a = P2;
						switch (a)
						{
							case 0xe7:k=12;break;
							case 0xd7:k=13;break;
							case 0xb7:k=14;break;
							case 0x77:k=15;break;
							default:break;	   			   			        
						}
					}
				}
				break;
			}
		}
	}
}
/************************ end **********************************/

⌨️ 快捷键说明

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