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

📄 eeprom.c

📁 MCU为:ATMGEA128
💻 C
字号:
//#####################---文件信息-----############################ 
//文   件   名   :   eeprom.c 
//创   建   人   :    
//建  立 时 间   :   2006-8-11 
//版  本 描 述   :    
//功  能 描 述   :   AVR EEPROM 读写程序 
//备      注	 :   调试环境为iccavr,MCU为Mega128 晶振为8mhz 
//最后修改时间   :   2006-8-11 
//################################################################## 
#include "include.h"
#ifndef __eeprom_c__
#define __eeprom_c__


//声明:

#define EEPROM_BASE0		0x00+2
#define EEPROM_BASE1		0x80+2
//注意:CONFIGDATA_MAX+EEPROM_BASE0<0x7f	
extern unsigned char eeprom_cmd[3];//={0,0,0};
	//说明:eeprom_cmd [0]:命令/计时
	//					0:空操作
	//							参数:无
	//					1:写操作
	//							参数:刷新次数
	//					2:读操作
	//							参数:也面读取页面值
	//								0:用户自定义
	//								1:默认值
	//		user_config[1]:参数
	//		user_config[2]:保留
	//以下数据写入EEPROM:
	//		user_config[0~~~~]:数据格式:

extern unsigned char user_config[CONFIGDATA_MAX];
const unsigned char default_config[CONFIGDATA_MAX]={0,1,2,3};


//函数声明:
unsigned char EEPROM_write(unsigned int uiAddress, unsigned char ucData);
unsigned char EEPROM_read(unsigned int uiAddress);
void 		eeprom_check(void);
void			savecfg(void);
void			loadcfg(void);

void	savecfg(void)
{
eeprom_cmd[0]=1;
eeprom_cmd[1]=2;
}
void	loadcfg(void)
{
eeprom_cmd[0]=2;
eeprom_cmd[1]=0;
eeprom_check();
t103_write(0x50, 0x69,user_config[BRIGHTNESS]);
t103_write(0x50, 0x6c, user_config[CHROMA]);
t103_write(0x50,0x68,user_config[CONSTRAST]);
refreshmenu();
}

//***************************************************************** 
//函   数   名   :   eeprom_check    
//建 立 时  间   :   2006-8-11 
//功 能 描  述   :   eeprom写函数,如果user_config[]与EEPROM内的值,
//					 EEPROM将自动根据user_config[]更新EEPROM
//备        注   :   没有返回值 
//最后修改时间   :   2006-8-11
//***************************************************************** 
void eeprom_check(void){
unsigned char temp;
static unsigned int ee_point=CONFIGDATA_MAX+1;
static unsigned char ee_page=1;
//command==0无操作
if(eeprom_cmd[0]==0){
	if(EEPROM_read(EEPROM_BASE0+CONFIGDATA_MAX)!=0xaa)
	{eeprom_cmd[0]=1;
	ee_point=CONFIGDATA_MAX+1;}
	if(EEPROM_read(EEPROM_BASE1+CONFIGDATA_MAX)!=0xaa)
	{eeprom_cmd[0]=1;
	ee_point=CONFIGDATA_MAX+1;}
	return; 
}
//command==1批量写数据,更新EEPROM内容
if(eeprom_cmd[0]==1){
	if(ee_point==CONFIGDATA_MAX+1){
		eeprom_cmd[1]++;
		if(eeprom_cmd[1]>5)
		{
		eeprom_cmd[0]=0;
		eeprom_cmd[1]=0;
		return;
		}
	}
	//eeprom_page0
	if(ee_page==0){
		if(ee_point==CONFIGDATA_MAX+1)
			{
			ee_point=0;
			EEPROM_write(EEPROM_BASE0+CONFIGDATA_MAX, 0x55);
			}
		if(ee_point==CONFIGDATA_MAX){
			if(EEPROM_write(EEPROM_BASE0+CONFIGDATA_MAX, 0xaa))
				{
				ee_point++;
				ee_page=1;
				}
		}
		else{
			if(EEPROM_write(EEPROM_BASE0+ee_point, user_config[ee_point]))
				ee_point++;
		}
	}
	//eeprom_page1
	if(ee_page==1){
		if(ee_point==CONFIGDATA_MAX+1)
			{
			ee_point=0;
			EEPROM_write(EEPROM_BASE1+CONFIGDATA_MAX, 0x55);
			}
		if(ee_point==CONFIGDATA_MAX){
			if(EEPROM_write(EEPROM_BASE1+CONFIGDATA_MAX, 0xaa))
				{
				ee_point++;
				ee_page=0;
				}
		}
		else{
			if(EEPROM_write(EEPROM_BASE1+ee_point, user_config[ee_point]))
			ee_point++;
		}
	}
}
//command==2批量读数据,更新user_config内容
if(eeprom_cmd[0]==2){
	if(eeprom_cmd[1]==0)
	{//EEPROM参数
		if(EEPROM_read(EEPROM_BASE0+CONFIGDATA_MAX)==0xaa){
			for(ee_point=0;ee_point<CONFIGDATA_MAX;ee_point++)
			user_config[ee_point]=EEPROM_read(EEPROM_BASE0+ee_point);
			}
		else{
		if(EEPROM_read(EEPROM_BASE1+CONFIGDATA_MAX)==0xaa){
			for(ee_point=EEPROM_BASE1+3;ee_point<EEPROM_BASE1+CONFIGDATA_MAX;ee_point++)
			user_config[ee_point]=EEPROM_read(ee_point);
			}
		else	{
			user_config[BRIGHTNESS]=DEFA_BRIGHTNESS;
			user_config[CHROMA]=DEFA_CHROMA;
			user_config[CONSTRAST]=DEFA_CONSTRAST;
			}
		}
		
	}

	if(0){//默认参数
	for(ee_point=0;ee_point<CONFIGDATA_MAX;ee_point++)
	user_config[ee_point]=default_config[ee_point];
	}	
	//
	eeprom_cmd[0]=0;
	eeprom_cmd[1]=0;
	ee_point=CONFIGDATA_MAX+1;															 
}
}
//***************************************************************** 
//函   数   名   :   EEPROM_write    
//建 立 时  间   :   2006-8-11 
//功 能 描  述   :   向EEPROM写入一字节
//备        注   :   没有返回值 
//最后修改时间   :   2006-8-11
//***************************************************************** 
unsigned char EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
if(EECR & (1<<EEWE))return 0;/* 等待上一次写操作结束 */
EEAR = uiAddress;/* 设置地址和数据寄存器 */
EEDR = ucData;
CLI();
EECR |= (1<<EEMWE);/* 置位EEMWE */
EECR |= (1<<EEWE);/* 置位EEWE 以启动写操作E */
SEI();
return 1;
}

//***************************************************************** 
//函   数   名   :   EEPROM_write    
//建 立 时  间   :   2006-8-11 
//功 能 描  述   :   向EEPROM读取一字节
//备        注   :   返回读取的字节 
//最后修改时间   :   2006-8-11
//***************************************************************** 
unsigned char EEPROM_read(unsigned int uiAddress)
{
while(EECR & (1<<EEWE)){
}/* 等待上一次写操作结束 */
EEAR = uiAddress;/* 设置地址寄存器 */
EECR |= (1<<EERE);/* 设置EERE 以启动读操作 */
NOP();
return EEDR;/* 自数据寄存器返回数据 */
}

#endif


⌨️ 快捷键说明

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