为什么连续写不进去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); }
|