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

📄 2408driver.h

📁 通用的AT24XX系列存储器驱动程序
💻 H
字号:

/*---------------------------------------------------------------------------------------------------------------
调用方式:void WriteIIC_24CXX(enum EEPROMTYPE eepromtype,unsigned int address,unsigned char ddata) ﹫2001/09/18
函数说明:对于IIC芯片24CXX,在指定地址address写入一个字节ddata 
 
page 0--7 address 0x00--0xFF      0xa000---0xa7FF 

调用方式:unsigned char ReadIIC_24CXX(enum EEPROMTYPE eepromtype,unsigned int address) ﹫2001/09/18
函数说明:读取IIC芯片24CXX,指定地址address的数据。

/*----------------------------------------------------------------------------------------------------
调用方式:void savepw_24XX(uint addr,uchar *strpw)﹫2006/04/18 by KreateHe
函数说明:向IIC芯片24CXX写入一个小于16位长度的字符串,指定起始地址addr
page 0--7 address 0x00--0xFF      0xa000---0xa7F0  共8*16*16
------------------------------------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------------------------------
调用方式:void getstring_24XX(uint addr,uchar **strpw,uchar len)﹫2006/04/18 by KreateHe
函数说明:从IIC芯片24CXX读出一个小于16位长度的字符串,指定起始地址address
page 0--7 address 0x00--0xFF      0xa000---0xa7F0  共8*16*16
------------------------------------------------------------------------------------------------------


-----------------------------------------------------------------------------------------------------------------*/

sbit SCL= P3^4;
sbit SDA= P3^5;


/*----------------------------------------------------------------------------
调用方式:write_8bit(unsigned char ch) ﹫2006/03/23
函数说明:内函数,私有,用户不直接调用。
-------------------------------------------------------------------------------*/
void write_8bit(unsigned char ch)
{
	unsigned char i=8;
	SCL=0;
	_nop_();_nop_();_nop_();_nop_();_nop_();
	while (i--)
	{
		SDA=(bit)(ch&0x80);
		_nop_();_nop_();_nop_();_nop_();_nop_();
		ch<<=1;
		SCL=1;
		_nop_();_nop_();_nop_();_nop_();_nop_();
		SCL=0;
		_nop_();_nop_();_nop_();_nop_();_nop_();
	}
	_nop_();_nop_();_nop_();_nop_();_nop_();
}
/*------------------------------------------------------------------------------
调用方式:void ACK(void) ﹫2006/03/23
函数说明:内函数,私有,用户不直接调用。
-------------------------------------------------------------------------------*/
void ACK(void)
{
	unsigned char time_1;
	SDA=1;
	SCL=0;
	_nop_();_nop_();_nop_();_nop_();_nop_();
	SCL=1;
	time_1=5;
	while(SDA) 
	{
		if (!time_1) break;
	} //ACK
	SCL=0;
	_nop_();_nop_();_nop_();_nop_();_nop_();
}

/*---------------------------------------------------------------------------------------------------------------
调用方式:void WriteIIC_24CXX(enum EEPROMTYPE eepromtype,unsigned int address,unsigned char ddata) ﹫2006/04/18
函数说明:对于IIC芯片24CXX,在指定地址address写入一个字节ddata
page 0--7 address 0x00--0xFF
-----------------------------------------------------------------------------------------------------------------*/
void WriteIIC_24CXX(unsigned int address,unsigned char ddata)
{ 
	unsigned char page,address_in_page; 

	

	page=(unsigned char)(address>>8) & 0x07;
	page=page<<1;
	address_in_page=(unsigned char)(address);
	SCL=1;
	_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //Tsu:STA
	SDA=0;
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA
	SCL=0; //START
	write_8bit(0xa0 | page); //写页地址和操作方式,对于24C32-24C256,page不起作用
	ACK();	
	write_8bit(address_in_page);
	ACK();
	write_8bit(ddata);
	ACK();
	SDA=0;
	_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	SDA=1; //STOP
	delay(1000);
}

/*----------------------------------------------------------------------------------------------------
调用方式:unsigned char ReadIIC_24CXX(enum EEPROMTYPE eepromtype,unsigned int address) ﹫2006/04/18
函数说明:读取IIC芯片24CXX,指定地址address的数据。
page 0--7 address 0x00--0xFF      0xa000---0xa7FF
------------------------------------------------------------------------------------------------------*/
unsigned char ReadIIC_24CXX(unsigned int address)
{ 
	unsigned char page,address_in_page;
	unsigned char ddata=0;
	unsigned char i=8;
	
	page=(unsigned char)(address>>8) & 0x07;
	page=page<<1;
	address_in_page=(unsigned char)(address);
	SDA=0;_nop_();
	SCL=0; //START
	write_8bit(0xa0 | page); //写页地址和操作方式,对于24C32-24C256,page不起作用
	ACK();	
	
	write_8bit(address_in_page);
	ACK();//以上是一个“哑”写操作,相当于设置当前地址
	SCL=1;
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Tsu:STA
	SDA=0;
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA
	SCL=0; //START
	write_8bit(0xa1); //写从地址,置为读模式
	ACK();
	while (i--)
	{
		SDA=1;
		ddata<<=1;
		SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1;
		if (SDA) ddata|=0x01;
	}
	SCL=0;
	_nop_();
	SCL=1;
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	SDA=0;
	_nop_();
	SCL=1;
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	SDA=1; //STOP
	delay(1000);
	return ddata;
}

/*----------------------------------------------------------------------------------------------------
调用方式:void savepw_24XX(uint addr,uchar *strpw)﹫2006/04/18 by KreateHe
函数说明:向IIC芯片24CXX写入一个小于16位长度的字符串,指定起始地址addr
page 0--7 address 0x00--0xFF      0xa000---0xa7F0  共8*16*16
------------------------------------------------------------------------------------------------------*/
void savestring_24xx(uint addr,uchar *strpw)
{
	uchar i=0,len;
	len=strlen(strpw);
	
	while(i<len)
	{
		WriteIIC_24CXX(addr+i,strpw[i]);
		i++;
	}
}

/*----------------------------------------------------------------------------------------------------
调用方式:void getstring_24XX(uint addr,uchar **strpw,uchar len)﹫2006/04/18 by KreateHe
函数说明:从IIC芯片24CXX读出一个小于16位长度的字符串,指定起始地址address
page 0--7 address 0x00--0xFF      0xa000---0xa7F0  共8*16*16
------------------------------------------------------------------------------------------------------*/
void getstring_24xx(uint addr,uchar *strpw,uchar len)
{
	uchar i=0,ch;	
	while(i<len)
	{
		ch=ReadIIC_24CXX(addr+i);
		*(strpw+i)=ch;
		i++;
	}
}

⌨️ 快捷键说明

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