#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCL = P0^1;
sbit SDA = P0^0;
//bit ack;
unsigned char code wei[]={0x0fe,0x0fd,0x0fb,0x0f7};
//*****************延时************************
void delay_nms(unsigned int n) //N ms延时函数
{
unsigned int i,j;
for (i=0;i<n;i++)
for (j=0;j<1140;j++);
}
void delay4us() //延时 4us 函数
{_nop_();_nop_();_nop_();_nop_();}
void delay(uint x) //延时函数,12MHZ 晶振频率下,delay(1)延时 1ms
{uchar i;
while(x--)
for(i=0;i<120;i++);
}
//***************************************
void start()
{
SDA=1;
SCL=1;
delay4us();
SDA=0;
delay4us();
SCL=0;
}
void stop()
{
SDA=0;
SCL=0;
delay4us();//>4us后SCL跳变
SCL=1;
delay4us();
SDA=1;
}
void rack() //读取应答 read acknowledge
{
SDA=1;
delay4us();
SCL=1;
delay4us();
SCL=0;
}
void wbyte(uchar b)//向 PCF8574 写一字节数据 b
{
uchar i;
for(i=0;i<8;i++)
{
b<<=1; //注:左移时最低位补 0,最高位移入 PSW 的 CY 位
SDA=CY; //所以每次从最高位开始发送数据
_nop_();
SCL=1;
delay4us();
SCL=0;
}
rack(); //每发一字节数据要读取应答
}
void wdata(uchar addr,uchar dat) //向指定地址 addr 写数据 dat
{
start(); //I2C 开始
wbyte(0x40); //寻找器件地址为 0x40 的芯片。0x40 即为 0100 0000 ,高四位固定为 0100,
//因为本例中 PCF8574 的 A2,A1,A0接地,所以得到低四位中的前三位编码为 000
//最低位为 0 表示主机向从机写数据,这里主机为单片机,从机为 PCF8574 芯片
wbyte(addr); //指定地址 addr
wbyte(dat); //向指定地址写数据 dat
stop(); //I2C 停止
delay(10);
}
void main(void)
{
while(1)
{
P2=wei[0];
wdata(0x40,0x3f);
delay_nms(100);
P2=wei[1];
wdata(0x40,0x86);
delay_nms(100);
P2=wei[2];
wdata(0x40,0x5b);
delay_nms(100);
P2=wei[3];
wdata(0x40,0x4f);
delay_nms(100);
}
}