24.STM32的IO口扩展PCF8574
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相关推荐
- STM32基于IIC控制E2PROM和io口扩展
stm32的IIC 软件模拟和硬件的区别 IIC是常用的半双工总线,用来传递数据,好像st公司为了不交钱,自己做的IIC绕开了飞利浦的协议,但是不是很稳定,所以这次使用软件来模仿IIC的通信 其实都一 ...
- STM32的IO口有幺蛾子(bug)
在做最近的项目时,我发现一个这样的问题:对STM32中的IO进行配置(以对B系列下的PB10.PB13配置成输出模式为例),即使在配置参数一样的情况下,这两个IO输出能力还是有很大的差别. 情况一:如 ...
- stm32的IO口的复用功能(即AFIO)
关于stm32的IO口的复用功能,可以参考这篇博客,写的不错. https://blog.csdn.net/u013082827/article/details/77543394
- STM32芯片IO口的配置以及上拉下拉电阻介绍(一)
STM32芯片IO口的配置以及上拉下拉电阻介绍(一) IO口常见的配置方式 推挽输出 开漏输出 STM32芯片做硬件研发的朋友们都知道.但是还是有很多做硬件的新朋友"只知其然而不知其所然&q ...
- 利用CD4051模拟开关芯片实现IO口扩展
利用CD4051模拟开关芯片实现IO口扩展 1.CD4051介绍 详细信息参考:TI CD4051 Datasheet 可将其理解为单刀8掷开关,原理如图: 用三个IO控制A,B,C地址脚,可实现3脚 ...
- 单片机IO口扩展方法
单片机IO口扩展方法 1.使用分压电阻分压,然后用单片机的ADC端口读取不同的电压值.适合应用于多个按键的方案,需要多个输入端口,导致GPIO不够用的情况. 使用串入并出芯片(serial-in, p ...
- STM32中IO口的8中工作模式
该文摘自:http://blog.csdn.net/kevinhg/article/details/17490273 一.推挽输出:可以输出高.低电平,连接数字器件:推挽结构一般是指两个三极管分别受两 ...
- 51单片机之IO口扩展——74HC165芯片并行转串行实验
我们都知道通信从大的方面有两种:串行和并行.串行的最大优点是占用总线少,但是传输速率低:并行恰恰相反,占用总线多,传输速率高.市面上有很多这样的芯片,有串入并出的(通俗讲就是 一个一个进,最后一块出来 ...
- stm32、IO口、中断、串口、定时器讲解
目录 一.IO口的八种模式 二.IO口的配置 三.外部中断配置 四.串口配置 五.定时器配置 六.项目 一.IO口的八种模式 输入 浮空输入:浮空,顾名思义,就相当与此端口在默认情况下什么都不接,呈高 ...
最新文章
- IOS开发笔记10-Object-C中的对象
- sqlyog要先安装mysql_MySQL和SQLyog的配置-安装及遇到的问题
- 远程执行本地查找文件的命令并返回结果
- 做这行的,一定要会修电脑!
- 51nod 1536不一样的猜数游戏 思路:O(n)素数筛选法。同Codeforces 576A Vasya and Petya‘s Game。
- 五种I/O模型的性能分析
- 交换机的质量害死人呀!
- dokcer 容器启动报错
- 【小白冲冲冲!!!】补2:SLAM中最小二乘问题的引入及求解
- 图书管理系统源码,图书管理系统开发,图书借阅系统源码一
- 监督学习的基本假设——联合概率分布,独立同分布
- 20220906_C52单片机学习笔记 | LED闪烁
- git 报错did not match any file(s) known to git
- lumion鸟瞰图---制作心得
- 推荐几张系统维护光盘
- 集成calibre到cadence virtuoso环境中 load: can‘t access file - “/opt/eda/Mentor/lib/calibre.skl“
- so easy! 10行代码写个狗屁不通文章生成器
- R语言ggplot2 | 如何自定义facet分面的坐标轴范围
- 石溪分校 计算机研究生专业,纽约州立大学石溪分校计算机科学硕士入学条件.pdf...
- 物联网(IOT)之常见物联网通信技术概览-无线篇①