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

📄 iic.c

📁 针对AMTEL公司AT24C04的读写程序
💻 C
字号:
#include "NEC78F0451.h"

unsigned char Write_EEPROM(unsigned int Addr,unsigned char L,unsigned char *RAM) //写EEPROM,型号为at24c04
{	
	unsigned char unc,temp;
	unsigned int addrCounter;
	WDTE=0xAC;
	VCA=1;
	WP=1;	
	Stop();
	Delay_ms(1);
	EEPROM_ERR=0;
  	if(L==0) goto  EndOfWrite;
	WP=0; 
	WDTE=0xAC;
	Start();
	if(Addr<256) 
	{	
		temp=CTRL_BYTE_EEPROM1;
		unc=(unsigned char)Addr;
	}
	else
	{
		temp=CTRL_BYTE_EEPROM2;
		unc=(unsigned char)(Addr-256);
	}
	if(WriteOneByte(temp)==0xEE)
	{
		EEPROM_ERR=1;
    goto EndOfWrite;
  }
	if(WriteOneByte(unc)==0xEE)
	{
    EEPROM_ERR=1;
    goto EndOfWrite;
	}
	addrCounter=Addr-1;
	WriteNextOneByte:
	WDTE=0xAC;
	addrCounter++;
	if((addrCounter!=Addr)&&((addrCounter%16)==0))
  {
  	if(addrCounter>=256)
  	{
  		Stop();
  		Delay_ms(1);
  		Start();
  		if(WriteOneByte(CTRL_BYTE_EEPROM2)==0xEE)				//确认为第2页
			{
  			EEPROM_ERR=1;			
    		goto EndOfWrite;
			}
			if(WriteOneByte((unsigned char)(addrCounter-256))==0xEE)					//伪写指令,确认地址
			{
  			EEPROM_ERR=1;		
    		goto EndOfWrite;
			}
  	}
  	else
  	{
  		Stop();
  		Delay_ms(1);
  		Start();
  		if(WriteOneByte(CTRL_BYTE_EEPROM1)==0xEE)				//确认为第1页
			{
  			EEPROM_ERR=1;			
    		goto EndOfWrite;
			}
			if(WriteOneByte((unsigned char)addrCounter)==0xEE)					//伪写指令,确认地址
			{
  			EEPROM_ERR=1;		
    		goto EndOfWrite;
			}	
  	}
  }
	
	if(WriteOneByte(*RAM++)==0xEE)
  {
    EEPROM_ERR=1;
    goto EndOfWrite;
  }
	L--;
	if(L==0x00)
	{
    goto EndOfWrite;
	}
	else
	{
		goto WriteNextOneByte;
	}
EndOfWrite:
	WDTE=0XAC;
	Stop();
	Delay_ms(1);
	WP=1;
	VCA=0;
	return  EEPROM_ERR;
}



unsigned char Read_EEPROM(unsigned int Addr,unsigned char L,unsigned char *RAM) //读EEPROM
{
	unsigned char unc,temp;
	WDTE=0xAC;	
	VCA=1;		
	WP=1;					
	Stop();
	Delay_ms(1);
	EEPROM_ERR=0;
	if(L==0) goto EndOfRead;
	Start();	
	if(Addr<256) 
	{	
		temp=CTRL_BYTE_EEPROM1;
		unc=(unsigned char)Addr;
	}
	else
	{
		temp=CTRL_BYTE_EEPROM2;
		unc=(unsigned char)(Addr-256);
	}

	if(WriteOneByte(temp)==0xEE)					//器件及页地址
	{
  	EEPROM_ERR=1;			
    goto EndOfRead;
	}
	if(WriteOneByte(unc)==0xEE)						//写具体地址(伪写)
	{
  	EEPROM_ERR=1;		
    goto EndOfRead;
	}
	Start();
	if(WriteOneByte(temp+1)==0xEE)				//读命令
	{
  	EEPROM_ERR=1;	
    goto EndOfRead;
	}
	for(;L>0;L--)
	{
  		WDTE=0xAC;
    	*RAM++=ReadOneByte(L);
	}
EndOfRead:
	WDTE=0XAC;
	Stop();
	VCA=0;
	return  EEPROM_ERR;
}



void Start(void)
{
	unsigned char unc;
  	SCL0_DIR=0;                
	SDA0_DIR=0;		 
	SCL0=0;
	for(unc=1;unc>0;unc--);		
	SDA0=1;
	for(unc=1;unc>0;unc--);	
	SCL0=1;
	for(unc=1;unc>0;unc--);	
	SDA0=0;
	for(unc=1;unc>0;unc--);
	SCL0=0;
	for(unc=1;unc>0;unc--);
}

void Stop(void)
{
	unsigned char unc;
	SCL0_DIR=0;                 
	SDA0_DIR=0;				
	SCL0=0;
	for(unc=1;unc>0;unc--);		
	SDA0=0;
	for(unc=1;unc>0;unc--);		
	SCL0=1;
	for(unc=1;unc>0;unc--);		
	SDA0=1;
	for(unc=1;unc>0;unc--);		
	SCL0=0;
	for(unc=1;unc>0;unc--);	
}

unsigned char WriteOneByte(unsigned char BYTE)
{
	unsigned char unc,ctrl;
	unsigned char i;
	SCL0_DIR=0;                 
	SDA0_DIR=0;			
	ctrl=0x80;
	for(i=0;i<8;i++)
	{
		if((BYTE&ctrl)==ctrl)
	  	{
	  		SDA0=1;
    	}
    	else
    	{
    		SDA0=0;
   		}
    		SCL0=1;
		for(unc=1;unc>0;unc--);		
		SCL0=0;
		for(unc=1;unc>0;unc--);	
		ctrl>>=1;
	}
	SCL0_DIR=0;                 
	SDA0_DIR=1;			
	SCL0=1;			
	for(unc=1;unc>0;unc--);		 
	if(SDA0)				   
	{
		ctrl=0xEE;
	}
	else
	{
  	ctrl=0x00;
  }
	SCL0=0;					// ACK falling edge
	for(unc=1;unc>0;unc--);	
	SCL0_DIR=0;                   		
	SDA0_DIR=0;				
	return(ctrl);
}


unsigned char ReadOneByte(unsigned char ackctrl)
{
	unsigned char unc,data;
	unsigned char i;
	SCL0_DIR=0;              
	SDA0_DIR=1;		
	data=0;
	for(i=0;i<8;i++)
	{
		SCL0=1;
	  	for(unc=1;unc>0;unc--);		

		data<<=1;

	  	if(SDA0)
	  	{
	  		data|=0x01;
	  	}
	  	else
	  	{
	  		data|=0x00;
	  	}
		SCL0=0;
	  	for(unc=4;unc>0;unc--);	
	}
	SCL0_DIR=0;                 
	SDA0_DIR=0;				
	if(ackctrl!=0x01)
	{
		SDA0=0;
	  SCL0=1;
	  	for(unc=1;unc>0;unc--);		
		SCL0=0;
	  	for(unc=1;unc>0;unc--);		
	}
	return(data);
}

unsigned char ReadLastOneByte(void)
{
	unsigned char unc,data;
	unsigned char i;
	SCL0_DIR=0;           
	SDA0_DIR=1;			
	data=0;
	for(i=0;i<8;i++)
	{
		SCL0=1;
	  	for(unc=1;unc>0;unc--);		
		data<<=1;
	  	if(SDA0)
	  	{
	  		data|=0x01;
	  	}
	  	else
	  	{
	  		data|=0x00;
	  	}
		SCL0=0;
	  	for(unc=1;unc>0;unc--);			
	}
	SCL0_DIR=0;         
	SDA0_DIR=0;		
	SDA0=1;
	SCL0=1;
	for(unc=1;unc>0;unc--);		
	SCL0=0;
	for(unc=1;unc>0;unc--);		
	return(data);
}

⌨️ 快捷键说明

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