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