⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcf8574.c

📁 PCF8574 Remote 8-bit I/O expander for I2C-bus IO扩展芯片测试程序
💻 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 + -