|
本帖最后由 LQMEI 于 2013-6-6 21:31 編輯
程序如下,不能正確保存數據,求幫助、指點迷津
我的思路是三個無符號long型數據 dqs,sds,ljs 先分解成12個無符號char型數據存到數組XSM[1]~~XSM[12]里,然后把數組XSM[1]~~XSM[13]這13個數存進 EEPROM 里,以備下次開機時候讀取
//stc15f204ea 震蕩頻率 設為6MHz
#include <intrins.h>
#include <stc15.h> //stc15系列單片機頭文件
#define uchar unsigned char
#define uint unsigned int
#define ulog unsigned long
#define addcu 0x0000
uchar xsm[14]; // xsbl 顯示變量
ulog dqs,sds,ljs; //dqs當前數,sds設定數,ljs累計數
//===============================================
void delayms(uint xms); //延時子函數; xms毫秒數
uchar read(uint adr); //字節讀
void write(uint adr,uchar dat); //字節寫
void clear(uint adr); //清除一片扇區
void disable(); // 關閉iap編程
void cshhs(); //初始化
void vint(); //寫入要保存的數據
void goon(uint adr);
//===============================================
void delayms(uint xms) //延時子函數
{uint i,j;
for(i=xms;i>0;i--) //i=xms即延時約xms毫秒
for(j=110;j>0;j--);
}
//=======================================
void goon(uint adr)
{
IAP_CONTR=0X84;
IAP_ADDRH=adr>>8; //獲取指針高八位
IAP_ADDRL=adr; //獲取指針低八位
IAP_TRIG=IAP_TRIG0; //兩條觸發命令,使命令執行
IAP_TRIG=IAP_TRIG1;
_nop_(); _nop_(); _nop_();
}
//====================================
uchar read(uint adr) //字節讀
{EA=0;
IAP_CMD=0X01; //;01h為讀取命令
goon(adr);
return(IAP_DATA);
}
//=========================
void write(uint adr,uchar dat) //字節寫
{ EA=0;
IAP_CMD=0X02; //;02h為寫入命令
IAP_DATA=dat; //把數據放入數據寄存器中,用于寫
goon(adr);
}
//==============================
void clear(uint adr) //清除一片扇區
{ EA=0;
IAP_CMD=0X03; //;03h為擦除命令
goon(adr);
}
//=================================
void cloiap() // 關閉iap編程
{EA=1;
IAP_CONTR=0X00; //關閉rom控制器命令
IAP_CMD=0X00; //清除 讀寫擦 命令
}
//===========================
void cshhs() //初始化
{
uchar i;
for (i=13;i>0;i--){xsm=read(addcu+i);}//讀取上次存入的數據
clear(addcu);cloiap(); //關閉IAP
for (i=1;i<=4;i++){ljs<<=8;ljs+=xsm;} //恢復ljs的值
for (i=5;i<=8;i++){sds<<=8;sds+=xsm;} //恢復sds的值
for (i=9;i<=12;i++){dqs<<=8;dqs+=xsm;} //恢復dqs的值
xsm[1]=xsm[13];
}
//=================
void vint() //寫入要保存的數據
{ uchar i;
jdq1=jdq2=led=0; //關閉指示燈以及繼電器
P1=0xff; //關閉所有數碼顯示
wela=1;
wela=0;
EA=0;
for (i=12;i>=9;i--){ xsm=dqs;dqs>>=8;} //分解dqs的值
for (i=8;i>=5;i--) { xsm=sds;sds>>=8;} //分解sds的值
for (i=4;i>=1;i--) { xsm=ljs;ljs>>=8;} //分解ljs的值
//clear(addcu);
for (i=1;i<13;i++) {write(addcu+i,xsm);}//寫入要保存的數據
cloiap(); //關閉IAP
}
//===============================================
void main()
{
cshhs(); //初始化
xsm[13]=xsm[1]=3;
ljs=98712346;
sds=4000;
dqs=346;
vint();
while(1);
}
|
|