近期制作了一个计数器,想增加eeprom来掉电存储。但是发现数码管数字增加一次就不再增加(从512跳到2),不知是何故,求指教
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
float c=2;
uchar duan[]={
0x3f, /*0*/
0x06, /*1*/
0x5b, /*2*/
0x4f, /*3*/
0x66, /*4*/
0x6d, /*5*/
0x7d, /*6*/
0x07, /*7*/
0x7f, /*8*/
0x6f, /*9*/
0x00 //ximie
};
sbit key=P3^2;//霍尔传感器
sbit nnn=P1^7;//小数点dp控制位
unsigned long jishu=4294967295;
double meterd;
unsigned long meter;<font color="#ff0000">//在此以上是原来的,无误</font>
/*eeprom<font color="#ff0000">(这些是复制的stc示例程序)</font>*/
/*Declare SFR associated with the IAP */
sfr IAP_DATA = 0xE2; //Flash data register
sfr IAP_ADDRH = 0xE3; //Flash address HIGH
sfr IAP_ADDRL = 0xE4; //Flash address LOW
sfr IAP_CMD = 0xE5; //Flash command register
sfr IAP_TRIG = 0xE6; //Flash command trigger
sfr IAP_CONTR = 0xE7; //Flash control register
/*Define ISP/IAP/EEPROM command*/
#define CMD_IDLE 0 //Stand-By
#define CMD_READ 1 //Byte-Read
#define CMD_PROGRAM 2 //Byte-Program
#define CMD_ERASE 3 //Sector-Erase
/*Define ISP/IAP/EEPROM operation const for IAP_CONTR*/
#define ENABLE_IAP 0x81 //if SYSCLK<20MHz
//Start address for STC89C58xx EEPROM
#define IAP_ADDRESS 0x2000<font color="#ff0000">//这里已经改成89c52的eeprom地址</font>
/*MCU初始设置<font color="#ff0000">(开中断)</font>*/
void init_MCU(void)
{
EX0=1;
IT0=1;
EA=1;
}
/*1ms delay*/
void delayms(uint xms)
{
uint timems;
for(;xms>0;xms--)
for(timems=115;timems>0;timems--);
}
/*显示*/
void display(uint dat)
{
uchar ge,shi,bai,qian;
ge=dat%1000%100%10;
shi=dat%1000%100/10;
bai=dat%1000/100;
qian=dat/1000;
P2=0XF7;//个位
P1=duan[ge];
delayms(3);
P2=0XFB;//十位
P1=duan[shi];
delayms(3);
P2=0XFD;//百位
P1=duan[bai];
delayms(3);
P2=0XFE;//千位
P1=duan[qian];
delayms(3);
}
/*eeprom(<font color="#ff0000">也是示例程序</font>)*/
/*----------------------------
Disable ISP/IAP/EEPROM function
Make MCU in a safe state
----------------------------*/
void IapIdle()
{
IAP_CONTR = 0; //Close IAP function
IAP_CMD = 0; //Clear command to standby
IAP_TRIG = 0; //Clear trigger register
IAP_ADDRH = 0x80; //Data ptr point to non-EEPROM area
IAP_ADDRL = 0; //Clear IAP address to prevent misuse
}
/*----------------------------
Read one byte from ISP/IAP/EEPROM area
Input: addr (ISP/IAP/EEPROM address)
Output:Flash data
----------------------------*/
uchar IapReadByte(uint addr)
{
uchar dat; //Data buffer
IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time
IAP_CMD = CMD_READ; //Set ISP/IAP/EEPROM READ command
IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low
IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high
IAP_TRIG = 0x46; //Send trigger command1 (0x46)
IAP_TRIG = 0xb9; //Send trigger command2 (0xb9)
_nop_(); //MCU will hold here until ISP/IAP/EEPROM operation complete
dat = IAP_DATA; //Read ISP/IAP/EEPROM data
IapIdle(); //Close ISP/IAP/EEPROM function
return dat; //Return Flash data
}
/*----------------------------
Program one byte to ISP/IAP/EEPROM area
Input: addr (ISP/IAP/EEPROM address)
dat (ISP/IAP/EEPROM data)
Output:-
----------------------------*/
void IapProgramByte(uint addr, uchar dat)
{
IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time
IAP_CMD = CMD_PROGRAM; //Set ISP/IAP/EEPROM PROGRAM command
IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low
IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high
IAP_DATA = dat; //Write ISP/IAP/EEPROM data
IAP_TRIG = 0x46; //Send trigger command1 (0x46)
IAP_TRIG = 0xb9; //Send trigger command2 (0xb9)
_nop_(); //MCU will hold here until ISP/IAP/EEPROM operation complete
IapIdle();
}
/*----------------------------
Erase one sector area
Input: addr (ISP/IAP/EEPROM address)
Output:-
----------------------------*/
void IapEraseSector(uint addr)
{
IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time
IAP_CMD = CMD_ERASE; //Set ISP/IAP/EEPROM ERASE command
IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low
IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high
IAP_TRIG = 0x46; //Send trigger command1 (0x46)
IAP_TRIG = 0xb9; //Send trigger command2 (0xb9)
_nop_(); //MCU will hold here until ISP/IAP/EEPROM operation complete
IapIdle();
}
/*主程序(和原来一样)*/
void main()
{
uint i;
init_MCU();
while(1)
{
meterd=jishu*c;
meter=meterd;
if (meter<10000)
{
P1=0X00;
P2=0XFE;
nnn=1;
delayms(3);
P2=0XFF;
display (meter);
}
else
{
P1=0X00;
P2=0XFD;
nnn=1;
delayms(3);
P2=0XFF;
display(meter/10);
}
}
}
void Int0() interrupt 0<font color="#ff0000">//这里面改了
{
delayms(50);
if(key==0)
{
jishu=IapReadByte(IAP_ADDRESS);
jishu++;
IapProgramByte(IAP_ADDRESS,jishu);
}
}
|