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(蜂名器),控制其启动
主函数文章来源:https://www.toymoban.com/news/detail-435330.html
#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(); //初始化HAL库
Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz
delay_init(180); //初始化延时函数
uart_init(115200); //初始化USART
LED_Init(); //初始化LED
KEY_Init(); //初始化按键
SDRAM_Init(); //初始化SDRAM
LCD_Init(); //初始化LCD
POINT_COLOR=RED;
while(PCF8574_Init()) //检测不到PCF8574
{
delay_ms(500);
delay_ms(500);
LED0=!LED0;//DS0闪烁
}
while(1)
{
key=KEY_Scan(0);
if(key==KEY0_PRES)//KEY0按下,读取字符串并显示
{
beepsta=!beepsta; //蜂鸣器状态取反
PCF8574_WriteBit(BEEP_IO,beepsta); //控制蜂鸣器
}
if(PCF8574_INT==0) //PCF8574的中断低电平有效
{
key=PCF8574_ReadBit(EX_IO); //读取EXIO状态,同时清除PCF8574的中断输出(INT恢复高电平)
if(key==0)LED1=!LED1; //LED1状态取反
}
i++;
delay_ms(10);
if(i==20)
{
LED0=!LED0;//提示系统正在运行
i=0;
}
}
}
PCF8574 C文件文章来源地址https://www.toymoban.com/news/detail-435330.html
#include "pcf8574.h"
#include "delay.h"
//
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32F429开发板
//PCF8574驱动代码
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2016/1/13
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
//All rights reserved
//
//初始化PCF8574
u8 PCF8574_Init(void)
{
u8 temp=0;
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOB_CLK_ENABLE(); //使能GPIOB时钟
GPIO_Initure.Pin=GPIO_PIN_12; //PB12
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初始化
//检查PCF8574是否在位
IIC_Start();
IIC_Send_Byte(PCF8574_ADDR); //写地址
temp=IIC_Wait_Ack(); //等待应答,通过判断是否有ACK应答,来判断PCF8574的状态
IIC_Stop(); //产生一个停止条件
PCF8574_WriteOneByte(0XFF); //默认情况下所有IO输出高电平
return temp;
}
//读取PCF8574的8位IO值
//返回值:读到的数据
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;
}
//向PCF8574写入8位IO值
//DataToWrite:要写入的数据
void PCF8574_WriteOneByte(u8 DataToWrite)
{
IIC_Start();
IIC_Send_Byte(PCF8574_ADDR|0X00); //发送器件地址0X40,写数据
IIC_Wait_Ack();
IIC_Send_Byte(DataToWrite); //发送字节
IIC_Wait_Ack();
IIC_Stop(); //产生一个停止条件
delay_ms(10);
}
//设置PCF8574某个IO的高低电平
//bit:要设置的IO编号,0~7
//sta:IO的状态;0或1
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); //写入新的数据
}
//读取PCF8574的某个IO的值
//bit:要读取的IO编号,0~7
//返回值:此IO的值,0或1
u8 PCF8574_ReadBit(u8 bit)
{
u8 data;
data=PCF8574_ReadOneByte(); //先读取这个8位IO的值
if(data&(1<<bit))return 1;
else return 0;
}
到了这里,关于24.STM32的IO口扩展PCF8574的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!