请大神帮忙指导下我这个程序为什么不能掉电保持数据
时间:10-02
整理:3721RD
点击:
#include <STC90C5xAD.H>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define RdCommand 0x01 //定义ISP的操作命令 读命令
#define PrgCommand 0x02 //对应用程序Flash区及数据Flash区字节编程
#define EraseCommand 0x03 //对应用程序Flash区及数据Flash区扇区擦除
#define Error 1
#define Ok 0
#define ENABLE_IAP 0x82 //定义CPU的等待时间
sfr IAP_DATA=0XE2; //Flash数据寄存器
sfr IAP_ADDRH=0XE3; //Flash高字节地址寄存器
sfr IAP_ADDRL=0XE4; //Flash低字节地址寄存器
sfr IAP_CMD=0XE5; //Flash命令模式寄存器
sfr IAP_TRIG=0XE6; //Flash命令触发寄存器
sfr IAP_CONTR=0XE7; //ISP/IAP控制寄存器
uchar num1;
uchar code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 共阴数码管 0-/**************关闭ISP,IAP功能*********************/
void IAP_disable(void)
{
IAP_CONTR=0;
IAP_CMD=0;
IAP_TRIG=0;
IAP_ADDRH=0X80;
IAP_ADDRL=0;
}
/**************字节读功能*********************/
unsigned char byte_read(unsigned int addr)
{
IAP_CONTR=ENABLE_IAP;
IAP_CMD= RdCommand;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0x46;
IAP_TRIG=0xb9;
_nop_();
IAP_disable();
return(IAP_DATA);
}
/**************扇区擦除功能*********************/
void SectorErase(unsigned int addr )
{
IAP_CONTR=ENABLE_IAP;
IAP_CMD=EraseCommand;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0x46;
IAP_TRIG=0xb9;
_nop_();
IAP_disable();
}
/**************字节写功能*********************/
void byte_write(unsigned int addr,unsigned char original_data)
{
IAP_CONTR=ENABLE_IAP;
IAP_CMD= PrgCommand;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_DATA=original_data;
IAP_TRIG=0x46;
IAP_TRIG=0xb9;
_nop_();
IAP_disable();
}
void display(uchar shi,uchar ge)
{
P0=Disp_Tab[shi];
P1=0XFd; //十位
P1=0XFF;
P0=Disp_Tab[ge];
P1=0XFe; //个位
P1=0XFF;
}
void main()
{
uchar num,a,b;
num=byte_read(0x2000);
if(num>=60) num=0;
TMOD=0X01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(num1>=20)
{
num1=0;
num++;
SectorErase(0x2000); //擦除扇区
byte_write(0x2000,num); //重新写入数据
if(num==60) num=0;
a=num/10;
b=num%10;
}
display(a,b);
}
}
void timer0() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num1++;
}
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define RdCommand 0x01 //定义ISP的操作命令 读命令
#define PrgCommand 0x02 //对应用程序Flash区及数据Flash区字节编程
#define EraseCommand 0x03 //对应用程序Flash区及数据Flash区扇区擦除
#define Error 1
#define Ok 0
#define ENABLE_IAP 0x82 //定义CPU的等待时间
sfr IAP_DATA=0XE2; //Flash数据寄存器
sfr IAP_ADDRH=0XE3; //Flash高字节地址寄存器
sfr IAP_ADDRL=0XE4; //Flash低字节地址寄存器
sfr IAP_CMD=0XE5; //Flash命令模式寄存器
sfr IAP_TRIG=0XE6; //Flash命令触发寄存器
sfr IAP_CONTR=0XE7; //ISP/IAP控制寄存器
uchar num1;
uchar code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 共阴数码管 0-/**************关闭ISP,IAP功能*********************/
void IAP_disable(void)
{
IAP_CONTR=0;
IAP_CMD=0;
IAP_TRIG=0;
IAP_ADDRH=0X80;
IAP_ADDRL=0;
}
/**************字节读功能*********************/
unsigned char byte_read(unsigned int addr)
{
IAP_CONTR=ENABLE_IAP;
IAP_CMD= RdCommand;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0x46;
IAP_TRIG=0xb9;
_nop_();
IAP_disable();
return(IAP_DATA);
}
/**************扇区擦除功能*********************/
void SectorErase(unsigned int addr )
{
IAP_CONTR=ENABLE_IAP;
IAP_CMD=EraseCommand;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0x46;
IAP_TRIG=0xb9;
_nop_();
IAP_disable();
}
/**************字节写功能*********************/
void byte_write(unsigned int addr,unsigned char original_data)
{
IAP_CONTR=ENABLE_IAP;
IAP_CMD= PrgCommand;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_DATA=original_data;
IAP_TRIG=0x46;
IAP_TRIG=0xb9;
_nop_();
IAP_disable();
}
void display(uchar shi,uchar ge)
{
P0=Disp_Tab[shi];
P1=0XFd; //十位
P1=0XFF;
P0=Disp_Tab[ge];
P1=0XFe; //个位
P1=0XFF;
}
void main()
{
uchar num,a,b;
num=byte_read(0x2000);
if(num>=60) num=0;
TMOD=0X01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(num1>=20)
{
num1=0;
num++;
SectorErase(0x2000); //擦除扇区
byte_write(0x2000,num); //重新写入数据
if(num==60) num=0;
a=num/10;
b=num%10;
}
display(a,b);
}
}
void timer0() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num1++;
}