📄 eeprom.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 + -