打印

STC89C52内部EEPROM使用问题!!!帮忙看看

[复制链接]
2421|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
448738516|  楼主 | 2012-8-14 21:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近看书上的一个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);
}
}

相关帖子

沙发
yzhj| | 2012-8-14 21:45 | 只看该作者
那个不是真正的EEPROM,你再看看资料。

使用特权

评论回复
板凳
amwrdfe| | 2012-8-14 23:52 | 只看该作者
stc的eeprom是flash,
如果没记错的话,扇区大小是512bytes
512bytes需要低8位吗?

使用特权

评论回复
地板
448738516|  楼主 | 2012-8-15 08:50 | 只看该作者
寄存器标识   地址                 名称                                                       初始值

ISP_DATA       0xE2      ISP/IAP闪存数据寄存器                           11111111

ISP_ADDRH    0xE3     ISP/IAP 闪存地址高位                               00000000

ISP_ADDRL    0xE4     ISP/IAP 闪存地址低位                               00000000

ISP_CMD        0xE5      ISP/IAP闪存命令寄存器               MS2MS1 MS0 xxxxx000

ISP_TRIG        0xE6      ISP/IAP 闪存命令触发                            xxxxxxxx

ISP_CONTR  0xE7       ISP/IAP 控制寄存器ISPEN   SWBS SWRST WT2 WT1 WT0 0 0 0

使用特权

评论回复
5
haohaozhu| | 2014-10-24 09:19 | 只看该作者
请问您这个程序是实现的什么功能啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

60

帖子

0

粉丝