|
相关连接: [匠人DIY旋转时钟 系列文章 (连载中…)]
//-------------------------------------------------------- // 项目: // 模块:内部eeprom与FLASH操作 // 说明: // 设计:程序匠人(版权所有,引用者请保留原作者姓名) //-------------------------------------------------------- /* 版本说明: eeprom.c 2008-2-10 15:36
*/ //--------------------------------------------------------
//-------------------------------------------------------- //插入文件包 //-------------------------------------------------------- #i nclude "common.h" //--------------------------------------------------------
//-------------------------------------------------------- //更新eeprom内容 //-------------------------------------------------------- void new_eeprom ( void ) { //====显示列计数器 角度校正值(0~179) (用于校正盘面角度) if ( DISP_LINE_ADJ_FLAG ) { //读出校验 EEADR = DISP_LINE_ADJ_ADR ; //地址 read_eeprom() ; //EEPROM字节读程序
if ( EEDATA == DISP_LINE_ADJ ) //如果校验一致 { EEPROM_ERR_JSQ = 0 ; //EPPROM写失败计数器=0 DISP_LINE_ADJ_FLAG = 0 ; //EEPROM数据更新标志=0 } else if ( ++EEPROM_ERR_JSQ > 3 ) //如果连续n次写入失败 { EEPROM_ERR_JSQ = 0 ; //EPPROM写失败计数器=0 EEPROM_ERR_FLAG = 1 ; //EPPROM写失败标志=1 DISP_LINE_ADJ_FLAG = 0 ; //EEPROM数据更新标志=0 } else //否则,更新数据 { EEDATA = DISP_LINE_ADJ ; //数据 write_eeprom() ; //EEPROM字节写程序 } } //====闹钟"时"(0~23) else if ( TIMER_H_FLAG ) { //读出校验 EEADR = TIMER_H_ADR ; //地址 read_eeprom() ; //EEPROM字节读程序
if ( EEDATA == TIMER_H ) //如果校验一致 { EEPROM_ERR_JSQ = 0 ; //EPPROM写失败计数器=0 TIMER_H_FLAG = 0 ; //EEPROM数据更新标志=0 } else if ( ++EEPROM_ERR_JSQ > 3 ) //如果连续n次写入失败 { EEPROM_ERR_JSQ = 0 ; //EPPROM写失败计数器=0 EEPROM_ERR_FLAG = 1 ; //EPPROM写失败标志=1 TIMER_H_FLAG = 0 ; //EEPROM数据更新标志=0 } else //否则,更新数据 { EEDATA = TIMER_H ; //数据 write_eeprom() ; //EEPROM字节写程序 } }
//====闹钟"分"(0~59) else if ( TIMER_M_FLAG ) { //读出校验 EEADR = TIMER_M_ADR ; //地址 read_eeprom() ; //EEPROM字节读程序
if ( EEDATA == TIMER_M ) //如果校验一致 { EEPROM_ERR_JSQ = 0 ; //EPPROM写失败计数器=0 TIMER_M_FLAG = 0 ; //EEPROM数据更新标志=0 } else if ( ++EEPROM_ERR_JSQ > 3 ) //如果连续n次写入失败 { EEPROM_ERR_JSQ = 0 ; //EPPROM写失败计数器=0 EEPROM_ERR_FLAG = 1 ; //EPPROM写失败标志=1 TIMER_M_FLAG = 0 ; //EEPROM数据更新标志=0 } else //否则,更新数据 { EEDATA = TIMER_M ; //数据 write_eeprom() ; //EEPROM字节写程序 } }
//====闹铃时间设置值(0~99分)(说明:0=关闭闹钟) else if ( SP_M_FLAG ) { //读出校验 EEADR = SP_M_ADR ; //地址 read_eeprom() ; //EEPROM字节读程序
if ( EEDATA == SP_M ) //如果校验一致 { EEPROM_ERR_JSQ = 0 ; //EPPROM写失败计数器=0 SP_M_FLAG = 0 ; //EEPROM数据更新标志=0 } else if ( ++EEPROM_ERR_JSQ > 3 ) //如果连续n次写入失败 { EEPROM_ERR_JSQ = 0 ; //EPPROM写失败计数器=0 EEPROM_ERR_FLAG = 1 ; //EPPROM写失败标志=1 SP_M_FLAG = 0 ; //EEPROM数据更新标志=0 } else //否则,更新数据 { EEDATA = SP_M ; //数据 write_eeprom() ; //EEPROM字节写程序 } }
//====EEPROM格式化标志(0XA5=已经格式化,否则=未格式化) else if ( EEPROM_EN_FLAG ) { //读出校验 EEADR = EEPROM_EN_ADR ; //地址 read_eeprom() ; //EEPROM字节读程序
if ( EEDATA == 0XA5 ) //如果校验一致 { EEPROM_ERR_JSQ = 0 ; //EPPROM写失败计数器=0 EEPROM_EN_FLAG = 0 ; //EEPROM数据更新标志=0 } else if ( ++EEPROM_ERR_JSQ > 3 ) //如果连续n次写入失败 { EEPROM_ERR_JSQ = 0 ; //EPPROM写失败计数器=0 EEPROM_ERR_FLAG = 1 ; //EPPROM写失败标志=1 EEPROM_EN_FLAG = 0 ; //EEPROM数据更新标志=0 } else //否则,更新数据 { EEDATA = 0XA5 ; //数据 write_eeprom() ; //EEPROM字节写程序 } }
//====异常处理 else { EEPROM_NEW_FLAGS = 0 ; //EEPROM数据更新标志=0 } }
//-------------------------------------------------------- //EEPROM字节写程序 //功能: 写一个字节到内部EEPROM //入口: EEADR =地址 // EEDATA =数据 //-------------------------------------------------------- void write_eeprom ( void ) { // while ( WR ) //等待上一次写操作结束 // { // asm ("clrwdt"); //喂狗 // } EEPGD = 0 ; //设置访问目标为EEPROM WREN = 1 ; //允许进行写操作 GIE = 0 ; //禁止中断 EECON2 = 0x55 ; EECON2 = 0xAA ; WR = 1 ; //启动一次写操作 GIE = 1 ; //使能中断 WREN = 0 ; //关闭写操作 }
//-------------------------------------------------------- //EEPROM字节读程序 //功能: 从内部EEPROM读一个字节 //入口: EEADR =地址 //出口: EEDATA =数据 //-------------------------------------------------------- void read_eeprom( void ) { EEPGD = 0 ; //设置访问目标为EEPROM RD = 1 ; //启动一次读操作 }
//-------------------------------------------------------- //FLASH字节写程序 //功能: 写一个字节到内部FLASH //入口: EEADRH,EEADR =地址 // EEDATH,EEDATA =数据 //-------------------------------------------------------- void write_flash ( void ) { EEPGD = 1 ; //设置访问目标为FLASH WREN = 1 ; //允许进行写操作 GIE = 0 ; //禁止中断 EECON2 = 0x55 ; EECON2 = 0xAA ; WR = 1 ; //启动一次写操作 asm ("nop") ; asm ("nop") ; GIE = 1 ; //使能中断 WREN = 0 ; //关闭写操作 }
//-------------------------------------------------------- //FLASH字节读程序 //功能: 从内部FLASH读一个字节 //入口: EEADRH,EEADR =地址 //出口: EEDATH,EEDATA =数据 //-------------------------------------------------------- void read_flash( void ) { EEPGD = 1 ; //设置访问目标为FLASH RD = 1 ; //启动一次读操作 asm ("nop") ; asm ("nop") ;
} //-------------------------------------------------------- // // THE END // // 版权所有:程序匠人(引用者请保留原作者姓名) // //--------------------------------------------------------
|