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

📄 eeprom.c

📁 用51单片机实现IR解码
💻 C
字号:
/**********************************************************************
*File		Name		:	eeprom.c
*Creat		Time		:	2002/02/11
*Program	Author		:	mqli
*File		Discreption	:
*	 
************************************************************************/


#include "common.h"
#include "Var.h"
#include "main.h"
#include "eeprom.h"








BOOL IICWriteWaitAcknowlodge(void);

unsigned char IICrxbyte(void);

void IICstart(void);
void IICstop(void);
void IICReadAcknowledge(void);
void IICtxbyte(U8 DateByte);
void Comfirm_Var_Validity(U8 *var_address,U8 Max_Value,U8 Min_Value, U8 Normal_Value);



void IICstart(void)
{

#if 0
      EEPROM_CLK_1;
	EEPROM_DATA_1;
	Delay_xuS(1);
	EEPROM_DATA_0;
	Delay_xuS(1);
	
#else


    EEPROM_CLK_0;
	Delay_xuS(1);
	EEPROM_DATA_1;
	Delay_xuS(1);
	EEPROM_CLK_1;
	Delay_xuS(1);
	EEPROM_DATA_0;
	Delay_xuS(1);
	EEPROM_CLK_0;
	Delay_xuS(1);
#endif
	
}

void IICstop(void)
{
#if 0
       EEPROM_CLK_0;
	EEPROM_DATA_0;
        Delay_xuS(1);
	EEPROM_CLK_1;
	Delay_xuS(1);
	EEPROM_DATA_1;

#else
	Delay_xuS(1);
	EEPROM_CLK_0;
	Delay_xuS(1);
	EEPROM_DATA_0;
	Delay_xuS(1);
	EEPROM_CLK_1;
	Delay_xuS(1);
	EEPROM_DATA_1;
	Delay_xuS(1);
	#endif
}
void IICReadAcknowledge(void)
{
	EEPROM_CLK_0;
   	EEPROM_DATA_0;
	Delay_xuS(1);
	EEPROM_CLK_1;
	Delay_xuS(1);
	EEPROM_CLK_0;
   	EEPROM_DATA_1;
}

BOOL IICWriteWaitAcknowlodge(void)
{

	BOOL WriteSuccessFlag=FALSE;

	EEPROM_CLK_1;
	WriteSuccessFlag=(EEPROM_DATA)?FALSE:TRUE;
	EEPROM_CLK_0;
	if ( WriteSuccessFlag==FALSE )
	{
		Delay_xuS(1);
	}
	return WriteSuccessFlag;

}

void IICtxbyte(U8 DataByte)
{

   EX_DATA U8 BitMast;

	
       for(BitMast=0x80;BitMast>0;BitMast>>=1)
  
       
	   {
	
		 if (DataByte&BitMast)
			EEPROM_DATA_1;
		 else
			EEPROM_DATA_0;
		Delay_xuS(1);
		Delay_xuS(1);
		EEPROM_CLK_1;
		Delay_xuS(1);
		Delay_xuS(1);
		EEPROM_CLK_0;
	   }
		EEPROM_DATA_1;
//	IIC_SDA=1;				// data high, ask for acknowledge signal
//	IIC_SCL=1;				// clock high
//	btmask=IIC_SDA;			// btmask=0:ok,otherwise not ok.
//	IIC_SCL=0;				// clock low
//	return btmask;


}

unsigned char IICrxbyte(void)
{
EX_DATA	U8 ReceiveByte=0,i;
   EEPROM_DATA_1;	
   for(i=0;i<8;i++)
   {
	   EEPROM_CLK_1;
		ReceiveByte<<=1;
      ReceiveByte|=EEPROM_DATA;
	  EEPROM_CLK_0;
     Delay_xuS(1);
       
   }
	return ReceiveByte;
	

}
 
/* Read EEPROM content */
void ReadXEEprom(U8 * bufptr, U16 eepadr, U8 cnt)
{
DE_DATA	unsigned char errcnt;

	errcnt=0;
	while(1)
	{
		IICstart();						//  IIC start condition
		IICtxbyte(0xa0+((U8)(eepadr/128)&0x0e));	// transmit EEPROM IIC address  //the eeprom is below 512 bits
		if (IICWriteWaitAcknowlodge()==TRUE) break;
		errcnt++;
		if (errcnt>5)
		{
			IICstop();
			return;
		}
	}

	IICtxbyte((U8)eepadr);
	IICWriteWaitAcknowlodge();						// acknowledge

	IICstart();							//  IIC start condition
	IICtxbyte(0xa1+((U8)(eepadr/128)&0x0e));	// transmit EEPROM IIC address
	IICWriteWaitAcknowlodge();						// acknowledge

	while (1)
	{
		*bufptr=0;
		*bufptr=IICrxbyte();
		cnt--;
		if (cnt==0) break;
		IICReadAcknowledge();						// acknowledge
		bufptr++;
	}
	Delay_xuS(1);
	IICstop();
}

void WriteEEprom(U16 eeaddr, U8 dat)
{
DE_DATA	unsigned char errcnt;

	errcnt=0;
	while(1)
	{
		IICstart();						//  IIC start condition
		IICtxbyte(0xa0+((U8)(eeaddr/128)&0x0e));	// transmit EEPROM IIC address  //the eeprom is below 512 bits
		if (IICWriteWaitAcknowlodge()==TRUE) break;
		errcnt++;
		if (errcnt>5)
		{
			IICstop();
			return;
		}
	}

/*	IICtxbyte((U8)eepadr);
	IICstart();									//  IIC start condition
	IICtxbyte(0xa0+((U8)(eeaddr/128)&0x0e));		// transmit EEPROM IIC address
	IICWriteWaitAcknowlodge();*/					// acknowledge
	IICtxbyte((U8)eeaddr);						//write the address onchip
	IICWriteWaitAcknowlodge();					// acknowledge
	IICtxbyte(dat);								// transmit EEPROM data
	IICWriteWaitAcknowlodge();					// acknowledge
	IICstop();									//  IIC stop condition
	Delay_xmS(10);
}



/*******************************************************
  for fast write fuction
  care that some chip limit the total bytes of one write cycle
  1K,2K=8   4K,8K,16K=16
************************************************************/


void WriteXEEprom(U8 * bufptr, U16 eepadr, U8 cnt) 
{
DE_DATA	unsigned char errcnt,temp;

	errcnt=0;
	while(1)
	{
		IICstart();						//  IIC start condition
		IICtxbyte(0xa0+((U8)(eepadr/128)&0x0e));	// transmit EEPROM IIC address  //the eeprom is below 512 bits
		if (IICWriteWaitAcknowlodge()==TRUE) break;
		errcnt++;
		if (errcnt>5)
		{
			IICstop();
			return;
		}
	}
	IICtxbyte((U8)eepadr);						//write the address onchip
	IICWriteWaitAcknowlodge();					// acknowledge

	while(cnt)
	{
       temp=*bufptr;
	IICtxbyte(temp);								// transmit EEPROM data
	IICWriteWaitAcknowlodge();					// acknowledge
		bufptr++;
		cnt--;
	}	
	IICstop();									//  IIC stop condition
	Delay_xmS(10);
}






//save the preset var
void Write_Preset_Channel_Information(U8 channel,U16 frequence,U8 radio_band,BOOL is_stereo)
{
 WriteEEprom(EEPAddress_Preset_channal_Freq_Base+channel*2 ,(U8)(frequence) );
 WriteEEprom(EEPAddress_Preset_channal_Freq_Base+channel*2+1,(U8)(frequence>>8));
 WriteEEprom(EEPAddress_Preset_channal_Band_Base+channel,radio_band);
 WriteEEprom(EEPAddress_Preset_channal_Stereo_Base+channel,is_stereo);
 
}



void Check_EEProm_Var_Validity(void)
{



}


void Comfirm_Var_Validity(U8 *var_address,U8 Max_Value,U8 Min_Value, U8 Normal_Value) 
{
	if( (*var_address>Max_Value)||(*var_address<Min_Value) )
          *var_address=Normal_Value; 
}






⌨️ 快捷键说明

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