你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于STC89c52单片机eeprom的双字节读写问题

[复制链接]
梅子-395796 提问时间:2013-11-13 14:08 /
读写双字节时,是先写入8位,读出,然后改地址,再写入8位,读出,还是写入两个8单字节后,再读出(即 写-读-写-读模式还是写-写-读-读)。我现在遇到的问题是:我用分别写入高低8位后,再分别读这两个地方的值的时候(写-写-读-读),读出来的值是我最后一次写入的值。。。a 和c 都是unsigned int 型a=totaltime();//假设这条语句执行以后a的值为0x0001;  ah=a/256;//0x00;  al=a%256;//0x01;  sector_erase();  byte_program(ah,0x28,0x00);//写入0x00;  byte_program(al,0x28,0x01);//写入0x01;  c=byte_read(0x28,0x00) ;//这里读出的值为什么会是0x0001  c=c*256+byte_read(0x28,0x01);//这里读出的最后的值变成0x0101;c读出以后的值是0x0101;这是为什么。。。假设a执行后第一条后的值是0xabcd;到最后c的值尽然是0xcdcd;为什么呢???感觉我的地址参数写的没用啊。。。
收藏 评论1 发布时间:2013-11-13 14:08

举报

1个回答
愚民点子 回答时间:2013-11-17 18:51:40

RE:关于STC89c52单片机eeprom的双字节读写问题

给你一个双字节读写程序
union double_byte
{
        uint long_data;
        uchar single[2];
}segment;
uchar Byte_Read(uint addr);                //读一字节,调用前需打开ISP 功能
void Byte_Program(uint addr ,uchar Write_data);        //字节编程,调用前需打开ISP 功能
void Sector_Erase(uint add);                        //擦除扇区
void Isp_disable(void)
{        ISP_CONTR = 0;                //禁止ISP/IAP 操作
        ISP_CMD = 0;                //去除ISP/IAP 命令
        ISP_TRIG = 0;                //防止 ISP/IAP 命令误触发
        ISP_ADDRH = 0xff;        //地址指向非EEPROM地址区,防止误操作
        ISP_ADDRL = 0xff;        //地址指向非EEPROM地址区,防止误操作
}
//读一字节,调用前需打开ISP 功能,入口PTR = 字节地址,返回:A = 读出字节
uchar Byte_Read(uint addr)
{
        uchar Read_ISP_DATA;
        ISP_ADDRL = addr;            //地址低位
        ISP_ADDRH = addr>>8;    //送地址高位
        EA = 0;                /* 关中断 */
        ISP_CONTR = 0x81;      /*20M,是0x80 orl 1 */
        ISP_CMD = 1;           // 1表示字节读
        ISP_TRIG = 0x46;       //先送0x46再送 0xb9 ISP/IAP 触发寄存器,每次都需要如此
        ISP_TRIG = 0xb9;       //送完0xb9后 ISP/IAP 立即被触发启动
        _nop_();               //空指令
        _nop_();               //空指令
        Isp_disable();        
        EA = 1;                            /* 开中断 */
        Read_ISP_DATA=ISP_DATA;
        return(Read_ISP_DATA);
}
uint double_byte_Read(uint addr)
{        uchar byte_h, byte_l;
        byte_h=Byte_Read(addr);
        byte_l=Byte_Read(addr+1);
        segment.single[0]=byte_h;
        segment.single[1]=byte_l;
        return(segment.long_data);
}
//字节编程,调用前需打开IAP 功能,入口PTR = 字节地址, A= 须编程字节的数据
void Byte_Program(uint addr ,uchar Write_data)
{        ISP_DATA = Write_data;
        ISP_ADDRL = addr;            //地址低位
        ISP_ADDRH = addr>>8;    //送地址高位
        EA =  0;                     /* 关中断 */
        ISP_CONTR = 0x81;      
        ISP_CMD = 2;                //送扇区命令
        ISP_TRIG = 0x46;
        ISP_TRIG = 0xb9;
        _nop_();
        _nop_();
        Isp_disable();        
        EA = 1;                    /* 开中断 */
}
void double_byte_write(uint addr ,uint Write_data)
{        uchar byte_h, byte_l;
        segment.long_data=Write_data;
        byte_h = segment.single[0];
        byte_l = segment.single[1];
        Byte_Program(addr,byte_h);
        Byte_Program(addr+1,byte_l);
}

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版