单片机读取EEPROM的时候是怎么读写的一些疑问

时间:2021-09-03 19:44:38
unsigned char Count1;
unsigned long D[17], LedOut[5],LedNumVal;
unsigned int idata USEC;

  
void  system_ini() 
{    
    TMOD|= 0x11;
    TH1 = 0xfe; //11.0592
TL1 = 0x33;
TR1  = 1; 
    IE =0x8A;

}

 main()
 {  unsigned char i;
unsigned char pDat[8];

   system_ini();
   while(1)
   {
 //========================IIC 读取
if(K2 == 0)    //第二个按钮读取数据

  IRcvStr(AT24C02, 0 , &pDat[0], 8); 
  for (i=0; i<4; i++)
  {
D[14+i]=pDat[i*2+0]+pDat[i*2+1]*0x100;
Count1 = D[14];
   }      
 }

   //========================IIC 保存
   if(K1 == 0)    //第一个按钮保存数据
   { 
      D[14]= Count1;
 for (i=0; i<4; i++)
     {
   pDat[i*2+0]=D[14+i];
   pDat[i*2+1]=D[14+i]>>8;
 }
     ISendStr(AT24C02, 0 , &pDat[0], 8); 
  D[14] = 0;
       }


  /********以下将2402中保存的数据送到LED数码管显示*************/
        LedNumVal=Count1;
  LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
      LedOut[1]=Disp_Tab[LedNumVal%1000/100];
      LedOut[2]=Disp_Tab[LedNumVal%100/10]|0x80;
      LedOut[3]=Disp_Tab[LedNumVal%10]; 
     
    for(i=0; i<4; i++) 
  {

    P0 =  LedOut[i];
   
switch(i)   
         {     
            case 0:LS138A=0; LS138B=0; LS138C=0; break;         
            case 1:LS138A=1; LS138B=0; LS138C=0; break;             
            case 2:LS138A=0; LS138B=1; LS138C=0; break; 
            case 3:LS138A=1; LS138B=1; LS138C=0; break; 
case 4:LS138A=0; LS138B=0; LS138C=1; break;
         }
 
delay(100);
  }

  //  LS138A=1; LS138B=1; LS138C=1;    

   }
}


void delay(unsigned int i)
{
    char j;
    for(i; i > 0; i--)
        for(j = 200; j > 0; j--);
}


在保存数据和读取数据的时候这一个技巧不理解,谢谢你的解答。保存数据的时候
D[14+i]=pDat[i*2+0]+pDat[i*2+1]*0x100;这里的我就不理解了,循环3次那么不就是D[17]了这不就溢出了吗?还有他们的下标又乘又加的最后还要*0x100这个又是为什么?实在不理解。
  保存的时候核心的那几句我也不能理解!
Count1 = D[14];这里把一个long型的给一个char型。为什么?

2 个解决方案

#1


D[14+i]=pDat[i*2+0]+pDat[i*2+1]*0x100;这个是把pDat数组里面的数按照高低字节放到D数组里面去,相当于D【14】=pDat[0]+pDat[1]*256
别的我也没看明白

#2


引用 1 楼 PALLEE 的回复:
D[14+i]=pDat[i*2+0]+pDat[i*2+1]*0x100;这个是把pDat数组里面的数按照高低字节放到D数组里面去,相当于D【14】=pDat[0]+pDat[1]*256
别的我也没看明白

  还有,这个D的下标是17  D[17]  而我们这里有for(i=0;i<4;i++)那么我们最后一次的循环不就成了D[17]了么?这不合理啊!

#1


D[14+i]=pDat[i*2+0]+pDat[i*2+1]*0x100;这个是把pDat数组里面的数按照高低字节放到D数组里面去,相当于D【14】=pDat[0]+pDat[1]*256
别的我也没看明白

#2


引用 1 楼 PALLEE 的回复:
D[14+i]=pDat[i*2+0]+pDat[i*2+1]*0x100;这个是把pDat数组里面的数按照高低字节放到D数组里面去,相当于D【14】=pDat[0]+pDat[1]*256
别的我也没看明白

  还有,这个D的下标是17  D[17]  而我们这里有for(i=0;i<4;i++)那么我们最后一次的循环不就成了D[17]了么?这不合理啊!