最近看书上的一个STC89C52内部EEPROM使用,用keil编译,下载到开发板上可以运行,只是对其中几句话看不懂,请教一下高手:擦除时低八位地址为什么是0
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sfr ISP_DATA=0xe2;//
sfr ISP_ADDRH=0xe3;
sfr ISP_ADDRL=0xe4;
sfr ISP_CMD=0xe5;
sfr ISP_TRIG=0xe6;
sfr ISP_CONTR=0xe7;
sbit duan=P3^7;
sbit wei=P3^6;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar num,num1;
void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
/***********触发指令*******************/
void ISP_IAP_OPEN()
{
EA=0;
ISP_CONTR=ISP_CONTR&0x18;
ISP_CONTR=ISP_CONTR|0x01;//有疑问
ISP_CONTR=ISP_CONTR|0x80;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();
ISP_CONTR=ISP_CONTR&0x7f;
ISP_TRIG=0x00;
EA=1;
}
/****************擦除*******************************/
void delect(uint address)
{
uint add;
add=(address&0xfe00);
ISP_ADDRH=(uchar)(add>>8);
ISP_ADDRL=0x00;?????
ISP_CMD=(ISP_CMD&0xf8);
ISP_CMD=ISP_CMD|0x03;
ISP_IAP_OPEN();
}
/****************字节写************************/
void write_byte(uint address,uchar date)
{
ISP_ADDRH=(uchar)(address>>8);
ISP_ADDRL=(uchar)(address&0x00ff);
ISP_CMD=ISP_CMD&0xf8;
ISP_CMD=ISP_CMD|0x02;
ISP_DATA=date;
ISP_IAP_OPEN();
}
/*****************字节读*******************************/
uchar read_byte(uint address)
{
ISP_ADDRH=(uchar)(address>>8);
ISP_ADDRL=(uchar)(address&0x00ff);
ISP_CMD=ISP_CMD&0xf8;
ISP_CMD=ISP_CMD|0x01;
ISP_IAP_OPEN();
return (ISP_DATA);
}
void display(uchar ge,uchar shi)
{
wei=1;
P0=0x7f;
wei=0;
duan=1;
P0=table[ge];
duan=0;
P0=0xff;
delay(3);
wei=1;
P0=0xbf;
wei=0;
duan=1;
P0=table[shi];
duan=0;
P0=0xff;
delay(3);
}
void init()
{
TMOD |=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1;
TR0=1;
num1=read_byte(0x2000);
// if(num>=60)
// num=0;
}
void main()
{
init();
while(1)
{
display(num1%10,num1/10);
}
}
void time0() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num++;
if(num==20)
{
num=0;
num1++;
if(num1==60)
num1=0;
delect(0x2000);
write_byte(0x2000,num1);
}
} |