EEPROM的程序错在哪里?
#include <AT89X51.H>
#include <intrins.h>
//***********************<define.h>****************************************
#define uchar unsigned char
#define uint unsigned int
#define EEPROMSTARTADDR 0x2000 //STC89C52RD+为0x2000
//STC单片机特殊功能寄存器
sfr ISP_DATA = 0xE2;
sfr ISP_ADDRH = 0xE3;
sfr ISP_ADDRL = 0xE4;
sfr ISP_CMD = 0xE5;
sfr ISP_TRIG = 0xE6;
sfr ISP_CONTR = 0xE7;
#define ISP_IAP_BYTE_READ 1 //读字节
#define ISP_IAP_BYTE_PROGRAM 2 //写字节编程
#define ISP_IAP_SECTOR_ERASE 3 //扇区擦去
#define WAIT_TIME 1 //设置等待时间40M以下 0 ,20M以下1,10M以下2,5M以下3
#define _nop() _nop_() /*定义空指令*/
void delay1S(void) //延时1 秒
{
uchar h,i,j,k;
for(h=5;h>0;h--)
for(i=4;i>0;i--)
for(j=116;j>0;j--)
for(k=214;k>0;k--);
}
//******************************************************************************
//函数名称:FlashEraseSingleSector
//函数的功能:擦除一个扇区
//输入变量:addr 扇区开始地址
//输出变量:没有返回变量
void FlashEraseSingleSector(uint addr)
{
uint tempaddr=addr;
ISP_ADDRL=0;
ISP_ADDRH=(unsigned char)(tempaddr>>8);
ISP_CONTR=WAIT_TIME;
ISP_CONTR=0x80; //允许编程改变FLASH 区
ISP_CMD=ISP_IAP_SECTOR_ERASE; //擦除
ISP_TRIG=0x46; //触发
ISP_TRIG=0xb9; //触发启动
_nop_();
ISP_CONTR &= 0x7f;
// 高位为0,禁止ISP/IAP编程改变FLash区,同时保持WAIT_TIME不变
}
//******************************************************************************
//函数名称:ReadOneDataFromFlash
//函数的功能: 读取一个扇区数据
//输入变量:rdaddr 扇区开始地址
//输出变量:没有返回变量
uchar ReadOneDataFromFlash(uint rdaddr)
{
uchar readda;
uint temlongaddr=rdaddr;
ISP_ADDRL=(uchar) temlongaddr;
temlongaddr=rdaddr;
ISP_ADDRH=(uchar) (temlongaddr>>0);
ISP_CONTR=WAIT_TIME;
ISP_CONTR=0x80;
ISP_CMD=ISP_IAP_BYTE_READ; //读取数据
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop();
ISP_CONTR &= 0x7f;
readda=ISP_DATA;
return readda;
}
//******************************************************************************
//函数名称:WriteOneDataToFlash
//函数的功能:写入 一个数据
//输入变量:wdaddr 写入数据开始地址;wrdata写入的数据
//输出变量:没有返回变量
void WriteOneDataToFlash(uint wdaddr, uchar wrdata)
{
uint tempaddr,tempdata;
tempaddr=wdaddr;
ISP_DATA=wrdata;
ISP_ADDRL=(uchar) tempaddr;
tempaddr=wdaddr;
ISP_ADDRH=(uchar) (tempaddr>>8);
ISP_CONTR=WAIT_TIME;
ISP_CONTR=0x80;
ISP_CMD=ISP_IAP_BYTE_PROGRAM;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop();
ISP_CONTR&=0x7f;
}
//*******************************************************************************
void main()
{
uchar flag;
flag=ReadOneDataFromFlash(0x2000);
while(1)
{
if(P3==0xf7) //独立键盘按下
flag=0xf0;
WriteOneDataToFlash(0X2000,flag);//写EEPROM
P0=ReadOneDataFromFlash(0x2000);
delay1S();
}
}
__________________________________________________
P0接的是8个发光二极管,上电flag=ReadOneDataFromFlash(0x2050)=0xff;没按下按键,P0显示0XFF;
按下按键后,flag=0xf0;2000中的数值保存为0XF0;P0=0XF0;(上面都可以实现,问题在下面)
断电复位后,经flag=ReadOneDataFromFlash(0x2000)后,flag=@2000=0xf0;P0=0XF0才对,但是为什么我断电复位后,P0还是等于0XFF??肯请高人帮回答一下。谢谢