內部晶振22.1184M,想實現啟動計數器,保存在EEPROM中(0x0000和0x0001中),測試數據初始值為605,通過szx變量保存,使用了共同體切分兩字節。
首次運行帶賦值時,TB燈亮,證明變量szx是正常的610以下值(應該為604).再重新寫入程序后(去除賦值部分,直接讀取EEPROM)TB燈滅,證明數值有錯誤,請問程序中哪個部分出了問題呢?難道還沒寫進EEPROM?
#define WT_24M 0x81 //EEPROM 24M晶振延時
sbit RR = P2^1;
sbit GG = P2^2;
sbit BB = P2^3;
sbit TA = P2^4;
sbit TB = P2^5;
sbit TC = P2^6;
unsigned int szx; //EEPROM的計數器變量
void IapIdle() //EEPROM 結束復位
{
IAP_CONTR = 0; //EEPROM 關閉IAP功能
IAP_CMD = 0; //EEPROM 清除命令寄存器
IAP_TRIG = 0; //EEPROM 清除觸發寄存器
IAP_ADDRH = 0x80; //EEPROM 將地址設置到非IAP區域
IAP_ADDRL = 0; //EEPROM
}
char IapRead(unsigned int addr) //EEPROM 讀取EEPROM數據 返回整個IapRead函數
{
unsigned char dat;
IAP_CONTR = WT_24M; //EEPROM 設定延時
IAP_CMD = 1; //EEPROM 設定1讀取命令
IAP_ADDRL = addr; //EEPROM 指定要讀取的低地址
IAP_ADDRH = addr>>8; //EEPROM 指定要讀取的高地址
IAP_TRIG = 0x5a; //EEPROM 執行的觸發命令
IAP_TRIG = 0xa5; //EEPROM 執行的觸發命令
_nop_();
dat = IAP_DATA; //EEPROM 讀取IAP賦值
IapIdle(); //EEPROM 關閉IAP功能
return dat; //EEPROM 返回整個IapRead函數
}
void IapProgram(unsigned int addr, unsigned char dat) //EEPROM 把addr地址的資料寫成dat的內
{
IAP_CONTR = WT_24M; //EEPROM 設定延時
IAP_CMD = 2; //EEPROM 設定2寫命令
IAP_ADDRL = addr; //EEPROM 指定要寫的低地址
IAP_ADDRH = addr>>8; //EEPROM 指定要寫的高地址
IAP_DATA = dat; //EEPROM 寫IAP數據
IAP_TRIG = 0x5a; //EEPROM 執行的觸發命令
IAP_TRIG = 0xa5; //EEPROM 執行的觸發命令
_nop_();
IapIdle(); //EEPROM 關閉IAP功能
}
void IapErase(unsigned int addr) //EEPROM 擦除EEPROM數據
{
IAP_CONTR = WT_24M; //EEPROM 設定延時
IAP_CMD = 3; //EEPROM 設定3擦除命令
IAP_ADDRL = addr; //EEPROM 指定要擦除的低地址
IAP_ADDRH = addr>>8; //EEPROM 指定要擦除的高地址
IAP_TRIG = 0x5a; //EEPROM 執行的觸發命令
IAP_TRIG = 0xa5; //EEPROM 執行的觸發命令
_nop_();
IapIdle(); //EEPROM 關閉IAP功能
}
void main()
{
union hecheng //EEPROM 定義一個共同體
{
unsigned char qw[2]; //EEPROM qw有2個char 加入了unsigned
unsigned int er; //EEPROM er是無字符整型
}hc; //EEPROM 共同體名稱為hc
hc.qw[0]=IapRead(0x0000); //EEPROM 讀0x0000到hc[0]
hc.qw[1]=IapRead(0x0001); //EEPROM 讀0x0002到hc[1]
szx = hc.er;
// szx = 605; //首次編譯預賦值,保存在EEPROM中,下次重新編譯去除,并且不清除EEPROM中數據
if(szx <= 585)
{
TC = 0x0; //EEPROM R38(LED)
while(1); //EEPROM 判斷次數為,停止操作
}
szx--;
hc.er = szx;
IapErase(0x0000); //EEPROM 先擦除0x0000扇區
IapProgram(0x0000,hc.qw[0]); //EEPROM 寫hc[0]到0x0000
IapProgram(0x0001,hc.qw[1]); //EEPROM 寫hc[1]到0x0002
hc.qw[0]=IapRead(0x0000); //EEPROM 讀0x0000到hc[0]
hc.qw[1]=IapRead(0x0001); //EEPROM 讀0x0002到hc[1]
if(szx == hc.er)
{
TA = 0x0; //EEPROM R34(LED) }
if(szx >= 610)
{
TB = 0x0; //EEPROM R36(LED) }
}
|