想通过I2C连续写数据和读数据,用for循环来操作,写入的都是第一个数据,后面的就没有写入了,读也是这样。但如果不用for循环写,直接写入两个数据可以实现,但是读得时候也不能实现;在网上搜了下也是用for循环啊,但是我的怎么不能实现呢?请大家指教下该怎么修改程序。
程序如下:
#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 , 0x6d };
void delay()
{;;}
void delay1()
{
char m,n;
for(m=0;m<100;m++)
for(n=0;n<100;n++);
}
/*------I2C开始函数----------------*/
void start()
{
SDA=1;
_nop_();
SCL=1;
delay();
SDA=0;
delay();
//SCL=0; 可有可无
}
/*--------I2C停止函数-------*/
void stop()
{
SDA=0;
_nop_();
SCL=1;
delay();
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)
{
tmp=a;
for(i=0;i<8;i++)
{
tmp<<=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;
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(3); // 寄存器地址范围0~ 255
ACK(0);
for(i=0;i<5;i++)
{
writedata(*ap);
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);
}