I2C怎么连续写

2019-03-24 19:31发布

 为什么连续写不进去AT2402呢?大家帮忙看看吧 !谢谢了#include<reg52.h> #include<intrins.h> sbit SCL=P3^0; sbit SDA=P3^1; char tmp,i,*ap; char code table[]={0x3f  , 0x06 , 0x5b , 0x4f , 0x66  }; void delay() {;;} void delay1() {      char m,n;  for(m=0;m<38;m++)     for(n=0;n<130;n++); }
 /*------I2C开始函数----------------*/  void start() {      SDA=1;   delay();  SCL=1; _nop_();   SDA=0;  delay();  SCL=0;    }
/*--------I2C停止函数-------*/
void stop(){     SDA=0; delay(); SCL=1;  _nop_(); SDA=1; delay();
}/*------I2C OD门,初始化时要pull high*/
void init(){     SDA=1; delay(); SCL=1; delay();}
/*-------I2C应答函数,应答信号在第九个时钟出现-----*/
void ACK(bit a) //  等候应答{     if(a==0)SDA=0;    else SDA=1;     delay(); SCL=1;    delay(); SCL=0; delay(); SDA=1; //这里要释放SDA}


/*------host 向slave写数据--------*/
void writedata(char a){      for(i=0;i<8;i++)   {        a<<=1;  //左移 D7移入CY,PSW.7 SCL=0; delay(); SDA=CY; delay(); SCL=1; delay();   } SCL=0;  //一定要先SCL=0,不然会又读SDA,这样先使SCL无效    SDA=1;   //释放SDA line .接收完数据后要释放,MCU准备读下一个应答位 delay();}
/*----------host 读slave数据-----*/
char readdata(){    char k; SCL=0; delay(); SDA=1; for(i=0;i<8;i++) { SCL=1;  //读取SDA delay(); k=(k<<1)|SDA; SCL=0; delay(); }      SCL=0; //一定要先SCL=0,不然会又读SDA,这样先使SCL无效 SDA=1;   //释放SDA line .接收完数据后要释放,MCU准备读下一个应答位 delay(); return k;}
void main(){          ap=table;     init(); delay(); start(); writedata(0xa0); //device ID ,前四位固定,后三位可编程,D0表示读或写 ACK(0); writedata(0);      // 寄存器地址范围0~ 255 ACK(0); for(i=0;i<5;i++)    {      tmp=*ap;    writedata(tmp); ACK(0); ap++; } stop();  /* delay1();
start(); writedata(0xa0); //device ID ,前四位固定,后三位可编程,D0表示读或写 ACK(0); writedata(3);       // 寄存器地址范围0~ 255 ACK(0); start(); writedata(0xa1); //device ID ,前四位固定,后三位可编程,D0表示读或写 ACK(0); for(i=0;i<5;i++)  {      P1=readdata();       if(i<4) ACK(0);    else ACK(1);     } stop();     */         while(1);      }   
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。