找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2919|回复: 4
打印 上一主题 下一主题
收起左侧

单片机eeprom程序问题

[复制链接]
跳转到指定楼层
楼主
//#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;                              //关闭IAP功能
    IAP_CMD = 0;                                //清除命令寄存器
    IAP_TRIG = 0;                               //清除触发寄存器
    IAP_ADDRH = 0x80;                           //将地址设置到非IAP区域
    IAP_ADDRL = 0;
}

char IapRead(int addr)
{
    char dat;

    IAP_CONTR = WT_12M;                         //使能IAP
    IAP_CMD = 1;                                //设置IAP读命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();
    dat = IAP_DATA;                             //读IAP数据
    IapIdle();                                  //关闭IAP功能

    return dat;
}

void IapProgram(int addr, char dat)
{
    IAP_CONTR = WT_12M;                         //使能IAP
    IAP_CMD = 2;                                //设置IAP写命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_DATA = dat;                             //写IAP数据
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();
    IapIdle();                                  //关闭IAP功能
}

void IapErase(int addr)
{
    IAP_CONTR = WT_12M;                         //使能IAP
    IAP_CMD = 3;                                //设置IAP擦除命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();                                    //
    IapIdle();                                  //关闭IAP功能
}

/*
void main(void)
{
   //uchar V;
   V = IapRead(0x0016);                          // 开机读取EEPROM区2002h数据,还原关电前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个扇区(2000h~21FFh)
              IapProgram(0x0016,2);          // 对EEPROM区2002h写入2
            }

          if(!K2)
            {
               while(!K2);
              LED1=0;LED2=0;
             IapErase(0x0000);                  // 擦除第1个扇区(2000h~21FFh)
              IapProgram(0x0016,6);                          // 对EEPROM区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, 下载次数: 28)

11.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2019-2-19 15:20 | 只看该作者
IapErase(0x0000);                 
IapProgram(0x0000,n);
习惯都是单字节按扇区的首地址写,多字节按扇区的首地址顺序写。没有试过单独写中间地址是否会出错。
回复

使用道具 举报

板凳
ID:57614 发表于 2019-2-20 10:46 | 只看该作者
wulin 发表于 2019-2-19 15:20
IapErase(0x0000);                 
IapProgram(0x0000,n);
习惯都是单字节按扇区的首地址写,多字节按 ...

可以的,好了,中断加标志,没想通
回复

使用道具 举报

地板
ID:474677 发表于 2019-2-20 12:04 | 只看该作者
wulin 发表于 2019-2-19 15:20
IapErase(0x0000);                 
IapProgram(0x0000,n);
习惯都是单字节按扇区的首地址写,多字节按 ...

你给中间地址STC单片机也会按扇区首地址写EEPROM,手册里面有讲的
回复

使用道具 举报

5#
ID:123289 发表于 2019-2-20 13:23 | 只看该作者
你读到的N是什么呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表