打印

EEPROM读取

[复制链接]
436|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
llia|  楼主 | 2020-1-1 13:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PIC单片机4520写入EEPROM后通过按钮读取值是对的,但是断电后用按钮读取EEPROM值不正常,用MPLAB读取一次后发现值是对的,哪位遇到此问题,求助?

使用特权

评论回复
沙发
songqian17| | 2020-1-1 13:10 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
板凳
llia|  楼主 | 2020-1-1 13:13 | 只看该作者
uchar EEPROMread(uchar EEAddr)
{
         uchar d;
         EEADR = EEAddr;
         EEPGD = 0;
         GIE=0;
         RD = 1;
         while(RD==1);
         d = EEDATA;  //EEPROM的读数据
        RD=0;
         GIE=1;
         return d;
}

使用特权

评论回复
地板
houcs| | 2020-1-1 13:16 | 只看该作者

/***********************************
* 名称:     eeprom_init()        
* 功能:     EEPROM读写初始化
* 入口参数: 无
* 出口参数: 无
* 说明:                                            
************************************/
void  eeprom_init(void)
{
         EECON1=0x00;    //访问数据EEPROM存储器
}

使用特权

评论回复
5
chenho| | 2020-1-1 13:20 | 只看该作者

/********************************************
* 名称:     read_eeprom_onechar(uchar ee_add)        
* 功能:     读EEPROM函数
* 入口参数: ee_add---待读的地址
* 出口参数: TEMP-----返回结果
* 说明:                                            
********************************************/
uchar read_eeprom_onechar(uchar ee_add)
{
          uchar TEMP;        //定义临时变量
          EEADR=ee_add;      //指定读地址
          RD=1;              //读开始
          NOP();             //稍做延时
          TEMP=EEDATA;       //将数据读回
          return  TEMP;      //返回结果
}
更多操作

使用特权

评论回复
6
ousj| | 2020-1-1 13:23 | 只看该作者

/***********************************************************
* 名称:     write_eeprom_onechar(uchar ee_add,uchar ee_data)        
* 功能:     写数据到EEPROM
* 入口参数: ee_add----写入地址
* 出口参数: ee_data---写入数据
* 说明:                                            
***********************************************************/
void write_eeprom_onechar(uchar ee_add,uchar ee_data)
{
           GIE=0;          //关闭总中断,防止意外暂停
           EEIF=0;         //清零EEPRON写完成中断标志位
           EEADR=ee_add;   //指定EEPROM写入地址
           EEDATA=ee_data; //指定EEPROM写入数据
           WREN=1;         //关闭写保护,允许写
           EECON2=0x55;    //固定格式
           EECON2=0xAA;    //固定格式
           WR=1;           //开始写进程
           while(!EEIF);   //等待写完成
           EEIF=0;         //清零写完成中断标志位
           WREN=0;         //打开写保护,禁止写
           GIE=1;          //打开总中断
}

使用特权

评论回复
7
songqian17| | 2020-1-1 13:27 | 只看该作者
/***********************************
* 名称:     test_EEPROM()
* 功能:     判断是否为首次上电,如果不是,则读取
* 入口参数: 无
* 出口参数: 无
* 说明:                                            
************************************/
void  test_EEPROM(void)
{
      eeprom_init();                         //初始化EEPROM读写
      set1_time=read_eeprom_onechar(0x02);   //读出第1组工作时间
      set1_status=read_eeprom_onechar(0x03); //读出第1组工作时间的数码管显示状态

      set2_time=read_eeprom_onechar(0x04);   //读出第2组工作时间
      set2_status=read_eeprom_onechar(0x05); //读出第2组工作时间的数码管显示状态

      set3_time=read_eeprom_onechar(0x06);   //读出第3组工作时间
      set3_status=read_eeprom_onechar(0x07); //读出第3组工作时间的数码管显示状态
        
      if((set1_time>20)||(set1_status>=2)||(set2_time>20)||(set2_status>=2)||(set3_time>20)||(set3_status>=2))
      {
             set1_working_time=10;
             set1_time=10;
             set1_status=0;
                         f_set1_on=0;

             set2_working_time=15;
             set2_time=15;
             set2_status=0;
                         f_set2_on=0;
            
             set3_working_time=20;
             set3_time=20;
             set3_status=0;
                         f_set3_on=0;
      }               

      if(set1_status==0)     
      {
             set1_working_time=0;
                         f_set1_on=0;
          }
          else if(set1_status==1)
          {
                     set1_working_time = set1_time;
                         f_set1_on=1;
          }


      if(set2_status==0)     
      {
              set2_working_time=0;
                          f_set2_on=0;
          }
          else if(set2_status==1)
          {
                      set2_working_time = set2_time;
                          f_set2_on=1;
          }


      if(set3_status==0)     
      {
              set3_working_time=0;
                          f_set3_on=0;
          }
          else if(set3_status==1)
          {
                      set3_working_time = set3_time;
                          f_set3_on=1;
          }  
                        
}

使用特权

评论回复
8
chenho| | 2020-1-1 13:33 | 只看该作者
我一直着样的,没问题

使用特权

评论回复
9
chenho| | 2020-1-1 13:36 | 只看该作者
void  save_contexts(void)
{
          eeprom_init();   //初始化EEPROM读写
      write_eeprom_onechar(0x02,set1_time);
      write_eeprom_onechar(0x03,set1_status);

      write_eeprom_onechar(0x04,set2_time);
      write_eeprom_onechar(0x05,set2_status);

      write_eeprom_onechar(0x06,set3_time);
      write_eeprom_onechar(0x07,set3_status);
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

961

主题

8893

帖子

4

粉丝