单片机 STM32 HAL PCF8574 例子代码
#include "extgpio.h"
#include "pcf8574.h"
#include "74hc595.h"
/******************
笔记:
1、X输入 Y输出
2、NPN(箭头向下)高电平时导通,PNP(箭头向上)低电平时导通;
3、PCF8574 IIC通讯 8个双向引脚 利用IIC引脚可写可读
4、74HC595 自带协议 8个单向引脚 引脚可写不可读
*******************/#define FREE_CONTROL 0 //释放气缸控制权 (1 释放 0 不释放)const IIC_PIN pcf8574[3] =
{{.SCL_PORT = IIC_SCL_GPIO_Port,.SCL_PIN = IIC_SCL_Pin,.SDA_PORT = IIC_SDA_GPIO_Port,.SDA_PIN = IIC_SDA_Pin,.DelayTick = 10,.ADDR = 0x42 //详细见PCF8574寻址},{.SCL_PORT = IIC_SCL_GPIO_Port,.SCL_PIN = IIC_SCL_Pin,.SDA_PORT = IIC_SDA_GPIO_Port,.SDA_PIN = IIC_SDA_Pin,.DelayTick = 10,.ADDR = 0x44},{.SCL_PORT = IIC_SCL_GPIO_Port,.SCL_PIN = IIC_SCL_Pin,.SDA_PORT = IIC_SDA_GPIO_Port,.SDA_PIN = IIC_SDA_Pin,.DelayTick = 10,.ADDR = 0x46}
};const T_GPIO_TYPE INPUT_PINS[8] = //输入端子板(内部)
{{.port = GPIOB, .pin = GPIO_PIN_12},{.port = GPIOB, .pin = GPIO_PIN_13},{.port = GPIOB, .pin = GPIO_PIN_14},{.port = GPIOB, .pin = GPIO_PIN_15},{.port = GPIOC, .pin = GPIO_PIN_6},{.port = GPIOC, .pin = GPIO_PIN_7},{.port = GPIOC, .pin = GPIO_PIN_8},{.port = GPIOA, .pin = GPIO_PIN_11}
};const T_GPIO_TYPE OUTPUT_PINS[6] = //输出端子板
{{.port = GPIOC, .pin = GPIO_PIN_5},{.port = GPIOC, .pin = GPIO_PIN_4},{.port = GPIOA, .pin = GPIO_PIN_7},{.port = GPIOA, .pin = GPIO_PIN_6},{.port = GPIOA, .pin = GPIO_PIN_5},{.port = GPIOA, .pin = GPIO_PIN_4}
};const T_GPIO_TYPE id_pin[4] = //单板地址拨码选择
{{.port = GPIOA, .pin = GPIO_PIN_12},{.port = GPIOB, .pin = GPIO_PIN_4},{.port = GPIOB, .pin = GPIO_PIN_8},{.port = GPIOB, .pin = GPIO_PIN_9}
};U_INPUT IN;
U_OUTPUT OUT;/******************************
函数名:init_ext_gpio
功 能:初始化外部gpio器件
形 参:无
返回值:
备 注:74HC595器件 3位输入 8位输出
*******************************/
void init_ext_gpio(void)
{hc595Init(&hc595);
}/******************************
函数名:get_gpio_pins
功 能:读取内外部输入引脚的状态
形 参:pin--内外引脚的信息结构体
返回值:无,信息将直接赋予 结构体pin
备 注:
*******************************/
void get_gpio_pins(U_INPUT *pin)
{uint8_t i, XIN = 0;/*读外部扩展板PCF8574引脚*/for(i = 0; i < 3; i++){PCF8574ReadByte(&pcf8574[i], &pin->pin.EX[i]);}/*读内部MUC引脚*/for(i = 0; i < 8; i++){XIN >>= 1;if(HAL_GPIO_ReadPin(INPUT_PINS[i].port, INPUT_PINS[i].pin) == GPIO_PIN_RESET){XIN &= ~0x80;}else{XIN |= 0x80;}}pin->pin.X = XIN;
}/******************************
函数名:set_gpio_pins
功 能:设置74HC595的端口及MUC输出引脚状态
形 参:pout--内外引脚的状态结构体
返回值:无
备 注:
*******************************/
void set_gpio_pins(U_OUTPUT *pout)
{uint8_t i, XOUT;/*向74HC595发送引脚状态*/hc595WriteStr(&hc595, &pout->pin.EY[0], 3);XOUT = pout->pin.Y;for(i = 0; i < 6; i++){HAL_GPIO_WritePin(OUTPUT_PINS[i].port, OUTPUT_PINS[i].pin, XOUT & 0x01 ? GPIO_PIN_SET : GPIO_PIN_RESET);XOUT >>= 1;}
}/******************************
函数名:read_board_id
功 能:读取板子拨码开关状态
形 参:无
返回值:id--开关状态
备 注:此处默认拨码开关低电平有效,所以变量采用1作为有效位。
*******************************/
uint8_t read_board_id(void)
{uint8_t id, i;id = 0;for(i = 0; i < 4; i++){id >>= 1;if(HAL_GPIO_ReadPin(id_pin[i].port, id_pin[i].pin) == GPIO_PIN_RESET){id |= 0x08; //0000 1000}}return id;
}/******************************
函数名:get_led_state
功 能:获取外部扩展板的输出引脚
形 参:pout--引脚信息结构体 pled--外部引脚状态
返回值:0
备 注:引脚状态字节,低6位有效
*******************************/
uint8_t get_led_state(const U_OUTPUT *pout, uint8_t *pled)
{uint8_t i;for(i = 0; i < 6; i++){*pled++ = pout->pin.EY[i];}return 0;
}
#ifndef __EXT_GPIO_HEADER__
#define __EXT_GPIO_HEADER__
#include "main.h"typedef struct
{GPIO_TypeDef* port;uint16_t pin;
} T_GPIO_TYPE;typedef union
{uint8_t input[4];struct{uint8_t EX[3]; //棍꼬多신uint8_t X; //코꼬多신} pin;uint32_t data;
} U_INPUT;typedef union
{uint8_t output[4];struct{uint8_t EY[3]; //棍꼬多신uint8_t Y; //코꼬多신} pin;uint32_t data;
} U_OUTPUT;extern U_INPUT IN;
extern U_OUTPUT OUT;
void init_ext_gpio(void);
void get_gpio_pins(U_INPUT *pin);
void set_gpio_pins(U_OUTPUT *pout);
uint8_t read_board_id(void);
uint8_t get_led_state(const U_OUTPUT *pout, uint8_t *pled);
#endif
单片机 STM32 HAL PCF8574 例子代码相关推荐
- 单片机 MM32 HAL 74hc595 例子 代码
#include "74hc595.h"/****************** 功 能:定义HC595的功能引脚 备 注:变更引脚,由MX配置完成 **************** ...
- 温湿度传感器驱动SHT85 单片机STM32 HAL库
功能介绍:读取传感器SHT85数据,转换成温度.湿度 .饱和水蒸气含量. 注意事项: SDA脚设置为开漏输出,外部上拉电阻10k.或者设置成推挽,软件切换SDA输入输出. 调试时可适当加长延时时间. ...
- VL53L0x TOF激光测距的 stm32 HAL库驱动代码
VL53L0x 是ST公司生成的 TOF激光测距传感器,得益于非常小巧的尺寸,很容易放入手机.无人机中,提供更加精准.稳定的测距方式. 本文代码,使用 STM32F4xx的 HAL库. VL53L0x ...
- 单片机 STM32 HAL 网络模块 ENC28J60
文章目录 一. 简介 二.特性 三.示例代码 一. 简介 ENC28J60 是带有行业标准串行外设接口(Serial Peripheral Interface,SPI)的独立以太网控制器.它可作为任何 ...
- 单片机 STM32 HAL 射频读卡器 RC522
1.CubeMX 定义任意两个引脚,作为复位脚和片选脚,并对引脚作出如下配置: GPlO output level --High GPIO mode --Output Open Drain GPIO ...
- 单片机 STM32 HAL IO扩展 PCA9555
描述 这个用于两线双向总线(I 2 C)的16位扩展器设计用于2.3V至5.5VV CC 运行.通过I 2 C接口[串行时钟(SCL),串行数据(SDA)],它为大多数微控制器系列产品提供通用远程I ...
- 单片机 STM32 HAL 步进电机 Motor
/*************笔记**************** 1.CubeMX 定义任意四个引脚,作为ABCD相,并对引脚作出如下配置:GPlO output level --HighGPIO m ...
- 单片机 STM32 HAL 温湿度 DS18B20
/*************笔记**************** 1.CubeMX 定义任意一个引脚,作为数据脚,并对引脚作出如下配置:GPlO output level --LOWGPIO mode ...
- 单片机 STM32 HAL 液晶屏 LCD16032
笔记: 1.采用串行输出 2.器件 [16 NC(PSB)]引脚需要接地, H:并口通信 L:串口通信 3.LCD_CS_Pin LCD_CS_GPIO_Port //片选控制,0,无效 1有效 LC ...
最新文章
- 生活只是需要一种积极的态度
- 萌新发问:MyBatis日志到底是如何做到兼容所有常用日志框架的?
- 游戏中的整容术! 《Honey Select》捏人系统剖析
- python将小时数换成分钟_如何在Python中将datetime.timedelta转换为分钟、小时?
- Java 栈的存储过程
- 接口可以继承抽象类吗_Python接口类的多继承以及抽象类的单继承
- 我用Python帮朋友做了张猪肉数据分析图,结果。。。
- 总奖金7万美金,Kaggle近期可报名赛事,语音识别、图像识别分类领域
- cisco学习笔记(2)
- 【java学习之路】(java SE篇)009.IO
- 如何查看注解实现_SpringBoot的注解@ConditonOnClass注解是如何实现的?
- 构建QML项目报错:No rule to make target ‘**‘, needed by ‘debug/qrc_qml.cpp‘.
- AD选择板边覆铜教程
- 电脑中病毒以后,如何删掉右键残留的菜单
- 推荐多款好看的报表图表配色方案(转载)
- nova computer对instance的shut off
- C#随机生成姓名、电话类
- 手动连接wifi失败分析
- 走进音视频的世界——剖析exo播放器架构
- python模拟登录钉钉,Python—实现钉钉后台开发
热门文章
- 【数据科学】01 数据科学概述
- linux内核基本模型,Linux设备模型(1)_基本概念
- 高中数学必修二立体几何中的向量方法(经典案例讲解)
- 计算机相关专业提升学历的解决方案(本科及以下)
- 阿里内部隐藏「P」序列职级,「高P」光环或成过去式
- SpringBoot之模板引擎
- 学堂在线-清华大学-操作系统实验Lab1【练习5-6】
- LeetCode ---Fizz和Buzz
- .wine/drive_c/users/Public/Application Data/Source Insight/4.0
- 【181101】VC++电子地图绘制工具源代码