📄 pcf8574.c
字号:
#include <reg52.h>
#define SETBIT(VAR,Place) (VAR|=(1<<Place))
#define CLRBIT(VAR,Place) (VAR&=((1<<Place)^255))
#define UCHAR unsigned char
#define UINT unsigned int
sbit IC_SCL=P3^7;
sbit IC_SDA=P3^6;
unsigned char IC_Re_Time;
unsigned char IC_Err_Flag;
void Delay(void)
{
unsigned char i;
for(i=0;i<=10;i++)
;
}
void delay1 (UINT ms)
{
UINT i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<10000;j++)
;
}
}
UCHAR VALBIT(UINT Val,UCHAR Bit)
{
UINT Buf;
Buf=0x0001;
if(Bit)
Buf<<=Bit;
Val&=Buf;
if(Val)
return(0xff);
else
return(0x00);
}
/**********************************************
下面是PCF8574的操作程序
1.通信方式:I2C
2.通信端口:IC_SCL(P3.6),IC_SDA(P3.7)
3.通信地址:0x0101000x
***********************************************/
void IC_Start(void) //启动IC通信
{
IC_SDA=1;
Delay();
IC_SCL=1;
Delay();
IC_SDA=0;
Delay();
IC_SCL=0;
Delay();
}
void IC_Stop(void) //停止IC通信
{
IC_SDA=0;
Delay();
IC_SCL=1;
Delay();
IC_SDA=1;
Delay();
}
void IC_Receive_Ack(void) //接受ACK
{
IC_SDA=1;
IC_SCL=1;
Delay();
IC_Re_Time=0;
while(IC_Re_Time<=30)
{
if(IC_SDA==0)
{
IC_Err_Flag=0;
break;
}
else
{
IC_Err_Flag=1;
}
}
IC_SCL=0;
Delay();
}
void IC_Send_NAck(void) //发送NACK
{
IC_SDA=1;
Delay();
IC_SCL=1;
Delay();
IC_SCL=0;
Delay();
}
void IC_Write_Byte(unsigned char Data) //写数据到8574
{
UCHAR i;
for(i=0;i<=7;i++)
{
if(VALBIT(Data,(7-i))) //data out msb
IC_SDA=1;
else
IC_SDA=0;
IC_SCL=1;
Delay();
IC_SCL=0;
Delay();
}
}
UCHAR IC_Read_Byte(void) //从8574读取一个数据
{
UCHAR i,Data;
for(i=0;i<=7;i++)
{
IC_SCL=1;
Delay();
IC_SDA=1;
Delay();
if(IC_SDA)
SETBIT(Data,(7-i)); //data in msb too
else
CLRBIT(Data,(7-i));
IC_SCL=0;
Delay();
}
return(Data);
}
void IC_Write_Data(UCHAR Data)
{
UCHAR write_time,write_data;
write_data=Data;
for(write_time=0;write_time<=2;write_time++)
{
IC_Start();
IC_Write_Byte(0x40);
IC_Receive_Ack();
IC_Write_Byte(write_data);
IC_Receive_Ack();
IC_Stop();
if(IC_Err_Flag==0)
break;
}
}
UCHAR IC_Read_Data(void)
{
UCHAR Return_Data,read_time;
for(read_time=0;read_time<=2;read_time++)
{
IC_Start();
IC_Write_Byte(0x41);
IC_Receive_Ack();
Return_Data=IC_Read_Byte();
IC_Send_NAck();
IC_Stop();
if(IC_Err_Flag==0)
{
return(Return_Data);
break;
}
}
}
void PCF8574_Init(void)
{
IC_Write_Data(0xf0); //输入状态的必须开始的时候置为1,输出为0
}
void main(void)
{
unsigned char temp3;
//PCF8574_Init();
/* IC_Write_Data(0xF1);
delay1(10);
IC_Write_Data(0xF2);
delay1(10);
IC_Write_Data(0xF4);
delay1(10);
IC_Write_Data(0xF8);
delay1(20);
IC_Write_Data(0xF4);
delay1(10);
IC_Write_Data(0xF2);
delay1(10);
IC_Write_Data(0xF1);
delay1(10);
IC_Write_Data(0xFF);*/
while(1)
{
//temp3=IC_Read_Data();
temp3=0x20;
temp3=temp3>>4;
//IC_Write_Data(temp3&0x0F);
delay1(10);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -