蓝桥杯单片机EEPROM检测是否是首次上电读取

实现原理

        在读取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);
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值