单片机STC89C52中内部EEPROM的问题
我想在EEPROM中储存数据,代码如下,但我调试了好多次就是不储存,也不能读取,求高人指点一二啊。sfrISP_DATA=0xe2;sfrISP_ADDRH=0xe3;s...
我想在EEPROM中储存数据,代码如下,但我调试了好多次就是不储存,也不能读取,求高人指点一二啊。
sfr ISP_DATA = 0xe2;
sfr ISP_ADDRH = 0xe3;
sfr ISP_ADDRL = 0xe4;
sfr ISP_CMD = 0xe5;
sfr ISP_TRIG = 0xe6;
sfr ISP_CONTR = 0xe7;
uchar R_ISP(uint adr);//读EEPROM在adr地址里的字节数据
void O_ISP();//打开ISP
void C_ISP();//关闭ISP
void W_ISP(uint ,uchar);//写字节数据到地址为adr的EEPROM里
void D_ISP(uint adr);//擦除地址为adr里的数据
void T_ISP();//ISP触发函数
void main()
{
uint chress;
uchar a;
chress = 0x2000;
W_ISP(chress, 0x50);
a = R_ISP(chress);
a = R_ISP(chress);
_nop_;
}
void O_ISP()
{
EA = 0; //关中断
ISP_CONTR = ISP_CONTR & 0x18;
ISP_CONTR = ISP_CONTR | 0x03; //写入硬件延时
ISP_CONTR = ISP_CONTR | 0x80; // ISPEN=1
}
void C_ISP()
{
ISP_CONTR = ISP_CONTR & 0x7f; //ISPEN = 0
ISP_TRIG = 0x00;
EA = 1; //开中断
}
void T_ISP()
{
O_ISP(); //ISP功能
ISP_TRIG = 0x46; //触发ISP_IAP命令字节1
ISP_TRIG = 0xb9; //触发ISP_IAP命令字节2
_nop_();
}
uchar R_ISP(uint adr)
{
ISP_ADDRH = (uchar)(adr >> 8);//高8位地址赋值ADDRH
ISP_ADDRL = (uchar)(adr & 0x00ff);//低8位地址赋值ADDRL
ISP_CMD = ISP_CMD & 0xf8;//待机模式
ISP_CMD = ISP_CMD | 0x01;
T_ISP(); //触发ISP
C_ISP();//关闭ISP
return (ISP_DATA);
}
void W_ISP(uint adr,uchar da)
{
ISP_ADDRH = (uchar)(adr >> 8); //取地址
ISP_ADDRL = (uchar)(adr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8; //清低3位
ISP_CMD = ISP_CMD | 0x02; //设置写命令
ISP_DATA = da; //写入数据准备工作
T_ISP(); // 触发ISP
C_ISP(); // 关闭IAP功?
}
void D_ISP(uint adr)
{
uint vadr;
vadr = (adr & 0xfe00);//取扇区首地址
ISP_ADDRH = (uchar)(vadr >> 8); //取地址
ISP_ADDRL = 0x00;
ISP_CMD = ISP_CMD & 0xf8; //清低3位
ISP_CMD = ISP_CMD | 0x03; //设置擦除命令
T_ISP(); // 触发ISP
C_ISP(); // 关闭IAP功能
}
基本的子函数我都觉得没问题,会不会是延时的问题呢? 展开
sfr ISP_DATA = 0xe2;
sfr ISP_ADDRH = 0xe3;
sfr ISP_ADDRL = 0xe4;
sfr ISP_CMD = 0xe5;
sfr ISP_TRIG = 0xe6;
sfr ISP_CONTR = 0xe7;
uchar R_ISP(uint adr);//读EEPROM在adr地址里的字节数据
void O_ISP();//打开ISP
void C_ISP();//关闭ISP
void W_ISP(uint ,uchar);//写字节数据到地址为adr的EEPROM里
void D_ISP(uint adr);//擦除地址为adr里的数据
void T_ISP();//ISP触发函数
void main()
{
uint chress;
uchar a;
chress = 0x2000;
W_ISP(chress, 0x50);
a = R_ISP(chress);
a = R_ISP(chress);
_nop_;
}
void O_ISP()
{
EA = 0; //关中断
ISP_CONTR = ISP_CONTR & 0x18;
ISP_CONTR = ISP_CONTR | 0x03; //写入硬件延时
ISP_CONTR = ISP_CONTR | 0x80; // ISPEN=1
}
void C_ISP()
{
ISP_CONTR = ISP_CONTR & 0x7f; //ISPEN = 0
ISP_TRIG = 0x00;
EA = 1; //开中断
}
void T_ISP()
{
O_ISP(); //ISP功能
ISP_TRIG = 0x46; //触发ISP_IAP命令字节1
ISP_TRIG = 0xb9; //触发ISP_IAP命令字节2
_nop_();
}
uchar R_ISP(uint adr)
{
ISP_ADDRH = (uchar)(adr >> 8);//高8位地址赋值ADDRH
ISP_ADDRL = (uchar)(adr & 0x00ff);//低8位地址赋值ADDRL
ISP_CMD = ISP_CMD & 0xf8;//待机模式
ISP_CMD = ISP_CMD | 0x01;
T_ISP(); //触发ISP
C_ISP();//关闭ISP
return (ISP_DATA);
}
void W_ISP(uint adr,uchar da)
{
ISP_ADDRH = (uchar)(adr >> 8); //取地址
ISP_ADDRL = (uchar)(adr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8; //清低3位
ISP_CMD = ISP_CMD | 0x02; //设置写命令
ISP_DATA = da; //写入数据准备工作
T_ISP(); // 触发ISP
C_ISP(); // 关闭IAP功?
}
void D_ISP(uint adr)
{
uint vadr;
vadr = (adr & 0xfe00);//取扇区首地址
ISP_ADDRH = (uchar)(vadr >> 8); //取地址
ISP_ADDRL = 0x00;
ISP_CMD = ISP_CMD & 0xf8; //清低3位
ISP_CMD = ISP_CMD | 0x03; //设置擦除命令
T_ISP(); // 触发ISP
C_ISP(); // 关闭IAP功能
}
基本的子函数我都觉得没问题,会不会是延时的问题呢? 展开
展开全部
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询