数码之家

 找回密码
 立即注册
搜索
查看: 3153|回复: 12

stc15w408as EEPROM求指教

[复制链接]
发表于 2020-7-31 09:37:09 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
最近偶尔用到408as 的EEPROM,找了一点历程是stc89c52的,完全可以用,
能保存多组433遥控码,也可以清除一保存的遥控码,现在打算移植到108as
上面来,无奈怎么做都不可以,就我知道的,我该改的都改了,还是不行,有没有哪位可以帮帮我

下面是stc89c52原eesprom程序

void EEPROM_write(uchar address, uchar value)//写EEPROM
{
xdata uchar da[255];
  uchar x;

  for(x=0;x<255;x++)
  da[x] = EEPROM_read(x);//读EEPROM

  da[address] = value;

  IapEraseSector(0X2000);

  for(x=0;x<255;x++)
  IapProgramByte(x+0x2000,da[x]);
}

uchar EEPROM_read(uchar address)//读EEPROM
{
  uchar da;
  da=IapReadByte(address+0x2000);
        return da;
}
//关闭IAP
void IapIdle()
{
    IAP_CONTR = 0;                  //Close IAP function
    IAP_CMD = 0;                    //Clear command to standby
    IAP_TRIG = 0;                   //Clear trigger register
    IAP_ADDRH = 0x80;               //Data ptr point to non-EEPROM area
    IAP_ADDRL = 0;                  //Clear IAP address to prevent misuse
}
读一字节,调用前需打开IAP 功能
BYTE IapReadByte(WORD addr)
{
    BYTE dat;                       //Data buffer
    IAP_CONTR = ENABLE_IAP;         //Open IAP function, and set wait time
    IAP_CMD = CMD_READ;             //Set ISP/IAP/EEPROM READ command
    IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
    IAP_ADDRH = addr >> 8;          //Set ISP/IAP/EEPROM address high
    IAP_TRIG = 0x46;                //Send trigger command1 (0x46)
    IAP_TRIG = 0xb9;                //Send trigger command2 (0xb9)
    _nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete
    dat = IAP_DATA;                 //Read ISP/IAP/EEPROM data
    IapIdle();                      //Close ISP/IAP/EEPROM function

    return dat;                     //Return Flash data
}
//字节编程
void IapProgramByte(WORD addr, BYTE dat)
{
    IAP_CONTR = ENABLE_IAP;         //Open IAP function, and set wait time
    IAP_CMD = CMD_PROGRAM;          //Set ISP/IAP/EEPROM PROGRAM command
    IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
    IAP_ADDRH = addr >> 8;          //Set ISP/IAP/EEPROM address high
    IAP_DATA = dat;                 //Write ISP/IAP/EEPROM data
    IAP_TRIG = 0x46;                //Send trigger command1 (0x46)
    IAP_TRIG = 0xb9;                //Send trigger command2 (0xb9)
    _nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete
    IapIdle();
}
//擦除扇区,
void IapEraseSector(WORD addr)
{
    IAP_CONTR = ENABLE_IAP;         //Open IAP function, and set wait time
    IAP_CMD = CMD_ERASE;            //Set ISP/IAP/EEPROM ERASE command
    IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
    IAP_ADDRH = addr >> 8;          //Set ISP/IAP/EEPROM address high
    IAP_TRIG = 0x46;                //Send trigger command1 (0x46)
    IAP_TRIG = 0xb9;                //Send trigger command2 (0xb9)
    _nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete
    IapIdle();
}



下面是写入数据代码

        if(rf_ok)
                {
                        GIE=0;
                        num_rf=EEPROM_read(0x00);       //取已学习的遥控器数量
                        if(num_rf>40){num_rf=0;}        //如果遥控器数量超过40个,覆盖最先学习的

                        EEPROM_write(0,num_rf+1);

            EEPROM_write(num_rf*3+1,mma1);
                        EEPROM_write(num_rf*3+2,mma2);
                        EEPROM_write(num_rf*3+3,mma3);     
                        LED=0;
                        delay_ms(200);//200
                        LED=1;
                        rf_ok=0;

                        GIE=1;
                       
                 }       


下面是我子去官网弄的408的EEPROM代码

/*----------------------------
关闭IAP
----------------------------*/
void IapIdle()
{
IAP_CONTR = 0; //关闭IAP功能
IAP_CMD = 0; //清除命令寄存器
IAP_TRIG = 0; //清除触发寄存器
IAP_ADDRH = 0x80; //将地址设置到非IAP区域
IAP_ADDRL = 0;
}
/*----------------------------
从ISP/IAP/EEPROM区域读取一字节
----------------------------*/
BYTE IapReadByte(WORD addr)
{
BYTE dat; //数据缓冲区
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_READ; //设置IAP命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
dat = IAP_DATA; //读ISP/IAP/EEPROM数据
IapIdle(); //关闭IAP功能
return dat; //返回

}

/*----------------------------
写一字节数据到ISP/IAP/EEPROM区域
----------------------------*/
void IapProgramByte(WORD addr, BYTE dat)
{
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_PROGRAM; //设置IAP命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_DATA = dat; //写ISP/IAP/EEPROM数据
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
IapIdle();
}
/*----------------------------
扇区擦除
----------------------------*/
void IapEraseSector(WORD addr)
{
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_ERASE; //设置IAP命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
IapIdle();
}
其实,我也就只知道改了0x5a和基本的头文件

哎,由于水平太烂了,搞不定,所以出来请教
发表于 2020-7-31 10:26:56 | 显示全部楼层
有108AS这个型号么
回复 支持 反对

使用道具 举报

发表于 2020-7-31 10:38:33 来自手机浏览器 | 显示全部楼层
eeprom起始地址,408不一样。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-31 11:31:40 | 显示全部楼层
szb314 发表于 2020-7-31 10:26
有108AS这个型号么

你是来争取评价的吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-31 11:34:11 | 显示全部楼层
jmkl128 发表于 2020-7-31 10:38
eeprom起始地址,408不一样。

那应该怎么改,麻烦指导一二
回复 支持 反对

使用道具 举报

发表于 2020-7-31 13:12:51 | 显示全部楼层
看官方手册,,,,官方下载工具的例子。。。。。。。。。
回复 支持 反对

使用道具 举报

发表于 2020-7-31 13:21:58 | 显示全部楼层
下载工具里面有例程
回复 支持 1 反对 0

使用道具 举报

发表于 2020-7-31 13:28:11 | 显示全部楼层
ploestar 发表于 2020-7-31 13:21
下载工具里面有例程

严重同意!
STC的下载工具就是个百宝箱,非常有用。
回复 支持 反对

使用道具 举报

发表于 2020-8-2 07:47:33 | 显示全部楼层
本帖最后由 2083759 于 2020-8-2 08:10 编辑

EEPROM首地址问题吧
你好像是从0x2000开始,408总的大小还没0x2000 捕获11.PNG
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-2 08:10:04 来自手机浏览器 | 显示全部楼层
2083759 发表于 2020-8-2 07:47
EEPROM首地址问题吧

你帮我看看应该怎么改才行
回复 支持 反对

使用道具 举报

发表于 2020-8-2 16:27:38 | 显示全部楼层
c20160525 发表于 2020-8-2 08:10
你帮我看看应该怎么改才行

把0x2000改成0x0000试试
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-2 16:35:29 | 显示全部楼层
2083759 发表于 2020-8-2 16:27
把0x2000改成0x0000试试

不行的,我试过
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-4 12:37:47 来自手机浏览器 | 显示全部楼层
2083759 发表于 2020-8-2 16:27
把0x2000改成0x0000试试

问题解决了,是自己太大意了,问题的原因出现的太奇葩了
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-5-17 01:32 , Processed in 0.140400 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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