今天把PCF8574调出来了。 感觉对I2C的认识更加深刻了。对于读字节和写字节的时序及方法都是差不多了 基本上是没差。 起初我还想多了 想着如何看时序图里的读时序操作,还有读时序的最后一个1怎么写始终不确定 (后来发现那个1是不用写的 ) 还有对读和写的时序中数据的处理 直接写地址后就能传输数据了, 尤其是读时序中的数据 输入数据1后 响应再数据4.想了很久。其实不是什么特别的东西 就是要读什么数据直接读就行了。 其实我为什么会有这些问题 其实是一起读写的时候专门把这2个编成了2个函数 弄的我一直在想这2个函数怎么写 其实这是我的思维太固定的原因。 要输入或者输出数据的话 直接在主函数里读或写就行了 而且读和写就是读字节的读写函数。 其实很简单 是自己想复杂了。 以后还要多读读文档 熟悉读文档然后熟悉程序的书写。 以下是我的PCF8574的程序大家可以多多参考下 我是通过调P2口的各个IO口得电平高低来控制 PCF8574上的8个IO口的电平高低 然后再P3口读出来。 另外要说的一点是 你手上拿到的PCF8574 的A0,A1,A2都给低电平的话是可以的而且一般都是这么给的 但地址的高四位如果0x40不行的话 可以试试0x70 因为你手中的8574很有可能是8574A 虽然芯片上写的是8574 以下是我的程序。
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit sda=P1^0;
sbit scl=P1^1;
void init();
void delay()
{
_nop_();_nop_();
}
/*
void delay1(uchar m)
{
uchar x,y;
for(x=m;x>0;x--)
for(y=110;y>0;y--);
} */
void start()
{
sda=1;
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
sda=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
_nop_();
_nop_();
}
void stop()
{
sda=0;
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
sda=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void ack()
{
sda=0;
_nop_();
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
_nop_();
_nop_();
}
/*
void noack()
{
sda=1;
_nop_();
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
_nop_();
_nop_();
} */
void iicwr(uchar dat)
{
uchar i;
scl=0;
// _nop_();
for(i=0;i<8;i++)
{
if(dat&0x80)
{
sda=1;
}
else
{
sda=0;
}
dat=dat<<1;
delay();
scl=1;
delay();
delay();
_nop_();
_nop_();
scl=0;
delay();
}
scl=1;
_nop_();
_nop_();
sda=1;
_nop_();
_nop_();
}
uchar iicre()
{
uchar i,dat;
scl=0;
_nop_();
_nop_();
sda=1;
_nop_();
_nop_();
for(i=0;i<8;i++)
{
scl=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
dat=dat<<1;
if(sda)
{
dat++;
}
scl=0;
_nop_();
_nop_();
_nop_();
_nop_();
}
return dat;
}
void init()
{
sda=1;
scl=1;
P2=0Xaa;
}
void main()
{
init();
// start();
// iicwr(0x41);
// ack();
/// P2=iicre();
// ack();
/* iicwr(0x40);
ack();
iicwr(0x55);
ack(); */
start();
iicwr(0x71);
ack();
P3=iicre();
ack();
stop();
while(1);
}