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

📄 eeprom.c

📁 用CS5532做的无线吊钩称的接收称重显示器程序
💻 C
字号:
///////////////////
#include  <R_io.h>
////////////
bit		eep_b  ;		////内部外部EEPROM选择
//////////////////at24256///////////////
void delays (void)             ///写入程序的延时程序
{
	unsigned int loop;
	for(loop=0;loop<1000;loop++)
	  {
	    _nop_( );
	    _nop_( );
	  }
}
//////////////
void start_2402 (void)          ///开始
{
	IO_iicsda=1;
	_nop_();
	_nop_();
	IO_iicsclk=0;
	_nop_();
	_nop_();
	IO_iicsclk=1;
	_nop_();
	_nop_();
	IO_iicsda=0;
	_nop_();
	_nop_();
	IO_iicsclk=0;
}
//////////////////
void stop_2402 (void)           ///停止
{
	IO_iicsda=0;
	_nop_();
	_nop_();
	IO_iicsclk=1;
	_nop_();
	_nop_();
	IO_iicsda=1;
}
////
void outbyt(unsigned char da)   ///向eeprom写入一个字节
{
	unsigned char loop;
	for (loop=0;loop<8;loop++)
	{
		da=da<<1;
		IO_iicsda=CY;
		_nop_();
		_nop_();
		IO_iicsclk=1; 
		_nop_();
		_nop_();
		IO_iicsclk=0;
	}
}
unsigned char inbyte (void)    ///读出一个字节
{
	unsigned char  loop,da=0;  
	for (loop=0;loop<8;loop++) 
	{
		da=da<<1;
		IO_iicsda=1;
		_nop_();
		_nop_();
		da=da|IO_iicsda;
		IO_iicsclk=1 ;
		_nop_();
		_nop_();
		IO_iicsclk=0;   
	}
	return(da);
}
///
void ack (void)             ///
{
	IO_iicsda=0;
	_nop_();
	_nop_();
	IO_iicsclk=1;
	_nop_();
	_nop_();
	IO_iicsclk=0;
}
void noack(void)           ///
{
	IO_iicsda=1;
	_nop_();
	_nop_();
	IO_iicsclk=1;
	_nop_();
	_nop_();
	IO_iicsclk=0;
}
/////////* 打开 ISP,IAP 功能 */
void EraseEeprom(unsigned char t_addr)
{
	ISP_ADDRH = t_addr*2+0x80;
	ISP_ADDRL = 0;
	EA	=	0;				/* 关中断 */
	ISP_CONTR = 0x81;       /* 1000,0000 */
	ISP_CMD = 3;
	ISP_TRIG = 0x46;
	ISP_TRIG = 0xb9;
	_nop_();
	_nop_();
	ISP_CONTR = 0;	/* 0111,1111 */
	ISP_CMD = 0;
	ISP_TRIG = 0;
	ISP_ADDRH = 0;
	ISP_ADDRL = 0;
	EA = 1;                	/* 开中断 */
}
////将从temp[0]的缓冲区开始num个数据
////写入到从t_addr地址开始
////一次最多8个
void WriteEeprom(unsigned char t_addr,unsigned char num,unsigned char xdata *ptr)
{
	unsigned  char  loop;

	if (!eep_b)
	{
		IO_iicen = 0;
		_nop_();
		_nop_();
		start_2402();
		outbyt (0xa0); 
		ack();
		outbyt(t_addr);
		for (loop=0;loop<num;loop++)
		{
			ack();
			outbyt(*(ptr+loop)); 
		}
		ack();
		stop_2402();
		delays( );
		IO_iicen = 1;
	}
	else
	{
		EraseEeprom(t_addr);
		for (loop=0; loop<num; loop++)
		{
			ISP_ADDRH = *(ptr+loop);
			ISP_ADDRH = t_addr*2+0x80;
			ISP_ADDRL = loop;
			EA	=	0;				 /* 关中断 */
			ISP_CONTR = 0x81;       /* 1000,0000 */
			ISP_CMD = 2;
			ISP_TRIG = 0x46;
			ISP_TRIG = 0xb9;
			_nop_();
			_nop_();
			ISP_CONTR = 0;	/* 0111,1111 */
			ISP_CMD = 0;
			ISP_TRIG = 0;
			ISP_ADDRH = 0;
			ISP_ADDRL = 0;		
			EA = 1;                	/* 开中断 */
		}
	}
}
////从eeprom的t_addr地址开始读出num个数据
////存入以temp[0]开始的存储单元
////一次最多8个
void ReadEeprom(unsigned char s_addr,unsigned char num,unsigned char xdata *ptr)
{
	unsigned  char  loop;
	
	if (!eep_b)
	{
		start_2402();
		outbyt (0xa0); 
		ack();
		outbyt(s_addr);
		ack();
		start_2402();
		outbyt (0xa1); 
		for (loop=0;loop<num;loop++)
		{
			ack();
			*(ptr+loop)=inbyte();
		}
		noack();
		stop_2402();
	}
	else
	{
		for (loop=0; loop<num; loop++)
		{
			ISP_ADDRH = s_addr*2+0x80;
			ISP_ADDRL = loop;
			EA	=	0;	/* 关中断 */
			ISP_CONTR = 0x81;       /* 1000,0000 */
			ISP_CMD = 1;
			ISP_TRIG = 0x46;
			ISP_TRIG = 0xb9;
			_nop_();
			_nop_();
			ISP_CONTR = 0;	/* 0111,1111 */
			ISP_CMD = 0;
			ISP_TRIG = 0;
			ISP_ADDRH = 0;
			ISP_ADDRL = 0;		
			EA = 1;                			/* 开中断 */
			*(ptr+loop) = ISP_DATA;
		}
	}
}

///////////////////

⌨️ 快捷键说明

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