字节读中:
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; //取扇区地址
怎么理解???
哪位大神 帮帮忙吧,小弟感激不尽哦!!!
单片机内部E2PROM ISP-IAP 技术应用 中 郭天祥 ISP程序中ISP_ADDRL=(unsigned char)(byte_addr&0 怎么理解
答案:3 悬赏:60 手机版
解决时间 2021-03-05 10:25
- 提问者网友:心牵心
- 2021-03-04 13:00
最佳答案
- 五星知识达人网友:野慌
- 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 就知道了。
希望能帮到你。
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();
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯