<br />说明,主程序中先判断上次写操作是否完成,如果完成了则调用“更新eeprom内容”程序。<br />在“更新eeprom内容”程序中,每次只操作一个单元。先把要修改的单元读出来校验,如果读出数据与待写入数据一致,则切换到下一单元。如果连续N次不一致,代表该单元写失败,跳过。<br />在执行写操作时,中断已经关闭了。<br />相关程序如下:<br /> <br /> <br />//--------------------------------------------------------<br />//主函数<br />//--------------------------------------------------------<br />void main(void)<br />{<br /> init(); //====初始化<br /><br /> //====循环主体<br /> while (1)<br /> {<br /> //......略 <br /> if ( (EEPROM_NEW_FLAGS!=0) && (WR==0) && (NO_KEY_JSQ>2) ) new_eeprom() ; //如果EEPROM数据更新标志<>0,且上次的写操作结束,且无按键计数器>2,则更新eeprom内容<br /><br /> }<br />}<br /><br /><br /><br />//--------------------------------------------------------<br />//更新eeprom内容<br />//--------------------------------------------------------<br />void new_eeprom ( void )<br />{<br /> //====显示列计数器 角度校正值(0~179) (用于校正盘面角度)<br /> if ( DISP_LINE_ADJ_FLAG ) <br /> {<br /> //......略<br /> }<br /><br /> //......略<br /><br /><font color=#FF0000> //====自定义点阵图片<br /> else if ( PICTURE_FLAG )<br /> {<br /> if ( EEP_SAVE_ID <= 90 ) <br /> //保存自定义点阵图片上部<br /> {<br /> //读出校验<br /> EEADR = PICTURE1_ADR + EEP_SAVE_ID ; //地址<br /> read_eeprom() ; //EEPROM字节读程序<br /> <br /> if ( EEDATA == DISP_QUEUE1[EEP_SAVE_ID] ) //如果校验一致<br /> {<br /> EEPROM_ERR_JSQ = 0 ; //EPPROM写失败计数器=0<br /> EEP_SAVE_ID ++ ; //EEPROM存储指针+1 <br /> } <br /> else if ( ++EEPROM_ERR_JSQ > 3 ) //如果连续n次写入失败<br /> {<br /> EEPROM_ERR_JSQ = 0 ; //EPPROM写失败计数器=0<br /> EEPROM_ERR_FLAG = 1 ; //EPPROM写失败标志=1<br /> EEP_SAVE_ID ++ ; //EEPROM存储指针+1 <br /> }<br /> else //否则,更新数据<br /> { <br /> EEDATA = DISP_QUEUE1[EEP_SAVE_ID] ; //数据<br /> write_eeprom() ; //EEPROM字节写程序<br /> }<br /> }<br /> if ( EEP_SAVE_ID <= 180 ) <br /> //保存自定义点阵图片下部<br /> {<br /> //读出校验<br /> EEADR = PICTURE2_ADR + EEP_SAVE_ID - 90 ; //地址<br /> read_eeprom() ; //EEPROM字节读程序<br /> <br /> if ( EEDATA == DISP_QUEUE2[EEP_SAVE_ID - 90] ) //如果校验一致<br /> {<br /> EEPROM_ERR_JSQ = 0 ; //EPPROM写失败计数器=0<br /> EEP_SAVE_ID ++ ; //EEPROM存储指针+1 <br /> } <br /> else if ( ++EEPROM_ERR_JSQ > 3 ) //如果连续n次写入失败<br /> {<br /> EEPROM_ERR_JSQ = 0 ; //EPPROM写失败计数器=0<br /> EEPROM_ERR_FLAG = 1 ; //EPPROM写失败标志=1<br /> EEP_SAVE_ID ++ ; //EEPROM存储指针+1 <br /> }<br /> else //否则,更新数据<br /> { <br /> EEDATA = DISP_QUEUE2[EEP_SAVE_ID - 90] ; //数据<br /> write_eeprom() ; //EEPROM字节写程序<br /> }<br /> }<br /> else<br /> //保存自定义点阵图片有效标志(0X5A=有效,否则=无效)<br /> {<br /> //读出校验<br /> EEADR = PICTURE_EN_ADR ; //地址<br /> read_eeprom() ; //EEPROM字节读程序<br /> <br /> if ( EEDATA == 0X5A ) //如果校验一致<br /> {<br /> EEPROM_ERR_JSQ = 0 ; //EPPROM写失败计数器=0<br /> PICTURE_FLAG = 0 ; //自定义点阵图片更新标志=0 <br /> EEP_SAVE_ID = 0 ; //EEPROM存储指针=0 <br /> } <br /> else if ( ++EEPROM_ERR_JSQ > 3 ) //如果连续n次写入失败<br /> {<br /> EEPROM_ERR_JSQ = 0 ; //EPPROM写失败计数器=0<br /> EEPROM_ERR_FLAG = 1 ; //EPPROM写失败标志=1<br /> PICTURE_FLAG = 0 ; //自定义点阵图片更新标志=0 <br /> EEP_SAVE_ID = 0 ; //EEPROM存储指针=0 <br /> }<br /> else //否则,更新数据<br /> { <br /> EEDATA = 0X5A ; //数据<br /> write_eeprom() ; //EEPROM字节写程序<br /> } <br /> }<br /> } <br /></font><br /> //====异常处理<br /> else<br /> {<br /> EEPROM_NEW_FLAGS = 0 ; //EEPROM数据更新标志=0<br /> }<br />}<br /><br />//--------------------------------------------------------<br />//EEPROM字节写程序<br />//功能: 写一个字节到内部EEPROM<br />//入口: EEADR =地址<br />// EEDATA =数据<br />//--------------------------------------------------------<br />void write_eeprom ( void )<br />{<br /> EEPGD = 0 ; //设置访问目标为EEPROM<br /> WREN = 1 ; //允许进行写操作<br /><font color=#FF0000> GIE = 0 ; //禁止中断<br /> EECON2 = 0x55 ;<br /> EECON2 = 0xAA ;<br /> WR = 1 ; //启动一次写操作<br /> GIE = 1 ; //使能中断<br /></font> WREN = 0 ; //关闭写操作<br />}<br /><br />//--------------------------------------------------------<br />//EEPROM字节读程序<br />//功能: 从内部EEPROM读一个字节<br />//入口: EEADR =地址<br />//出口: EEDATA =数据<br />//--------------------------------------------------------<br />void read_eeprom( void )<br />{<br /> EEPGD = 0 ; //设置访问目标为EEPROM<br /> RD = 1 ; //启动一次读操作<br />}<br />
|