原创 匠人DIY旋转时钟全程实播(连载24:内部eeprom操作源程序)

2008-3-5 23:07 3471 7 7 分类: MCU/ 嵌入式

相关连接:jhinfo.gif [匠人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
//
// 版权所有:程序匠人(引用者请保留原作者姓名)
//
//--------------------------------------------------------


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条