I2C接口的输入与输出驱动的PCF8574.docx

上传人:b****8 文档编号:10366685 上传时间:2023-02-10 格式:DOCX 页数:10 大小:15.74KB
下载 相关 举报
I2C接口的输入与输出驱动的PCF8574.docx_第1页
第1页 / 共10页
I2C接口的输入与输出驱动的PCF8574.docx_第2页
第2页 / 共10页
I2C接口的输入与输出驱动的PCF8574.docx_第3页
第3页 / 共10页
I2C接口的输入与输出驱动的PCF8574.docx_第4页
第4页 / 共10页
I2C接口的输入与输出驱动的PCF8574.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

I2C接口的输入与输出驱动的PCF8574.docx

《I2C接口的输入与输出驱动的PCF8574.docx》由会员分享,可在线阅读,更多相关《I2C接口的输入与输出驱动的PCF8574.docx(10页珍藏版)》请在冰豆网上搜索。

I2C接口的输入与输出驱动的PCF8574.docx

I2C接口的输入与输出驱动的PCF8574

I2C接口的输入与输出驱动的PCF8574-

pcf8574采用I2C接口,有8个准双向口,可以和外部电路连接,来实现输入输出功能,可以用来对口线进行扩展

有几点需要注意

1.某位作为输入的时候,必须首先置为高电平

2.地址是0100A2A1A0R/W

3.最多可以扩展8片

4.低电流损耗,静态电流10uA,驱动电流比较大,而且有索存功能,能够驱动LED发光管

5.带有外部中断输出,低电平有效

我作了一个电路,其中P7-P4作为输入检测开关状态,P3-P0作为输出来驱动LED灯

程序如下

#include"reg51.h"

#defineSETBIT(VAR,Place)?

?

?

?

?

?

?

?

(VAR|=(1<

#defineCLRBIT(VAR,Place)?

?

?

?

?

?

?

?

(VAR&=((1<

sbitIC_SCL=P3^6;

sbitIC_SDA=P3^7;

unsignedcharIC_Re_Time;

unsignedcharIC_Err_Flag;

voidTimer0_Init(void)

{

?

TMOD=0x00;?

//timer0工作定时器方式0,13位技术

?

TH0=0x1e;?

//5ms

?

TL0=0x0c;?

//5ms

?

TR0=1;?

?

//启动时钟0

?

ET0=1;?

?

//允许时钟0进行中断

?

EA=1;?

?

//开放所有中断

}

voidDelay(void)

{

?

unsignedchari;

?

for(i=0;i<=10;i++)

?

{

?

?

;

?

}?

}

unsignedcharVALBIT(unsignedintVal,unsignedcharBit)

{

?

unsignedintBuf;

?

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?

?

?

?

?

?

?

?

?

?

***********************************************/?

voidIC_Start(void)?

?

?

//启动IC通信

{?

?

IC_SDA=1;

?

?

Delay();

?

IC_SCL=1;

?

?

Delay();

?

IC_SDA=0;

?

?

Delay();

?

IC_SCL=0;

?

?

Delay();?

}

voidIC_Stop(void)?

?

?

//停止IC通信

{

?

?

IC_SDA=0;

?

?

Delay();

?

IC_SCL=1;

?

?

Delay();

?

IC_SDA=1;

?

?

Delay();?

?

?

?

?

}

voidIC_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();

}

//voidIC_Send_ACK(void)?

?

?

//发送ACK

//{?

?

?

?

?

?

//ifreadmanydatasatatime,thiscanbeused

//?

IC_SDA=0;

//?

?

Delay();

//?

IC_SCL=1;

//?

?

Delay();

//?

IC_SCL=0;

//?

?

Delay();

//?

IC_SDA=1;

//}

voidIC_Send_NAck(void)?

?

?

//发送NACK

{

?

IC_SDA=1;

?

?

Delay();

?

IC_SCL=1;

?

?

Delay();

?

IC_SCL=0;

?

?

Delay();

}

voidIC_Write_Byte(unsignedcharData)?

//写数据到8574

{

?

unsignedchari;?

?

for(i=0;i<=7;i++)

?

{

?

?

if(VALBIT(Data,(7-i)))?

//dataoutmsb

?

?

?

IC_SDA=1;

?

?

else

?

?

?

IC_SDA=0;

?

?

IC_SCL=1;

?

?

?

Delay();

?

?

IC_SCL=0;

?

?

?

Delay();?

?

?

}?

}

unsignedcharIC_Read_Byte(void)?

//从8574读取一个数据

{

?

unsignedchari;

?

unsignedcharData;

?

for(i=0;i<=7;i++)

?

{

?

?

IC_SCL=1;

?

?

?

Delay();

?

?

IC_SDA=1;

?

?

?

Delay();?

?

?

if(IC_SDA)

?

?

?

SETBIT(Data,(7-i));?

//datainmsbtoo

?

?

else

?

?

?

CLRBIT(Data,(7-i));

?

?

IC_SCL=0;

?

?

?

Delay();

?

}

?

return(Data);

}

voidIC_Write_Data(unsignedcharData)

{

?

unsignedcharwrite_time;

?

unsignedcharwrite_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;

?

}?

?

?

}

unsignedcharIC_Read_Data(void)

{

?

unsignedcharReturn_Data;

?

unsignedcharread_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;

?

?

}

?

}?

?

}

voidPCF8574_Init(void)

{

?

IC_Write_Data(0xf0);?

//输入状态的必须开始的时候置为1,输出为0

}

voidmain(void)

{

?

unsignedchartemp3;

?

Timer0_Init();

?

PCF8574_Init();

?

while

(1)

?

{

?

?

temp3=IC_Read_Data();

?

?

IC_Write_Data(0x0f);

?

?

Delay();

?

;中间可以添加你需要的模块,比如显示或者其他的操作等

?

}

}

/*********************************************************

*?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

中断服务子程序?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

*

*********************************************************/

externvoidexternal0_rt(void)interrupt0//INT0

{

}

externvoideit0_rt(void)interrupt1//T0,标准,定时中断

{

?

TH0=0x1e;

?

TL0=0x0c;

?

IC_Re_Time++;?

?

?

}

voidexternal1_rt(void)interrupt2using1//INT1

{

}

voideit1_rt(void)interrupt3using1//T1,标准

{

}

voidsci_rt(void)interrupt4using1//UART

{

}

voideit2_rt(void)interrupt5using1//T23种工作模式,输入捕捉、自动重载和波形发生器

{

}

voidPCA_rt(void)interrupt6using1//PCA

{

}

voidKBDIT_rt(void)interrupt7using1//keyboard

{

}

voidspi_rt(void)interrupt9using1//SPI

{

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1