1.IO口扩展芯片
PCF8574是一款带IIC总线,可使大多数MCU实现远程I/O 口扩展。
该器件包含一个8位准双向口和一个IIC总线接口。(通信接口IIC,2根线可以扩展为8个口)
PCF8574电流消耗很低,输出锁存具有大电流驱动能力可直接驱动LED
它还带有一条中断接线(INT)可与MCU的中断逻辑相连,通过INT发送中断信号(扩展通道发生变化是产生)
远端I/O口不必经过IIC总线通信就可通知MCU是否有数据从端口输入,这意味着PCF8574 可以作为一个单被控器。
PCF8574特性
1.2.5V到6V
2.低备用电流(功耗低)
3.支持开漏中断输出
4.扩展8口
5.扩展IO口可以驱动LED
6.通过3个硬件引脚地址可以寻址8个器件
2.PCF8574引脚说明
PCF8574寻址
一个IIC,最多可以挂8个PCF8574
S代表IIC的Start信号(启动信号);
A代表PCF8574T发出的应答信号;
A0-A2为PCF8574T的寻址信息,我们开发板上A0-A2都是接GND的,所以,PCF8574T的地址为:0X40
写的话,0x40,读0x41
R/W为读/写控制位,R/W=0的时候,表示写数据到PCF8574T,输出到P0-P7口,R/W=1的时候,表示读取PCF8574T的数据,获取P0-P7的IO口状态。
PCF8574写数据
先启动,发送从机地址和写数据指命,等待PCF8574T一个应答,就可以写入8位数据,8位数据就会到8个IO口上,同时发送应答给CPU
如果你需要更改,就直接在写入8位数据即可。
PCF8574读数据
先启动,发送从机地址和读数据指命,等待PCF8574T一个应答(这时数据已经锁存了),然后可以读取8个IO口的数据,支持连续读,最后的时候发送STOP指命
PCF8574中断
PCF8574T带有中断,可以连接到MCU的中断输入引脚上,在输入模式中,输入信号的上升或下降沿都可以产生中断,中断产生后需要进行一次读写,要不然无法触发下一次中断。
3.STM32硬件说明
4.IO口扩展实验
就是直接向PCF8574写入数据,间接控制8个IO口,其中一个IO口接入BEEP(蜂名器),控制其启动
主函数
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "lcd.h"
#include "sdram.h"
#include "pcf8574.h"
int main(void)
{
u8 key;
u16 i=0;
u8 beepsta=1;
HAL_Init();
Stm32_Clock_Init(360,25,2,8);
delay_init(180);
uart_init(115200);
LED_Init();
KEY_Init();
SDRAM_Init();
LCD_Init();
POINT_COLOR=RED;
while(PCF8574_Init())
{
delay_ms(500);
delay_ms(500);
LED0=!LED0;
}
while(1)
{
key=KEY_Scan(0);
if(key==KEY0_PRES)
{
beepsta=!beepsta;
PCF8574_WriteBit(BEEP_IO,beepsta);
}
if(PCF8574_INT==0)
{
key=PCF8574_ReadBit(EX_IO);
if(key==0)LED1=!LED1;
}
i++;
delay_ms(10);
if(i==20)
{
LED0=!LED0;
i=0;
}
}
}
PCF8574 C文件
#include "pcf8574.h"
#include "delay.h"
u8 PCF8574_Init(void)
{
u8 temp=0;
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_Initure.Pin=GPIO_PIN_12;
GPIO_Initure.Mode=GPIO_MODE_INPUT;
GPIO_Initure.Pull=GPIO_PULLUP;
GPIO_Initure.Speed=GPIO_SPEED_HIGH;
HAL_GPIO_Init(GPIOB,&GPIO_Initure);
IIC_Init();
IIC_Start();
IIC_Send_Byte(PCF8574_ADDR);
temp=IIC_Wait_Ack();
IIC_Stop();
PCF8574_WriteOneByte(0XFF);
return temp;
}
u8 PCF8574_ReadOneByte(void)
{
u8 temp=0;
IIC_Start();
IIC_Send_Byte(PCF8574_ADDR|0X01);
IIC_Wait_Ack();
temp=IIC_Read_Byte(0);
IIC_Stop();
return temp;
}
void PCF8574_WriteOneByte(u8 DataToWrite)
{
IIC_Start();
IIC_Send_Byte(PCF8574_ADDR|0X00);
IIC_Wait_Ack();
IIC_Send_Byte(DataToWrite);
IIC_Wait_Ack();
IIC_Stop();
delay_ms(10);
}
void PCF8574_WriteBit(u8 bit,u8 sta)
{
u8 data;
data=PCF8574_ReadOneByte();
if(sta==0)data&=~(1<<bit);
else data|=1<<bit;
PCF8574_WriteOneByte(data);
}
u8 PCF8574_ReadBit(u8 bit)
{
u8 data;
data=PCF8574_ReadOneByte();
if(data&(1<<bit))return 1;
else return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)