永发信息网

单片机内部E2PROM ISP-IAP 技术应用 中 郭天祥 ISP程序中ISP_ADDRL=(unsigned char)(byte_addr&0 怎么理解

答案:3  悬赏:60  手机版
解决时间 2021-03-05 10:25
  • 提问者网友:心牵心
  • 2021-03-04 13:00
字节读中:
ISP_ADDRH=(unsigned char)(byte_addr&>>8);

ISP_ADDRL=(unsigned char)(byte_addr&0x00ff);

这两句哪位详细解释一下啊 小弟实在不懂为什么??? 里面>>8 是固定的将地址弄到高八位吗?下面 为什么要与上“&0x00ff"???

扇区擦除中 取扇区地址:
void SectorErase(unsigned int sector_addr)
{
unsigned int iSectorAddr;
iSectorAddr=sector_addr&0xfe00; //取扇区地址
ISP_ADDRH=(unsigned char)(iSectorAddr>>8);
ISP_ADDRL=0x00;
ISP_CMD=ISP_CMD&0xf8;
ISP_CMD=ISP_CMD|EraseCommand;
ISPgoon();
ISP_IAP_disable();
}
里面: iSectorAddr=sector_addr&0xfe00; //取扇区地址
怎么理解???
哪位大神 帮帮忙吧,小弟感激不尽哦!!!
最佳答案
  • 五星知识达人网友:野慌
  • 2021-03-04 13:52
ISP_ADDRH=(unsigned char)(byte_addr&>>8);
ISP_ADDRL=(unsigned char)(byte_addr&0x00ff);
其中 byte_addr是一个16位地址,他的数据类型是 unsigned int;
ISP_ADDRH和 ISP_ADDRL 是8位的,他们的数据类型是 unsigned char;

byte_addr&>>8: 将 16位的byte_addr的高8位取出放在一个8位的ISP_ADDRH变量中
左移8 位就是高8位变为0x00, 低8 位变成原来的高8位。

byte_addr&0x00ff: 将 16位的byte_addr的低8位取出放在一个8位的ISP_ADDRL变量中

与0x00ff相与表示舍弃高8位,只要低8位。

iSectorAddr=sector_addr&0xfe00; //取扇区地址

这条语句中的0xfe00 应该与你所用单片机的扇区地址定义有关,你查下Datasheet 就知道了。

希望能帮到你。
全部回答
  • 1楼网友:平生事
  • 2021-03-04 16:21
没看明白
  • 2楼网友:执傲
  • 2021-03-04 14:57
简单的stc的eeprom的子程序 我发一个我用的给你 #include "EEPROM.h" #define offset 0x00 //定义存储地址偏移量 void Dis_ISP(void) { ISP_CONTR=0x00; ISP_CMD =0x00; ISP_TRIG =0x00; ISP_ADDRH=0x00; ISP_ADDRL=0x00; } unsigned char ISP_read(unsigned int addr) { ISP_ADDRH=offset+addr/256; ISP_ADDRL=addr%256; // EA=0; ISP_CONTR=0x80; //设置等待时间;40M以下0,20M以下1,10M以下2,5M以下3 ISP_CMD=0x01; //read cmd ISP_TRIG=0x5a; ISP_TRIG=0xa5; _nop_(); if ((ISP_CONTR&0x10)==0x10){ISP_CONTR&=0xef;} // EA=1; Dis_ISP(); return ISP_DATA; } void ISP_write(unsigned int addr,unsigned char Content) { ISP_DATA=Content; ISP_ADDRH=offset+addr/256; ISP_ADDRL=addr%256; // EA=0; ISP_CONTR=0x80; //设置等待时间 ISP_CMD=0x02; //write cmd ISP_TRIG=0x5a; ISP_TRIG=0xa5; _nop_(); if ((ISP_CONTR&0x10)==0x10){ISP_CONTR&=0xef;} // EA=1; Dis_ISP(); } void ISP_erase(unsigned char sectorIndex) { ISP_ADDRH=offset+sectorIndex*2; ISP_ADDRL=0x00; // EA=0; ISP_CONTR=0x80; //设置等待时间 ISP_CMD=0x03; //erase cmd ISP_TRIG=0x5a; ISP_TRIG=0xa5; _nop_(); if ((ISP_CONTR&0x10)==0x10){ISP_CONTR&=0xef;} // EA=1; Dis_ISP(); }
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯