单片机内部E2PROM ISP-IAP 技术应用 中 郭天祥 ISP程序中ISP_ADDRL=(unsigned char)(byte_addr&0 怎么理解
发布网友
发布时间:2022-05-26 07:13
我来回答
共3个回答
热心网友
时间:2023-10-06 05:24
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 就知道了。
希望能帮到你。
热心网友
时间:2023-10-06 05:24
简单的stc的eeprom的子程序
我发一个我用的给你
#include "EEPROM.h"
#define offset 0x00 //定义存储地址偏移量
/*----------------------------------
-------要修改的参数:地址偏移量-----
-------触发命令-------------------*/
/*----------Disable ISP-----------*/
void Dis_ISP(void)
{
ISP_CONTR=0x00;
ISP_CMD =0x00;
ISP_TRIG =0x00;
ISP_ADDRH=0x00;
ISP_ADDRL=0x00;
}
/*----------Read E2PROM-----------*/
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;
}
/*---------WriteE2PROM-----------*/
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();
}
/*----------ISP_Erase------------*/
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();
}
热心网友
时间:2023-10-06 05:25
没看明白