您好,欢迎访问三七文档
有关于AT24C02存储器的操作,C语言部分看不懂unsignedlongD[17]IRcvStr(AT24C02,0,&pDat[0],8);for(i=0;i4;i++){D[14+i]=pDat[i*2+0]+pDat[i*2+1]*0x100;Count1=D[14];以上是24C02main.c的程序bitIRcvStr(unsignedcharsla,unsignedcharsuba,unsignedchar*s,unsignedcharno){unsignedchari;Start_I2c();/*启动总线*/SendByte(sla);/*发送器件地址*/if(ack==0)return(0);SendByte(suba);/*发送器件子地址*/if(ack==0)return(0);Start_I2c();/*重新启动总线*/SendByte(sla+1);if(ack==0)return(0);for(i=0;ino-1;i++){*s=RcvByte();/*发送数据*/Ack_I2c(0);/*发送就答位*/s++;}*s=RcvByte();Ack_I2c(1);/*发送非应位*/Stop_I2c();/*结束总线*/return(1);}以上是24C02.c的部分程序这个带星号的*s和24C02main的看不懂啊分享到:2013-04-2321:03提问者采纳【1】*s是指针s所指向的内容。s++将改变地址,指向下一个字节存放地址。【2】主程序中,pDat数组的地址是实参。子程序中s是形参。主程序调用IRcvStr(AT24C02,0,&pDat[0],8)函数,就是从地址为AT24C02(IIC器件地址宏名)的24C02芯片中,从0起始地址连续读取8个字节内容,送到数组pDat[]中。调用子程序时刻,s就是pDat[]的首地址。在子程序里面,*s=RcvByte();...s++;实际的情况,可以这样理解:pDat[x]=RcvByte();...x++;【3】主程序中将pDat[]连续的每两个字节,低地址在低8位,转换成1个整形字。数组pDat的前8个字节,共4次转换,并把他们存放到数组D[14]、D[15]、D[16]、D[17]四个元素中。追问我不明白的是&PDAT[0],只有0个元素怎么读取啊?D[14]=PDat[i*2]+PDat[i*2+1]*100怎么理解。就是这些数组把我晕了回答【1】&PDAT[0]表示数组的首地址。传递的并不是数组本身,而是数组的首地址。【2】D[14+i]=PDat[i*2]+PDat[i*2+1]*100你把i=0……i=3代进去看,如下。再理解。D[14]=PDat[0]+PDat[1]*0x100;D[15]=PDat[2]+PDat[3]*0x100;D[16]=PDat[4]+PDat[5]*0x100;D[17]=PDat[6]+PDat[7]*0x100;0x100是啥,表达式含义,你应该知道吧?追问count1=D[14]是指在数组里边地址为14这个地方的字节吗?还是数组D[14]有14个元素?问最后一次。回答你需要明白数组的声明和定义。【1】声明:unsignedinta[6];表示无符号整形数组,共有6个元素。只允许声明一次。【2】定义:a[0]=1;……a[4]=b+1;最多a[5]=xxx。给元素赋值。下标0-5表示对其中的6个元素分别访问。也可以在声明的同时定义。追问问题是这个D[14]中的前面还有一些元素D[1]…D[13].这些他是怎么处理的。为什么非要访问D[14],D[1]不行吗?最不明白的就是D[14].不是只读取八个字节的吗。可以加你的QQ吗?回答这一部分,不能断章取义。最后算了半天,后面只有一句D[14]赋值给Count1。我也看不明白。具体要看其整个程序设计中关于数据部分的开发约定。从这段程序看,你的理解没问题。用哪个不是用呢,是吧?装BaiduHi。追问周末再把程序发给你吧。实在搞不明白。这个赋值。现在在学校。标题:EEPROM读写试验(按钮输入)*此例程学员更进一步地熟悉并掌握(存储芯片AT2402)的操作,有保存和读取操作*了解掌握I2C总线接口的工作原理具体操作:第1个按钮保存第2个按钮读取*第3个按钮减减第4个按钮加数**希望学员认真体会消化此例程,试着用别的资源来操作EEPROM!*#includeFunction.h#includereg52.h#defineAT24C020xa0//AT24C02地址//elseIOsbitLS138A=P2^2;//译码器端sbitLS138B=P2^3;sbitLS138C=P2^4;sbitK1=P1^0;//保存sbitK2=P1^1;//读取sbitK3=P1^2;//+数据sbitK4=P1^3;//-数据voiddelay(unsignedinti);//此表为LED的字模,共阴数码管0-9-unsignedcharcodeDisp_Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};unsignedcharCount1;unsignedlongD[17],LedOut[5],LedNumVal;unsignedintidataUSEC;voidsystem_ini(){TMOD|=0x11;TH1=0xfe;//11.0592TL1=0x33;TR1=1;IE=0x8A;}main(){unsignedchari;unsignedcharpDat[8];system_ini();while(1){//========================IIC读取if(K2==0)//第二个按钮读取数据{IRcvStr(AT24C02,0,&pDat[0],8);for(i=0;i4;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;i4;i++){pDat[i*2+0]=D[14+i];pDat[i*2+1]=D[14+i]8;}ISendStr(AT24C02,0,&pDat[0],8);}/********以下将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;i4;i++){P0=LedOut[i];switch(i){case0:LS138A=0;LS138B=0;LS138C=0;break;case1:LS138A=1;LS138B=0;LS138C=0;break;case2:LS138A=0;LS138B=1;LS138C=0;break;case3:LS138A=1;LS138B=1;LS138C=0;break;case4:LS138A=0;LS138B=0;LS138C=1;break;}delay(100);}//LS138A=1;LS138B=1;LS138C=1;}}voiddelay(unsignedinti){charj;for(i;i0;i--)for(j=200;j0;j--);}/*************************************[t1(0.5ms)中断]中断中做PWM输出------------1000/(0.02ms*250)=200Hz*************************************/voidT1zd(void)interrupt3//3为定时器1的中断号1定时器0的中断号0外部中断12外部中断24串口中断{TH1=0xfe;//12MTL1=0x33;if(USEC++==200){USEC=0;if(!K3)Count1++;//改变数据if(!K4&Count1!=0)Count1--;}}为啥会出错,function.h头文件是干啥的?????分享到:2012-10-2014:34提问者采纳IRcvStr(AT24C02,0,&pDat[0],8);ISendStr(AT24C02,0,&pDat[0],8);等,好几个函数没有定义,没有声明,这些函数应该在function。h这个头文件里。你有两个方法可以解决错误。第一,重新编写24C04的驱动函数,替换IRcvStr(),和ISendStr()。等第二,function。h这个文件,放在项目根目录下面,设置编译器的头文件路径。
本文标题:AT24C02程序
链接地址:https://www.777doc.com/doc-2899118 .html