为什么连续写不进去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); }
此帖出自
小平头技术问答
确定你的P3.0和P3.1口的连接正确;
char范围为-128-127,delay里的n超了!
在读字节的程序部分,你要写入的的存储地址是“3”?
可以先把应答部分去掉,暂时没什么影响,不过在读写子函数里面要加上读取应答信号的语句···
一周热门 更多>