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

📄 eeprom.c

📁 用TEA7567做的调频收音机,本人经测试通过的
💻 C
字号:
#include "global.h"
#include "eeprom.h"

//****************** 关闭 ISP,IAP 功能 **************
void ISP_IAP_Disable(void)
{
	ISP_CONTR = 0x00;
	ISP_CMD = 0X00;	
	ISP_TRIG = 0x00;
	EA = 1;               //开中断
}

//*******************字节读***************************

uchar	Byte_read(uint byte_addr)
{
	
	ISP_CONTR = En_Wait_TIME;					//开启ISP/IAP;并送等待时间                          
	ISP_CMD = Read_COM;             			//送字节读命令字	
	ISP_ADDRH = (uchar)(byte_addr >> 8);		//送地址高字节
	ISP_ADDRL = (uchar)(byte_addr & 0X00FF);	//送地址低字节
	EA = 0;										//关中断
	ISP_TRIG = 0X46;							//送触发命令字 0X46、0XB9
	ISP_TRIG = 0XB9;
	_nop_();
	ISP_IAP_Disable();                  //关闭ISP/IAP功能
	EA = 1;                						//开中断
	return ((unsigned char)ISP_DATA);
}



//********************字节编程***********************

void 	Byte_program(uint byte_addr, uchar isp_iap_data)
{
	
	ISP_CONTR = En_Wait_TIME;					//开启ISP/IAP;并送等待时间
	ISP_CMD = Prog_COM;             			//送字节编程命令字	
	ISP_ADDRH = (uchar)(byte_addr >> 8);		//送地址高字节
	ISP_ADDRL = (uchar)(byte_addr & 0X00FF);	//送地址低字节	
	ISP_DATA = isp_iap_data;					//送数据进ISP_DATA
	EA = 0;										//关中断
	ISP_TRIG = 0X46;							//送触发命令字 0X46、0XB9
	ISP_TRIG = 0XB9;
	_nop_();
	ISP_IAP_Disable();                 //关闭ISP/IAP功能
	EA = 1;                						//开中断	
}

//********************* 扇区擦除*********************
void	Sector_erase(uint sector_addr)
{
	
	ISP_CONTR = En_Wait_TIME;					//开启ISP/IAP;并送等待时间
//	ISP_CONTR=0xc1;
	ISP_CMD = Dele_COM;             			//送扇区擦除命令字	
	ISP_ADDRH = (uchar)(sector_addr >> 8);		//送地址高字节
	ISP_ADDRL = (uchar)(sector_addr & 0X00FF);	//送地址低字节
	EA = 0;										//关中断
	ISP_TRIG = 0X46;							//送触发命令字 0X46、0XB9
	ISP_TRIG = 0XB9;
	_nop_();
	ISP_IAP_Disable();                  //关闭ISP/IAP功能
	EA = 1;
}

//EEPROM写数据程序
	void Eeprom_WriteData(void)
	{
		if(Save_Can==1)//如果关键数据有改变了,保存关键数据
		{  
//    		if(Erase_Flag==0)
//			{
//				Erase_Flag=1;//使能擦除扇区功能计数时间
				Sector_erase(0X2000);		//扇区擦除,第一个扇区
//			}
//			else
//			{
//				if(Erase_Count>5)//大于20ms了,说明已经擦除成功了
//				{
//					Erase_Flag=0;//关闭擦除扇区功能计数
//					Erase_Count=0;
					WatchDog;			//喂狗	
					Byte_program(0X2000,Volume);//音量
					Byte_program(0X2001,Delay_s);//延时
					Byte_program(0X2002,District);//区位
					Byte_program(0X2003,Node);//结点
					Byte_program(0X2004,Frequency_BCD[0]);//频率百位
					Byte_program(0X2005,Frequency_BCD[1]);//频率十位
					Byte_program(0X2006,Frequency_BCD[2]);//频率个位
					Byte_program(0X2007,Frequency_BCD[3]);//频率十分位
					Byte_program(0X2008,Frequency_BCD[4]);//频率百分位
					Byte_program(0X2009,Band_Data);//波段
					Save_Can=0;//清关键数据改变标志
//				}
//			}

		 }
	}


	
	void Start_Process(void)//开机检测掉电前的重要数据
	{
	      unsigned char Code;
		  unsigned char Frequency_B,Frequency_S,Frequency_G,Frequency_SF,Frequency_BF;//频率的百十个,十分位的数据
		   Code=Byte_read(0x2e00);  //读第八扇区的首地址数据
		  if(Code==Eeprom_ReadCode)//如果相同,表示以前有写过数据了,就进行读操作
		  {
		  	Volume=Byte_read(0X2000);//音量
			Delay_s=Byte_read(0X2001);//延时
			District=Byte_read(0X2002);//区位
			Node=Byte_read(0X2003);//结点
			Frequency_B=Byte_read(0X2004);//频率百位
			Frequency_S=Byte_read(0X2005);//频率十位
			Frequency_G=Byte_read(0X2006);//频率个位
			Frequency_SF=Byte_read(0X2007);//频率十分位
			Frequency_BF=Byte_read(0X2008);//频率十分位
			Band_Data=Byte_read(0X2009);//波段
			WatchDog;//喂狗
			if(Frequency_B==0xff)//百位没显示数据时
		//		gdwPresetVCO=(unsigned long)Frequency_S*10000+(unsigned long)Frequency_G*1000+(unsigned long)Frequency_SF*100+(unsigned long)Frequency_BF*10;
				gdwPresetVCO=(unsigned long)Frequency_S*10000+(unsigned long)Frequency_G*1000+(unsigned long)Frequency_SF*100;
			else                //百位有显示数据时
		//		gdwPresetVCO=(unsigned long)Frequency_B*100000+(unsigned long)Frequency_S*10000+(unsigned long)Frequency_G*1000+(unsigned long)Frequency_SF*100+(unsigned long)Frequency_BF*10;
				gdwPresetVCO=(unsigned long)Frequency_B*100000+(unsigned long)Frequency_S*10000+(unsigned long)Frequency_G*1000+(unsigned long)Frequency_SF*100;
		    Frequency_Change(gdwPresetVCO);
			Volume_Change(Volume);
			Delays_change(Delay_s);
			Node_Change(Node);
			District_Change(District);
			WatchDog;//喂狗
			//VolSet(0);
			Tuner_Preset(False,True,High,gdwPresetVCO);

			switch(Band_Data)
			{
				case 0:
					{
						HighestFM=Max_FreqH;
						LowestFM=Min_FreqH;
					 }
					 break;
		
				case 1:
					{
						HighestFM=Max_FreqL;
						LowestFM=Min_FreqL;
					}
				default:break;
			}
          
		  }
		  else
		  {
		  	Sector_erase(0X2e00);		//扇区擦除,第八个扇区
			Byte_program(0X2e00,Eeprom_ReadCode);//写EEPROM,保存可读命令
			Delay_ms(60);
			Save_Can=1;//使能保存关键数据
			Sector_erase(0X2000);		//扇区擦除,第一个扇区
			Eeprom_WriteData();//写初值
			WatchDog;			//喂狗
			Tuner_Preset(False,True,High,gdwPresetVCO);
		//	Delay_ms(3000);
		//	VolSet(Volume+19);
		  }
		  TR0 = 1;                       //运行定时0
//		  EA = 1;//开总中断
		  Mode=0;////显示频率
		  Delay_ms(3000);
		  VolSet(Volume+19);
	 }

⌨️ 快捷键说明

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