实现原理
在读取EEPROM中的数据之前,先对一个目标地址连续读取两个数据,这个目标地址我用id_add来表示,读取到的两个数与EEPROM_ID[]中存取的两个数据进行比较(这两个数据是随便写的,作为辨识ID),如果读取到的值与设定的ID不一样,则说明是首次上电,EEPROM中还没有我们需要读取的值。
在第一次写入时引入一个flag标志位,当标志位为0的时候给idd_add发送两个连续的数据,这个数据是EEPROM_ID[]中的,这样就 更新了eeprom中id_add的值,再让flag+1,使每次上电只更新一次。
使用方法
先是和之前蓝桥杯模版的eeprom代码一样,在iic中添加
void EEPROM_Write(unsigned char *EEPROM_String, unsigned char addr, unsigned char num)
{
IIC_Start();
IIC_SendByte(0xA0);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
while(num--)
{
IIC_SendByte(*EEPROM_String++);
IIC_WaitAck();
IIC_Delay(200);
}
IIC_Stop();
}
void EEPROM_Read (unsigned char *EEPROM_String, unsigned char addr, unsigned char num)
{
IIC_Start();
IIC_SendByte(0XA0);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
//-------------先用写的形式访问,再用读的形式访问
IIC_Start();
IIC_SendByte(0XA1);
IIC_WaitAck();
while(num--)
{
*EEPROM_String++ = IIC_RecByte();
if(num) IIC_SendAck(0);
else IIC_SendAck(1);
}
IIC_Stop();
}
在模版的基础上添加
unsigned char EEPROM_ID[]={0XA7,0XC};
unsigned char id_add=0xa0;、
//入口参数同EEPROM_Read()
void EEPROM_UseRead (unsigned char *EEPROM_String, unsigned char addr, unsigned char num)
{
unsigned char EEPROM_GetID[2];
EEPROM_Read(EEPROM_GetID,id_add,2);
if((EEPROM_GetID[0]==EEPROM_ID[0])&&(EEPROM_GetID[1]==EEPROM_ID[1])
{
EEPROM_Read(EEPROM_String,addr,num);
}
else
{
//EEPROM_String[0]=250;测试代码进入此处表示是首次上电读取,并未存入数据
}
}
//入口参数:在EEPROM_Write()的基础上再加上一个flag指针
void EEPROM_UseWrite(unsigned char *EEPROM_String, unsigned char addr, unsigned char num,unsigned char* flag)
{
if(*flag==0)
{
EEPROM_Write(EEPROM_ID,id_add,2);
*flag=1;
}
EEPROM_Write(EEPROM_String,addr,num);
}
在main.c中
//创建全局变量
unsigned char eeprom_string[4] = {11,12,13,14};
unsigned char eeprom_string_null[4];
unsigned char eeprom_flag=0;
在Key_Proc中
void Key_Proc()
{
if(Key_Slow_Down) return;
Key_Slow_Down=1;
Key_New=Key_Read();
Key_Down=Key_New&(Key_Old^Key_New);
Key_Old=Key_New;
switch(Key_Down)
{
case 11:Led_Mod^=0x01;Disp_Mod^=0x01;break;
case 10:eeprom_string[0]=(unsigned char)Pcf8591_Adc(Adj_Res_Channel);EEPROM_UseWrite(eeprom_string, 0, 4,&eeprom_flag);break;
//按键按下后写入数据
}
}
在Seg_Proc中
void Seg_Proc(void)
{
if(Seg_Slow_Down) return;
Seg_Slow_Down = 1;
if(Disp_Mod == 0)
{
sprintf(seg_string,"12345678");
sprintf(seg_string,"%03d",(unsigned int)Pcf8591_Adc(Adj_Res_Channel));
}
else
{
//--EEPROM测试
EEPROM_UseRead(eeprom_string_null, 0, 4);
sprintf(seg_string,"%2d--%2d",(unsigned int)eeprom_string_null[0],(unsigned int)eeprom_string_null[3]);
}
Seg_Tran(seg_string, seg_buf);
}