I2C接口的输入与输出驱动的PCF8574.docx
- 文档编号:24444450
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:7
- 大小:15.85KB
I2C接口的输入与输出驱动的PCF8574.docx
《I2C接口的输入与输出驱动的PCF8574.docx》由会员分享,可在线阅读,更多相关《I2C接口的输入与输出驱动的PCF8574.docx(7页珍藏版)》请在冰豆网上搜索。
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 { }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- I2C 接口 输入 输出 驱动 PCF8574