相关连接: [匠人DIY旋转时钟 系列文章 (连载中…)]
//--------------------------------------------------------
// 项目:
// 模块:内部eeprom与FLASH操作
// 说明:
// 设计:程序匠人(版权所有,引用者请保留原作者姓名)
//--------------------------------------------------------
/*
版本说明:
eeprom.c 2008-2-10 15:36
*/
//--------------------------------------------------------
//--------------------------------------------------------
//插入文件包
//--------------------------------------------------------
#include "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
//
// 版权所有:程序匠人(引用者请保留原作者姓名)
//
//--------------------------------------------------------
文章评论(0条评论)
登录后参与讨论