本帖最后由 xichandoujigu 于 2018-4-6 19:42 编辑
最近学习I2C,在学PCF8574扩展IO显示LED的时候发现显示不正确,不知道怎么回事,还请指教。
下面是代码和图,代码是网上找来修改的。
仿真图如下
代码如下
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit sda=P0^0;
sbit scl=P0^1;
void delay()
{ ;; }
void start() //开始信号
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop() //停止
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void respons() //应答
{
uchar i;
scl=1;
delay();
while((sda==1)&&(i<250))i++;
scl=0;
delay();
}
void init()//初始
{
sda=1;
delay();
scl=1;
delay();
}
void write_byte(uchar date) //写
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay();
sda=CY;
delay();
scl=1;
delay();
}
scl=0;
delay();
sda=1;
delay();
}
void write_add(uchar date1) //根据地址写
{
start();
write_byte(0x40); //8574地址为0100ABC0,最后一位0为写,我的ABC接地都为0;
//这里0x40是我自己根据地址位算的
respons();
write_byte(date1);
respons();
stop();
}
void main()
{
while(1)
{ init() ;
write_add(0xAA) ; //写入10101010
}
}
运行时序图如下
第一个时序图写地址,第二个时序图写数据,时序图可以看出:
第一次写地址时候就八个时钟信号,这很奇怪,没有第九个时钟;
第二次写数据时候有第九个时钟,但sda数据为高,未响应;
启动和停止时序都是对的。
运行结果是8574的P0-P7端口为灰色。上面的仿真图可以看到。
请问,是哪里不对呢?
|