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