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

📄 at24c02.c

📁 基于C51单片机的AT24C02功能测试程序
💻 C
字号:
/*****************************************************************************
						MCS8051-III学习板演示程序
							
				(c) Copyright 2007-2007,广州恒芯电子
						All Rights Reserved
*****************************************************************************/

/*****************************************************************************
程序说明
名称: MCS8051-III学习板演示程序(AT24C02测试)
功能: 保存键盘值到AT24C02中并在数码管显示
版本:2007-07-01
*****************************************************************************/

/*****************************************************************************
硬件说明
单片机:   兼容MCS-51单片机/STC89C51
晶振频率: 12MHz
*****************************************************************************/

#include "regx52.h"

/****************************************************************************
说明: 程序预定义
*****************************************************************************/
#define LED7A_CTRL P1_7/*数码管第一位控制引脚(0为有效,1为无效)*/
#define LED7B_CTRL P1_6/*数码管第二位控制引脚(0为有效,1为无效)*/
#define LED7C_CTRL P1_5/*数码管第三位控制引脚(0为有效,1为无效)*/
#define LED7D_CTRL P1_4/*数码管第四位控制引脚(0为有效,1为无效)*/

#define LED7_STATUS	P0/*数码管状态引脚(0为有效,1为无效)*/
#define KEY_STATUS P2/*键盘状态引脚*/

#define IC24X_ORDER_WRITE 0xa0/*AT24C02写指令*/
#define IC24X_ORDER_READ 0xa1/*AT24C02读指令*/

#define IIC_SDA P1_1/*IIC总线SDA引脚定义*/
#define IIC_SCL P1_0/*IIC总线SCL引脚定义*/
#define IIC_TLOW 10/*IIC总线等待时间*/

/****************************************************************************
说明: 变量定义
*****************************************************************************/
code unsigned char m_ucLedTab[]=
{
	0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90,
	0x88, 0x83, 0xC6, 0xa1 ,0x86 ,0x8e,	0xff
};/*数码管十六进制编码表*/

unsigned char code m_ucKeyTab[]=
{
	0xde, 0xe7, 0xd7, 0xb7, 0xeb, 0xdb, 0xbb, 0xed, 0xdd, 0xbd,
	0x77, 0x7b, 0x7d, 0x7e, 0xbe, 0xee
};/*键盘十六进制编码表*/

unsigned char m_ucLedBuf[4];/*数码管显示值缓存*/

/****************************************************************************
名称: KeyCheck()
说明: 键盘检测
参数: 无
返回: 键盘码值,若无键按下则返回16
*****************************************************************************/
unsigned char KeyCheck();

/****************************************************************************
名称: Led7Scan()
说明: 数码管动态扫描处理程序	
参数: 无
返回: 无
*****************************************************************************/
void Led7Scan();

/****************************************************************************
说明: IIC总线处理函数
*****************************************************************************/
void IicDelay();
void IicStart();
void IicStop();
void IicAck();
void IicNAck();
void IicWrite(unsigned char ucData);
unsigned char IicRead();

/*****************************************************************************
名称: AT24C02WriteByte()
说明: AT24C02写操作
参数: unsigned int uiAddr 地址
      unsigned char ucData 数据
返回: 无
*****************************************************************************/
void AT24C02WriteByte(unsigned int uiAddr,unsigned char ucData);

/*****************************************************************************
名称: AT24C02ReadByte()
说明: AT24C02读操作
参数: unsigned int uiAddr 地址   
返回: unsigned char 数据
*****************************************************************************/
unsigned char AT24C02ReadByte(unsigned int uiAddr);


/*****************************************************************************
程序开始
*****************************************************************************/
void main()
{	
	unsigned char ucKey=0;/*键盘值*/

	P1=0xf8;
	IIC_SCL=0;/*IIC时钟引脚至0*/
	P1_7=0;

	/*T0中断设定*/
  	TMOD=0x01;/*使用T0:GATE=0,C/T=0(定时),M1 M0=01(工作方式1)*/
	TH0=0xec;/*定时时间 50Hz/4 计算公式:10000H - (5 x 1000) = EC78H*/
	TL0=0x78;
	ET0=1; /*允许T0中断*/
	TR0=1; /*使T0工作*/

	ucKey=AT24C02ReadByte(0);/*从AT24C02地址为0000H中读取键盘值*/
	m_ucLedBuf[0]=ucKey;/*将键盘值放到数码管显示缓冲*/
	m_ucLedBuf[1]=ucKey;	
	m_ucLedBuf[2]=ucKey;	
  	m_ucLedBuf[3]=ucKey;
	
	EA=1;/*总中断开启*/
			
	while(1)
	{
		ucKey=KeyCheck();/*获得键盘值*/
		if(ucKey!=16)/*判断是否有键按下,若有则将它在数码管显示出来*/
		{
			m_ucLedBuf[0]=ucKey;/*将键盘值放到数码管显示缓冲*/
			m_ucLedBuf[1]=ucKey;	
			m_ucLedBuf[2]=ucKey;	
		   	m_ucLedBuf[3]=ucKey;
			
			EA=0;
			AT24C02WriteByte(0,ucKey);/*保存键盘值到AT24C02地址为0000H中*/			
			EA=1;
		}
	}
}

/*****************************************************************************
名称: Interrupt1Handler
说明: T0中断处理
参数: 无
返回 :无
*****************************************************************************/
void Interrupt1Handler() interrupt 1
{
	Led7Scan();/*数码管动态扫描*/	
	TH0=0xec;/*重新设置T0定时值*/
	TL0=0x78;
}

/****************************************************************************
名称: Led7Scan()
说明: 数码管动态扫描处理程序
参数: 无
返回: 无
*****************************************************************************/
void Led7Scan()
{	
	static unsigned char a=0;

	switch(a) /*判断数码管动态扫描值*/
	{
	case 0: /*处理数码管第一位*/
		LED7D_CTRL=1; /*设置数码管第四位为无效*/
		LED7A_CTRL=0; /*设置数码管第一位位有效*/
		break; 

	case 1:	/*处理数码管第二位*/
		LED7A_CTRL=1; /*设置数码管第一位为无效*/
		LED7B_CTRL=0; /*设置数码管第二位位有效*/
		break; 

	case 2:	/*处理数码管第三位*/
		LED7B_CTRL=1; /*设置数码管第二位为无效*/
		LED7C_CTRL=0; /*设置数码管第三位位有效*/
		break; 

	case 3: /*处理数码管第四位*/
		LED7C_CTRL=1; /*设置数码管第三位为无效*/
		LED7D_CTRL=0; /*设置数码管第四位位有效*/
		break; 
	}

	LED7_STATUS=m_ucLedTab[m_ucLedBuf[a]]; /*将显示码送数码管状态引脚*/	
	
	a++; /*数码管动态扫描值加1,若该值4则置为0*/
	if(a>3)
		a=0;
}

/****************************************************************************
名称: KeyCheck()
说明: 键盘检测
参数: 无
返回: 键盘码值,若无键按下则返回16
*****************************************************************************/
unsigned char KeyCheck()
{
   	unsigned char a,b;

	for(a=0;a<4;a++)/*循环4次*/
	{
		switch(a)/*改变键盘扫描码*/
		{
		case 0:KEY_STATUS=0xef;break;
		case 1:KEY_STATUS=0xdf;break;
		case 2:KEY_STATUS=0xbf;break;
		case 3:KEY_STATUS=0x7f;break;
		};

		b=KEY_STATUS;
		if((b&0x0f)!=0x0f)/*判断是否有按键按下*/
		{
			for(a=0;a<16;a++)/*根据键盘码判断那个键按下*/
			{
				if(b==m_ucKeyTab[a])
				{
					return a;
				}
			}
		}
	}

	return 16;
}


/*****************************************************************************
名称: AT24C02WriteByte()
说明: AT24C02写操作
参数: unsigned int uiAddr 地址
      unsigned char ucData 数据
返回: 无
*****************************************************************************/
void AT24C02WriteByte(unsigned int uiAddr,unsigned char ucData)
{
	IicStart();
	IicWrite(IC24X_ORDER_WRITE);
	IicAck();
	IicWrite(uiAddr);
	IicAck();
	IicWrite(ucData);
	IicAck();
	IicStop();
	IicDelay();	
}

/*****************************************************************************
名称: AT24C02ReadByte()
说明: AT24C02读操作
参数: unsigned int uiAddr 地址   
返回: unsigned char 数据
*****************************************************************************/
unsigned char AT24C02ReadByte(unsigned int uiAddr)
{
	unsigned char ucData;

 	IicStart();
	IicWrite(IC24X_ORDER_WRITE);
	IicAck();
	IicWrite(uiAddr);
	IicAck();
	IicStart();
	IicWrite(IC24X_ORDER_READ);
	IicAck();
	ucData=IicRead();
	IicNAck();
	IicStop();

	return ucData;
}

/****************************************************************************
说明: IIC总线处理函数
*****************************************************************************/
void IicDelay()
{
    unsigned char a;

	for(a=0;a<IIC_TLOW;a++);

}

void IicStart()
{
	IIC_SDA=1;
	IIC_SCL=1;
	IicDelay();	
	IIC_SDA=0;
	IicDelay();
	IIC_SCL=0;
}

void IicStop()
{
	IIC_SCL=0;
	IIC_SDA=0;
	IIC_SCL=1;
	IIC_SDA=1;
}

void IicAck()
{
	IIC_SDA=0;
	IIC_SCL=1;
	IicDelay();	
	IIC_SCL=0;
	IIC_SDA=1;
}
void IicNAck()
{
	IIC_SDA=1;
	IIC_SCL=1;
	IicDelay();
	IIC_SDA=0;
	IIC_SCL=0;
}

void IicWrite(unsigned char ucData)
{
	unsigned char a;

	for(a=0;a<8;a++)
	{
		if(ucData&0x80)
		{
			IIC_SDA=1;
		}
		else
		{
			IIC_SDA=0;
		}

		IIC_SCL=1; 
		IIC_SCL=0;
		ucData=ucData<<1;
	}
}

unsigned char IicRead()
{
	unsigned char a,ucData=0;
			 
	for(a=0;a<8;a++)
	{
		IIC_SDA=1;
		IIC_SCL=1; 
		
		ucData<<=1;

		if(IIC_SDA==1)
		{
			ucData|=0x01;
		}
		else
		{
			ucData&=0xfe;
		}
					 
		IIC_SCL=0; 
	}

	return ucData;
}

					   

⌨️ 快捷键说明

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