|
我做好了一个数码显示的程序,数码管显示从1走到999.但是有的时候断电后就自动又从零开始走,我现在想让它断电把数据记下来我已经做好了一个断电检测电路我已经写了一点断电的程序,但是就是实现不了断电之前的数据记下来,每次还是断电后就从0开始记。我用的是STC11F02E单片机。它只有四个扇区。程序在下面,有谁知道我的错在那吗?请大家指点。谢谢!
#include "reg52.h"
#include "Flash\Flash.h"
#define uint unsigned int
#define uchar unsigned char
unsigned char m_Addge,m_Addshi,m_Addbai;//写入或者读出EEPROM的变量,只要把要写入的数据写入m_Add,然后调用 SaveToFlash()函数就可以保存.
data unsigned int flashAdd;//写入或者读出EEPROM的地址
bit SaveToFlash();//保存m_Add到地址flashAdd
bit ReadFromFlash();//从地址flashAdd读取数据到m_Add
uint n,m,temp;
sbit DAT=P1^3;
sbit CLK=P1^7;
sbit b=P1^4;
sbit a=P1^5;
sbit com3=P1^2;
sbit com2=P3^3;
sbit com1=P3^4;
uchar tab[]={0x01,0x4f,0x12,0x06,0x4c,0x24,0x20,0x0f,0x00,0x04,0x7f};//0-9,-,全灭
void sendbyte(uchar byte)
{
uchar num,c;
num=tab[byte];
for(c=0;c<8;c++)
{
CLK=0;
DAT=num&0x01;
CLK=1;
num>>=1;
}
}
/*******延时函数*********/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*************显示个十百函数************/
void display(uchar m_Addge,uchar m_Addshi,uchar m_Addbai)
{
com1=0;
com2=0;
com3=0;
sendbyte(m_Addbai);
com1=1;
com2=0;
com3=0;
delay(1);
com1=0;
com2=0;
com3=0;
sendbyte(m_Addshi);
com1=0;
com2=1;
com3=0;
delay(1);
com1=0;
com2=0;
com3=0;
sendbyte(m_Addge);
com1=0;
com2=0;
com3=1;
delay(1);
}
/*********主函数************/
main ()
{
com1=0;
com2=0;
com3=0;
//m_Addbai=0;
//m_Addshi=0;
//m_Addge=0;
ReadFromFlash();//从地址flashAdd读取数据到m_Add
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
EA=1;
while(1)
{
if(n==4)
{ a=~a;
n=0;
m++;
if(m==2)
{
m=0;
temp++;
if(temp==999)
{temp=0;}
m_Addbai=temp/100;
m_Addshi=temp%100/10;
m_Addge=temp%10;
}
}
display(m_Addbai,m_Addshi,m_Addge);
}
}
/*******中断函数*********/
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
n++;
if(b==0)
{SaveToFlash();}
if(b==1)
ReadFromFlash();
}
bit SaveToFlash()//保存至永久存贮
{
//flashAdd=0x8000;//stc89054
flashAdd=0x600;//stc11F02
if(!sector_erase(flashAdd))//擦除扇区0
{
return 0;
}
delay0(1000);
//保存标识
//byte_program(flashAdd,m_Add);
//flashAdd++;
if(!byte_program_and_verify(flashAdd,88))return 0;
flashAdd++;
//保存本板地址
if(!byte_program_and_verify(flashAdd,m_Addge))return 0;
flashAdd++;
if(!byte_program_and_verify(flashAdd,m_Addshi))return 0;
flashAdd++;
if(!byte_program_and_verify(flashAdd,m_Addbai))return 0;
flashAdd++;
//保存接口形式
}
/***************************************
函数:ReadFromFlash()
功能:从地址flashAdd读取数据到m_Add
注: flashAdd不用修改.
***************************************/
bit ReadFromFlash()//从永久存贮中读取
{
//flashAdd=0x8000;//stc89054
flashAdd=0x600;//stc12C2052
//读取标识
if(byte_read(flashAdd)!=88)return 0;
flashAdd++;
//读本板地址
m_Addge=byte_read(flashAdd);
flashAdd++;
m_Addshi=byte_read(flashAdd);
flashAdd++;
m_Addbai=byte_read(flashAdd);
flashAdd++;
//读取接口形式
|
|