本帖最后由 ZG11211 于 2013-9-20 11:08 编辑
NE5532 发表于 2013-9-20 09:39 
1.既然是“计数器”,那么无论读出来的值等于多少,你的程序都应该可以处理,如果读出来的值可以造成你程序 ...
谢谢版主百忙之中来探讨!
我补充一下
1:我用按键来执行读出或者写入,都没有问题,而且程序也非常简单。
2:同样的程序,我将这个变量声明为无符号长整形就不行,声明为有符号长整形就没有问题(如果用1的方法来读,有符号和无符号都没有问题,均正常读取),开机延时再读取我也试过,没有什么分别。
3:我在公司里用的是数码管,为了验证这个问题,回家后我用12864液晶重新写了个验证程序,发现还是一样的效果,只要是无符号长整形的变量就不行,和读取的地址长短没有关系,太奇怪了。
还有就是用16F676的话,就不会出现这个问题,
以下是用16F887的部分代码
#include"pic.h"
__CONFIG(0x2044); //芯片配置字
volatile bank3 union jishu //定义一个共用体
//volatile union jishu //测试过,与上面效果一样
{
//unsigned long y; //这样写就不行
long y; //无符号长整形在开机读取EEP时会出现死机,改用有符号型
unsigned char eep_data[4];
}Frequency;
void Delay_ms(unsigned char j)
{
unsigned char i;
for(;j>0;j--)
for(i=100;i>0;i--)
{;}
}
unsigned char EEPROMread(unsigned char EEAddr)
{
unsigned char ReEEPROMread;
EEADR = EEAddr;
EEPGD = 0;//访问数据存储器
RD = 1; //读有效
//asm("nop"); //空操作延时,要不要没有什么区别
ReEEPROMread = EEDATA; //EEPROM的读数据
return ReEEPROMread;
}
void EEPROMwrite(unsigned char EEAddr,unsigned char Cmd)
{
EEADR = EEAddr; //EEPROM的地址
EEDATA = Cmd; //EEPROM的写数据
EEPGD = 0;
WREN = 1;//写使能
EECON2 = 0x55; //
EECON2 = 0xAA;
WR = 1; //写有效
while(WR==1); //等待写操作完成
}
/************************************
读取EEP数据
************************************/
void EEP_LOAD(void)
{
GIE = 0;
Frequency.eep_data[0] =EEPROMread(0x03);
Frequency.eep_data[1] =EEPROMread(0x04);
Frequency.eep_data[2] =EEPROMread(0x05);
Frequency.eep_data[3] =EEPROMread(0x06);
GIE = 1; //重开总中断
}
/***************************************
数据处理后保存到EEP
***************************************/
void EEP_SAVE(void)
{
GIE = 0;
EEPROMwrite(0x03, Frequency.eep_data[0]);
EEPROMwrite(0x04, Frequency.eep_data[1]);
EEPROMwrite(0x05, Frequency.eep_data[2]);
EEPROMwrite(0x06, Frequency.eep_data[3]);
Delay_ms(200);
GIE = 1;
}
void main( void)
{
//Delay_ms(10);//延时不延时没有任何效果
EEP_LOAD();//开机先读出数据
while(1)
{
//显示部分
}
}
|