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

📄 at24c02test.c

📁 BTF020实验程序-1 btf020开发板自带
💻 C
字号:
/***************************************************************
功能:实现存储器EEPROM AT24C02的数据读写操作,同时了解软件实现I2C总线读写
作者:ZDP
时间:2005-11-30
版本:V1.0
***************************************************************/
#include <c8051f020.h>
#include <INTRINS.H>
#define  WriteDeviceAddress 0xa0	//写驱动地址指令
#define  ReadDeviceAddress 0xa1		//读驱动地址指令

sbit SCL = P0^7;
sbit SDA = P0^6;

/*-------------------------------------------------------------
功能:发起始信号
------------------------------------------------------------*/
void Start_Cond()
{
	SCL = 0;
    _nop_();
	SDA = 1;
    _nop_();
	SCL = 1;
    _nop_();
	SDA = 0;
	_nop_();
}

/*-------------------------------------------------------------
功能:发停止信号
------------------------------------------------------------*/
void Stop_Cond()
{
	SCL = 0;
	_nop_();
	SDA = 0;
	_nop_();
	SCL = 1;
	_nop_();
	SDA = 1;
	_nop_();
}

/*-------------------------------------------------------------
功能:发确认信号
------------------------------------------------------------*/
void Ack()
{
	SCL = 0;
	_nop_();
	SDA = 0;
	SCL = 1;
	_nop_();
	SCL = 0;
	_nop_();
	SDA = 1;
}

/*-------------------------------------------------------------
功能:发无确认信号
------------------------------------------------------------*/
void NoAck()
{
	SCL = 0;
	_nop_();
	SDA = 1;
	_nop_();
	SCL = 1;
	_nop_();
	SCL = 0;
	_nop_();
}

/*-------------------------------------------------------------
功能:写一个字节数据
------------------------------------------------------------*/
bit Write8Bit(unsigned char input)
{
	unsigned char i;
	for (i=0;i<8;i++)
	{	
		SCL = 0;
		input <<= 1;
		SDA = CY;
		SCL = 1;
	}
	SCL = 0;
    _nop_();
	SDA = 1;
	SCL = 1;
    _nop_();
	CY = SDA;
	return(CY) ;
}

/*-------------------------------------------------------------
功能:读一个字节数据
------------------------------------------------------------*/
unsigned char Read8Bit()
 {
	unsigned char temp,rbyte=0;
	for (temp = 8;temp != 0;temp--)
	{
		SCL = 0;
		_nop_();
		rbyte = (rbyte << 1) | SDA;
		SCL = 1;
        _nop_();
	}
	return rbyte;
}

/*-------------------------------------------------------------
功能:从EEPROM中给定一个地址连续读NLEN个字节数据存放在以指针
nContent开头的往下内容。
------------------------------------------------------------*/
bit Read_Flash ( unsigned char *nContent, unsigned char nAddr, unsigned char nLen )
{
	unsigned char Addr;
	Addr = nAddr;
	Start_Cond();						//写开始信号
	Write8Bit(WriteDeviceAddress);		//写驱动地址
	Write8Bit(Addr);					//写从EEPROM中读的开始地址
        Start_Cond();					//写开始信号
        Write8Bit(ReadDeviceAddress);	//写读数据指令
	while(--nLen)
	{
		*nContent=Read8Bit();			//读出内容
		nContent++;						//指针加1
		Ack();							//发确认信号
	}
	*nContent=Read8Bit();				//读一字节
 	NoAck();							//没有确认信号
	Stop_Cond();						//发停止信号
	return(0);							//返回
}

/*-------------------------------------------------------------
功能:初始化EEPROM子程序内容为FF
------------------------------------------------------------*/
bit Init_Flash ( unsigned int nPage ) //8字节为一页面全写0xff
{
	unsigned char nLen;
	unsigned char Addr;
	nLen=8;
    Addr=8 *nPage;
	Start_Cond();
    Write8Bit(WriteDeviceAddress);
	Write8Bit(Addr);
	for(;nLen!=0;nLen--)
    {
		if(Write8Bit(0xff)) break;
	}
	Stop_Cond();
    return(CY);
}

/*-------------------------------------------------------------
功能:从EEPROM中给定一个地址连续写NLEN个字节数据存放在以指针
nContent开头的往下内容。
------------------------------------------------------------*/
bit Write_Flash ( unsigned char *nContent, unsigned char nAddr,unsigned char nLen)
{
	unsigned char i,temp;
	unsigned char Addr;
	Addr = nAddr;
	Start_Cond();					//写开始信号
 	Write8Bit(WriteDeviceAddress);	//写驱动地址
	Write8Bit(Addr);				//写从EEPROM中写的开始地址	
	for(i = 0;i < nLen;i++)
	{	temp = *nContent;
		Write8Bit(temp);  			//CY
		nContent++;
        Addr++;
		if(Addr%8==0)   			//每页8字节	换页
		{	Stop_Cond();
            for(temp=0;temp!=255;temp++)
				{_nop_();}
			Start_Cond();
			Write8Bit(WriteDeviceAddress);
			Write8Bit(Addr);
		}
	}
	Stop_Cond();					//发停止信号
	return(CY);
}

/*-------------------------------------------------------------
主程序
功能:实现存储器EEPROM AT24C02的数据读写操作
------------------------------------------------------------*/

void main()
{unsigned char dat[16],i;
 WDTCN     = 0xDE;
 WDTCN     = 0xAD;			//关闭WDT

 P0MDOUT   = 0x80;
 XBR2      = 0x40;			//配置I/O端口

 Read_Flash(dat,0,16);		//读出AT24C02中从地址0开始依次往后16个字节放入dat数组中		
 Init_Flash(0);				//将AT24C02的第0页初始化为FF
 Init_Flash(1);				//将AT24C02的第0页初始化为FF
 Read_Flash(dat,0,16);		//读出AT24C02中从地址0开始依次往后16个字节放入dat数组中

 for(i = 0;i < 16;i++ )
 {
 	dat[i] = i;			    //对数组dat初始化为0---F
 }					
 Write_Flash(dat,0,16);		//将dat数组中的数据写入AT24C02中地址从0开始
 _nop_();
 Read_Flash(dat,0,16);		//读出AT24C02中从地址0开始依次往后16个字节放入dat数组中
 while(1);
}

⌨️ 快捷键说明

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