| 本帖最后由 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)
 {
 //显示部分
 }
 }
 
 
 |