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);   //设置时钟,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文件

#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;   
}  
    

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值