自己做了一块74HC595的IO扩展板卡,出于灵活考虑,没有都采用级联的方式,而是2组多芯片级联的结构。基于STM32平台设计。
结构示意图
74HV595内部结构图
头文件:
#ifndef __74HC595_H__
#define __74HC595_H__
#include "main.h"
typedef struct{
GPIO_TypeDef* GPIOx;
uint16_t GPIO_Pin;
}strHC595_Port;
//非级联74HC595芯片组数
#define HC595_GROUP_NUMBER 2
/* 第一组芯片 */
//使能
#define HC595_OE1_RCC_GPIOX_EN __HAL_RCC_GPIOA_CLK_ENABLE()
#define HC595_OE1_GPIO GPIOA
#define HC595_OE1_PIN GPIO_PIN_4
//锁存
#define HC595_RCLK1_RCC_GPIOX_EN __HAL_RCC_GPIOA_CLK_ENABLE()
#define HC595_RCLK1_GPIO GPIOA
#define HC595_RCLK1_PIN GPIO_PIN_6
//时钟
#define HC595_SRCLK1_RCC_GPIOX_EN __HAL_RCC_GPIOA_CLK_ENABLE()
#define HC595_SRCLK1_GPIO GPIOA
#define HC595_SRCLK1_PIN GPIO_PIN_7
//清除
#define HC595_SRCLR1_RCC_GPIOX_EN __HAL_RCC_GPIOA_CLK_ENABLE()
#define HC595_SRCLR1_GPIO GPIOA
#define HC595_SRCLR1_PIN GPIO_PIN_5
//数据
#define HC595_DATA1_RCC_GPIOX_EN __HAL_RCC_GPIOC_CLK_ENABLE()
#define HC595_DATA1_GPIO GPIOC
#define HC595_DATA1_PIN GPIO_PIN_4
/* 第二组芯片 */
//使能
#define HC595_OE2_RCC_GPIOX_EN __HAL_RCC_GPIOA_CLK_ENABLE()
#define HC595_OE2_GPIO GPIOB
#define HC595_OE2_PIN GPIO_PIN_3
//锁存
#define HC595_RCLK2_RCC_GPIOX_EN __HAL_RCC_GPIOB_CLK_ENABLE()
#define HC595_RCLK2_GPIO GPIOB
#define HC595_RCLK2_PIN GPIO_PIN_5
//时钟
#define HC595_SRCLK2_RCC_GPIOX_EN __HAL_RCC_GPIOB_CLK_ENABLE()
#define HC595_SRCLK2_GPIO GPIOB
#define HC595_SRCLK2_PIN GPIO_PIN_6
//清除
#define HC595_SRCLR2_RCC_GPIOX_EN __HAL_RCC_GPIOB_CLK_ENABLE()
#define HC595_SRCLR2_GPIO GPIOB
#define HC595_SRCLR2_PIN GPIO_PIN_4
//数据
#define HC595_DATA2_RCC_GPIOX_EN __HAL_RCC_GPIOB_CLK_ENABLE()
#define HC595_DATA2_GPIO GPIOB
#define HC595_DATA2_PIN GPIO_PIN_7
extern void HC595_Init(void);
extern uint8_t HC595_write(uint8_t group,uint8_t nbit,uint32_t datas);
#endif /*__74HC595_H__*/
源文件:
#include "74HC595.h"
strHC595_Port HC595_OE_Port[HC595_GROUP_NUMBER]=
{
{HC595_OE1_GPIO,HC595_OE1_PIN},
{HC595_OE2_GPIO,HC595_OE2_PIN},
//元素个数与HC595_GROUP_NUMBER对应
};
strHC595_Port HC595_RCLK_Port[HC595_GROUP_NUMBER]=
{
{HC595_RCLK1_GPIO,HC595_RCLK1_PIN},
{HC595_RCLK2_GPIO,HC595_RCLK2_PIN},
//元素个数与HC595_GROUP_NUMBER对应
};
strHC595_Port HC595_SRCLK_Port[HC595_GROUP_NUMBER]=
{
{HC595_SRCLK1_GPIO,HC595_SRCLK1_PIN},
{HC595_SRCLK2_GPIO,HC595_SRCLK2_PIN},
//元素个数与HC595_GROUP_NUMBER对应
};
strHC595_Port HC595_SRCLR_Port[HC595_GROUP_NUMBER]=
{
{HC595_SRCLR1_GPIO,HC595_SRCLR1_PIN},
{HC595_SRCLR2_GPIO,HC595_SRCLR2_PIN},
//元素个数与HC595_GROUP_NUMBER对应
};
strHC595_Port HC595_DATA_Port[HC595_GROUP_NUMBER]=
{
{HC595_DATA1_GPIO,HC595_DATA1_PIN},
{HC595_DATA2_GPIO,HC595_DATA2_PIN},
//元素个数与HC595_GROUP_NUMBER对应
};
//操作接口宏定义
#define HC595_OE_PIN(X) HC595_OE_Port[X].GPIO_Pin
#define HC595_OE_GPIO(X) HC595_OE_Port[X].GPIOx
#define HC595_OE_H(X) HAL_GPIO_WritePin(HC595_OE_GPIO(X), HC595_OE_PIN(X), GPIO_PIN_SET)
#define HC595_OE_L(X) HAL_GPIO_WritePin(HC595_OE_GPIO(X), HC595_OE_PIN(X), GPIO_PIN_RESET)
#define HC595_RCLK_PIN(X) HC595_RCLK_Port[X].GPIO_Pin
#define HC595_RCLK_GPIO(X) HC595_RCLK_Port[X].GPIOx
#define HC595_RCLK_H(X) HAL_GPIO_WritePin(HC595_RCLK_GPIO(X), HC595_RCLK_PIN(X), GPIO_PIN_SET)
#define HC595_RCLK_L(X) HAL_GPIO_WritePin(HC595_RCLK_GPIO(X), HC595_RCLK_PIN(X), GPIO_PIN_RESET)
#define HC595_SRCLK_PIN(X) HC595_SRCLK_Port[X].GPIO_Pin
#define HC595_SRCLK_GPIO(X) HC595_SRCLK_Port[X].GPIOx
#define HC595_SRCLK_H(X) HAL_GPIO_WritePin(HC595_SRCLK_GPIO(X), HC595_SRCLK_PIN(X), GPIO_PIN_SET)
#define HC595_SRCLK_L(X) HAL_GPIO_WritePin(HC595_SRCLK_GPIO(X), HC595_SRCLK_PIN(X), GPIO_PIN_RESET)
#define HC595_SRCLR_PIN(X) HC595_SRCLR_Port[X].GPIO_Pin
#define HC595_SRCLR_GPIO(X) HC595_SRCLR_Port[X].GPIOx
#define HC595_SRCLR_H(X) HAL_GPIO_WritePin(HC595_SRCLR_GPIO(X), HC595_SRCLR_PIN(X), GPIO_PIN_SET)
#define HC595_SRCLR_L(X) HAL_GPIO_WritePin(HC595_SRCLR_GPIO(X), HC595_SRCLR_PIN(X), GPIO_PIN_RESET)
#define HC595_DATA_PIN(X) HC595_DATA_Port[X].GPIO_Pin
#define HC595_DATA_GPIO(X) HC595_DATA_Port[X].GPIOx
#define HC595_DATA_H(X) HAL_GPIO_WritePin(HC595_DATA_GPIO(X), HC595_DATA_PIN(X), GPIO_PIN_SET)
#define HC595_DATA_L(X) HAL_GPIO_WritePin(HC595_DATA_GPIO(X), HC595_DATA_PIN(X), GPIO_PIN_RESET)
void HC595_delay_us(uint8_t t_us)
{
//修改为系统中对应的微秒级延时函数,根据实际需求可以换成更小的ns级延时
delay_us(t_us);
}
/*
*描述:初始化HC595_GROUP_NUMBER组芯片对应的控制引脚
*/
void HC595_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
uint8_t i = 0;
/* GPIO Ports Clock Enable */
//第一组芯片引脚时钟
HC595_OE1_RCC_GPIOX_EN;
HC595_RCLK1_RCC_GPIOX_EN;
HC595_SRCLK1_RCC_GPIOX_EN;
HC595_SRCLR1_RCC_GPIOX_EN;
HC595_DATA1_RCC_GPIOX_EN;
//第二组芯片引脚时钟
HC595_OE2_RCC_GPIOX_EN;
HC595_RCLK2_RCC_GPIOX_EN;
HC595_SRCLK2_RCC_GPIOX_EN;
HC595_SRCLR2_RCC_GPIOX_EN;
HC595_DATA2_RCC_GPIOX_EN;
/*Configure GPIO pin */
for(i=0; i
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
STM32
+关注
关注
2256文章
10821浏览量
352367 -
时钟
+关注
关注
10文章
1665浏览量
130938 -
GPIO
+关注
关注
16文章
1168浏览量
51503 -
74HC595
+关注
关注
7文章
189浏览量
30680 -
扩展板卡
+关注
关注
0文章
2浏览量
1182
发布评论请先 登录
相关推荐
74HC595芯片的作用是什么
74HC595是在单片机系统中常用的芯片之一他的作用就是把串行的信号转为并行的信号,常用在各种数码管以及点阵屏的驱动芯片, 使用74HC595可以节约单片机mcu的io口资源,用3个io
发表于 07-22 07:05
单片机IO直连控制74HC595
最近在调74HC595,单片机IO直连控制74HC595,单片机输出3.3v, 而74HC595是5v供电。发现74HC595输出时好时坏,
发表于 12-02 07:20
74HC595怎么使用
一、74HC595使用方法74HC595的数据端Q0--Q7:八位并行输出端,可以直接控制数码管的8个段。Q7:级联输出端。将它接下一个595的DS端。DS:串行数据输入端,级联的话接上一级的Q7
发表于 12-07 06:46
如何实现74HC595驱动数码管显示
4、数码管显示数码管驱动电路采用2片74HC595芯片进行IO扩展,仅仅只需3Pin即可驱动需要16位引脚的数码管。74HC595是一个8位串行输入、并行输出的位移缓存器。只有对
发表于 12-07 07:29
74HC595多组芯片多组级联代码分享
自己做了一块74HC595的IO扩展板卡,出于灵活考虑,没有都采用级联的方式,而是2组多芯片级联的结构。基于STM32平台设计。结构示意图7
发表于 12-07 06:43
MCU驱动74hc595的方法
MCU驱动74hc595下图关于595数据手册上的介绍,使用比较简单两片级联控制扩展IO输出端口,可以用最少三个GPIO控制16路输出单片机驱动59
发表于 02-08 06:04
IO口扩展芯片74HC165和74HC595的使用实例代码免费下载
IO口扩展芯片,主要是解决单片机IO口太少。 74HC165:数据从并转串 74HC595:数据从串转并两种芯片,都是通过时序电路,加上移
发表于 09-19 17:20
•51次下载
74HC595 3.3V 单片机 驱动继电器
最近在调74HC595,单片机IO直连控制74HC595,单片机输出3.3v, 而74HC595是5v供电。将 74HC595改成3.3V供
发表于 11-23 17:36
•31次下载
74HC595多组芯片多组级联代码
自己做了一块74HC595的IO扩展板卡,出于灵活考虑,没有都采用级联的方式,而是2组多芯片级联的结构。基于STM32平台设计。结构示意图7
发表于 11-24 10:51
•58次下载
MCU驱动74hc595
MCU驱动74hc595下图关于595数据手册上的介绍,使用比较简单两片级联控制扩展IO输出端口,可以用最少三个GPIO控制16路输出单片机驱动59
发表于 12-05 10:36
•61次下载
评论