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();                     //初始化HAL库   Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhzdelay_init(180);                //初始化延时函数uart_init(115200);              //初始化USARTLED_Init();                     //初始化LED KEY_Init();                     //初始化按键SDRAM_Init();                   //初始化SDRAMLCD_Init();                     //初始化LCDPOINT_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文件

#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;           //PB12GPIO_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相关推荐

  1. STM32基于IIC控制E2PROM和io口扩展

    stm32的IIC 软件模拟和硬件的区别 IIC是常用的半双工总线,用来传递数据,好像st公司为了不交钱,自己做的IIC绕开了飞利浦的协议,但是不是很稳定,所以这次使用软件来模仿IIC的通信 其实都一 ...

  2. STM32的IO口有幺蛾子(bug)

    在做最近的项目时,我发现一个这样的问题:对STM32中的IO进行配置(以对B系列下的PB10.PB13配置成输出模式为例),即使在配置参数一样的情况下,这两个IO输出能力还是有很大的差别. 情况一:如 ...

  3. stm32的IO口的复用功能(即AFIO)

    关于stm32的IO口的复用功能,可以参考这篇博客,写的不错. https://blog.csdn.net/u013082827/article/details/77543394

  4. STM32芯片IO口的配置以及上拉下拉电阻介绍(一)

    STM32芯片IO口的配置以及上拉下拉电阻介绍(一) IO口常见的配置方式 推挽输出 开漏输出 STM32芯片做硬件研发的朋友们都知道.但是还是有很多做硬件的新朋友"只知其然而不知其所然&q ...

  5. 利用CD4051模拟开关芯片实现IO口扩展

    利用CD4051模拟开关芯片实现IO口扩展 1.CD4051介绍 详细信息参考:TI CD4051 Datasheet 可将其理解为单刀8掷开关,原理如图: 用三个IO控制A,B,C地址脚,可实现3脚 ...

  6. 单片机IO口扩展方法

    单片机IO口扩展方法 1.使用分压电阻分压,然后用单片机的ADC端口读取不同的电压值.适合应用于多个按键的方案,需要多个输入端口,导致GPIO不够用的情况. 使用串入并出芯片(serial-in, p ...

  7. STM32中IO口的8中工作模式

    该文摘自:http://blog.csdn.net/kevinhg/article/details/17490273 一.推挽输出:可以输出高.低电平,连接数字器件:推挽结构一般是指两个三极管分别受两 ...

  8. 51单片机之IO口扩展——74HC165芯片并行转串行实验

    我们都知道通信从大的方面有两种:串行和并行.串行的最大优点是占用总线少,但是传输速率低:并行恰恰相反,占用总线多,传输速率高.市面上有很多这样的芯片,有串入并出的(通俗讲就是 一个一个进,最后一块出来 ...

  9. stm32、IO口、中断、串口、定时器讲解

    目录 一.IO口的八种模式 二.IO口的配置 三.外部中断配置 四.串口配置 五.定时器配置 六.项目 一.IO口的八种模式 输入 浮空输入:浮空,顾名思义,就相当与此端口在默认情况下什么都不接,呈高 ...

最新文章

  1. IOS开发笔记10-Object-C中的对象
  2. sqlyog要先安装mysql_MySQL和SQLyog的配置-安装及遇到的问题
  3. 远程执行本地查找文件的命令并返回结果
  4. 做这行的,一定要会修电脑!
  5. 51nod 1536不一样的猜数游戏 思路:O(n)素数筛选法。同Codeforces 576A Vasya and Petya‘s Game。
  6. 五种I/O模型的性能分析
  7. 交换机的质量害死人呀!
  8. dokcer 容器启动报错
  9. 【小白冲冲冲!!!】补2:SLAM中最小二乘问题的引入及求解
  10. 图书管理系统源码,图书管理系统开发,图书借阅系统源码一
  11. 监督学习的基本假设——联合概率分布,独立同分布
  12. 20220906_C52单片机学习笔记 | LED闪烁
  13. git 报错did not match any file(s) known to git
  14. lumion鸟瞰图---制作心得
  15. 推荐几张系统维护光盘
  16. 集成calibre到cadence virtuoso环境中 load: can‘t access file - “/opt/eda/Mentor/lib/calibre.skl“
  17. so easy! 10行代码写个狗屁不通文章生成器
  18. R语言ggplot2 | 如何自定义facet分面的坐标轴范围
  19. 石溪分校 计算机研究生专业,纽约州立大学石溪分校计算机科学硕士入学条件.pdf...
  20. 物联网(IOT)之常见物联网通信技术概览-无线篇①

热门文章

  1. 仿射密码之加解密及破解
  2. 推荐几款实现内网穿透的实用工具(转载)
  3. OpenFlow Tutorial
  4. 卸载NotePad++/SublimeText吧:VSCode才是史上最优秀的IDE编辑器
  5. Linux shell 用sed删除第一行、最后一行或增加删除某行
  6. 电脑开机就黑屏的几种原因以及解决方案
  7. 10+编程语言实现云笔记
  8. html 文本换行 \n 不换行 空格无效
  9. nodejs安装、解决下载速度慢、idea中用node引入vue
  10. Shiro 权限管理