找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2903|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

單片機eeprom程序問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:57614 發(fā)表于 2019-2-19 10:15 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
//#include <REGX52.H>
#include <STC8.H>
#include "intrins.h"

sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit K1   = P3^2;                           //按鈕1
sbit K2   = P3^3;                           //按鈕2

sbit Y=P1^0;
sbit W=P1^1;
//unsigned  int t,addr;
unsigned  char V,dat,n,m,k;
unsigned char code LED[] = {0xFE,0xFD,0xFC};

//測試工作頻率為11.0592MHz

//sfr     IAP_DATA    =   0xC2;
//sfr     IAP_ADDRH   =   0xC3;
//sfr     IAP_ADDRL   =   0xC4;
//sfr     IAP_CMD     =   0xC5;
//sfr     IAP_TRIG    =   0xC6;
//sfr     IAP_CONTR   =   0xC7;

#define WT_30M          0x80
#define WT_24M          0x81
#define WT_20M          0x82
#define WT_12M          0x83
#define WT_6M           0x84
#define WT_3M           0x85
#define WT_2M           0x86
#define WT_1M           0x87

void IapIdle()
{
    IAP_CONTR = 0;                              //關(guān)閉IAP功能
    IAP_CMD = 0;                                //清除命令寄存器
    IAP_TRIG = 0;                               //清除觸發(fā)寄存器
    IAP_ADDRH = 0x80;                           //將地址設(shè)置到非IAP區(qū)域
    IAP_ADDRL = 0;
}

char IapRead(int addr)
{
    char dat;

    IAP_CONTR = WT_12M;                         //使能IAP
    IAP_CMD = 1;                                //設(shè)置IAP讀命令
    IAP_ADDRL = addr;                           //設(shè)置IAP低地址
    IAP_ADDRH = addr >> 8;                      //設(shè)置IAP高地址
    IAP_TRIG = 0x5a;                            //寫觸發(fā)命令(0x5a)
    IAP_TRIG = 0xa5;                            //寫觸發(fā)命令(0xa5)
    _nop_();
    dat = IAP_DATA;                             //讀IAP數(shù)據(jù)
    IapIdle();                                  //關(guān)閉IAP功能

    return dat;
}

void IapProgram(int addr, char dat)
{
    IAP_CONTR = WT_12M;                         //使能IAP
    IAP_CMD = 2;                                //設(shè)置IAP寫命令
    IAP_ADDRL = addr;                           //設(shè)置IAP低地址
    IAP_ADDRH = addr >> 8;                      //設(shè)置IAP高地址
    IAP_DATA = dat;                             //寫IAP數(shù)據(jù)
    IAP_TRIG = 0x5a;                            //寫觸發(fā)命令(0x5a)
    IAP_TRIG = 0xa5;                            //寫觸發(fā)命令(0xa5)
    _nop_();
    IapIdle();                                  //關(guān)閉IAP功能
}

void IapErase(int addr)
{
    IAP_CONTR = WT_12M;                         //使能IAP
    IAP_CMD = 3;                                //設(shè)置IAP擦除命令
    IAP_ADDRL = addr;                           //設(shè)置IAP低地址
    IAP_ADDRH = addr >> 8;                      //設(shè)置IAP高地址
    IAP_TRIG = 0x5a;                            //寫觸發(fā)命令(0x5a)
    IAP_TRIG = 0xa5;                            //寫觸發(fā)命令(0xa5)
    _nop_();                                    //
    IapIdle();                                  //關(guān)閉IAP功能
}

/*
void main(void)
{
   //uchar V;
   V = IapRead(0x0016);                          // 開機讀取EEPROM區(qū)2002h數(shù)據(jù),還原關(guān)電前LED的亮滅狀況
   if(V == 2)          {LED1=0;LED2=1;}
   else if(V == 6){LED1=0;LED2=0;}

   while(1)
     {
      if(!K1)
            {
              while(!K1);
              LED1=0;LED2=1;
             IapErase(0x0000);                  // 擦除第1個扇區(qū)(2000h~21FFh)
              IapProgram(0x0016,2);          // 對EEPROM區(qū)2002h寫入2
            }

          if(!K2)
            {
               while(!K2);
              LED1=0;LED2=0;
             IapErase(0x0000);                  // 擦除第1個扇區(qū)(2000h~21FFh)
              IapProgram(0x0016,6);                          // 對EEPROM區(qū)2002h寫入6
            }
     }
}


*/



void main()
{
  n=IapRead(0x0016);

   EA=1;
        EX0=1;
  IT0=1;
        
         while(1)
         {
                 if(n==3)
                  n=0;
               
                 P1=LED[n];
               
        IapErase(0x0000);                 
        IapProgram(0x0016,n);
                        
}
                 
}


void i0() interrupt 0
{
        n++;

        }

上面星號部分可以存,下面的存不了,求解

11.png (193.24 KB, 下載次數(shù): 28)

11.png
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:213173 發(fā)表于 2019-2-19 15:20 | 只看該作者
IapErase(0x0000);                 
IapProgram(0x0000,n);
習(xí)慣都是單字節(jié)按扇區(qū)的首地址寫,多字節(jié)按扇區(qū)的首地址順序?qū)。沒有試過單獨寫中間地址是否會出錯。
回復(fù)

使用道具 舉報

板凳
ID:57614 發(fā)表于 2019-2-20 10:46 | 只看該作者
wulin 發(fā)表于 2019-2-19 15:20
IapErase(0x0000);                 
IapProgram(0x0000,n);
習(xí)慣都是單字節(jié)按扇區(qū)的首地址寫,多字節(jié)按 ...

可以的,好了,中斷加標(biāo)志,沒想通
回復(fù)

使用道具 舉報

地板
ID:474677 發(fā)表于 2019-2-20 12:04 | 只看該作者
wulin 發(fā)表于 2019-2-19 15:20
IapErase(0x0000);                 
IapProgram(0x0000,n);
習(xí)慣都是單字節(jié)按扇區(qū)的首地址寫,多字節(jié)按 ...

你給中間地址STC單片機也會按扇區(qū)首地址寫EEPROM,手冊里面有講的
回復(fù)

使用道具 舉報

5#
ID:123289 發(fā)表于 2019-2-20 13:23 | 只看該作者
你讀到的N是什么呢?
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表