超详细的74HC595应用指南(以stm32控制点阵屏为例子)

74HC595是一款常用的串行输入/并行输出(Serial-in/Parallel-out)移位寄存器芯片,在数字电子领域有着广泛的应用。它具有简单的接口和高效的扩展能力,成为了许多电子爱好者和工程师们的首选之一。本文将深入介绍74HC595芯片的功能、应用场景以及工作原理。
在这里插入图片描述

文章目录

    • 一、功能概述:
    • 二、芯片的基本介绍
    • 三、引脚及功能
    • 四、内部结构和原理
      • 内部结构:
      • 实现原理:
    • 五、多个74HC595级联
      • 连接图:
      • 连接步骤:
    • 六、点阵屏
      • 连接图:
      • 控制流程:
      • 使用STM32F103控制点阵屏
        • 1. 硬件连接:
        • 2. 控制逻辑:
        • 3. 示例代码:
    • 七、应用场景

一、功能概述:

平时我们需要实现使用单片机点亮一个LED灯,那就要使用一个配置一个单片机的GPIO口输出高电平,但是点阵屏大到广告屏少说也有几百个LED灯,先不说浪费引脚的问题,单是单片机是否有这么多个GPIO口,这种情况下74HC595就派上用场了,它可以将串行的数据输出转化成并行输出的形式,这就使用1个GPIO口就可以控制8个LED,经过级联可以实现更少的IO口,这就是这个芯片最简单,也是最广泛的应用。

二、芯片的基本介绍

74HC595芯片是一种8位移位寄存器,可以通过串行数据输入的方式将数据存储在内部的寄存器中,并通过并行数据输出的方式将数据输出到相应的输出引脚上。它还具有级联能力,可以通过多个芯片级联扩展输出位数。它的主要功能包括:

  1. 8位移位寄存器:可以存储8位二进制数据。
  2. 串行数据输入:通过SER引脚输入数据。
  3. 时钟输入:通过SRCLK引脚提供时钟信号。
  4. 数据锁存:通过RCLK引脚锁存数据。
  5. 并行数据输出:通过QA~QH引脚输出数据。

三、引脚及功能

引脚及其功能
以下是74HC595芯片的引脚及其功能的详细说明:

  1. VCC (Pin 16):

    • 功能: 正电源引脚,用于给芯片供电。
    • 连接: 将此引脚连接到正电源(通常为+5V)。
  2. GND (Pin 8):

    • 功能: 地引脚,为芯片提供电路共同的参考地。
  3. SER (Pin 14):

    • 功能: 串行输入引脚,用于输入要移位的数据。
    • 连接: 将此引脚连接到微控制器或其他输出源的数据引脚。
  4. SRCLK (Pin 11):

    • 功能: 移位寄存器时钟引脚,用于控制数据移位。
    • 连接: 将此引脚连接到微控制器或其他控制源的时钟引脚。
  5. RCLK (Pin 12):

    • 功能: 输出寄存器时钟引脚,用于锁存数据并输出到输出引脚。
    • 连接: 将此引脚连接到微控制器或其他控制源的时钟引脚。
  6. QA-QH (Pins 15-1):

    • 功能: 并行输出引脚,输出锁存的数据。
    • 连接: 这些引脚连接到目标设备,例如LED点阵屏或其他外部设备的行选引脚。
  7. OE (Pin 13):

    • 功能: 输出使能引脚,用于控制输出引脚的使能状态。
    • 连接: 根据设计需求,将此引脚连接到高电平或低电平,以使输出引脚处于使能或禁用状态。

四、内部结构和原理

内部结构:

74HC595芯片由一个移位寄存器和一个输出寄存器组成。移位寄存器用于接收串行输入数据并进行位移操作,输出寄存器用于锁存移位寄存器中的数据并提供并行输出。
在这里插入图片描述

实现原理:

在这里插入图片描述

  1. 数据输入:

    • 串行输入:输入数据通过SER引脚以串行方式输入到移位寄存器中。
    • 时钟信号:SRCLK引脚提供时钟信号,当信号上升沿到达时,移位寄存器中的数据将进行位移操作。
  2. 数据位移:

    • 移位操作:在每个时钟脉冲上升沿时,移位寄存器中的数据向左移动一位,新的数据从SER引脚输入并进入移位寄存器的最低位。
    • 串行输入:通过连续的位移操作,数据位逐渐从SER引脚传递到移位寄存器的高位。
  3. 数据锁存和并行输出:

    • 数据锁存:当需要锁存数据时,使用RCLK引脚提供一个时钟信号。在信号上升沿到达时,移位寄存器中的数据将被锁存到输出寄存器中。
    • 并行输出:输出寄存器中的数据通过并行输出引脚(QA~QH)提供,并可连接到外部设备,如LED点阵屏。每个引脚对应输出寄存器中的一个位,其状态取决于锁存的数据。

通过该移位寄存器和输出寄存器结构,74HC595允许我们通过串行输入数据并通过逐位位移的方式控制并行输出引脚,实现对外部设备的控制。通过适时提供时钟信号,可以控制数据的输入、位移和输出锁存的时机,从而实现灵活的数据控制和显示效果。

五、多个74HC595级联

连接图:

在这里插入图片描述

连接步骤:

  1. 第一步:将第一个74HC595的QH'引脚(引脚9)连接到第二个74HC595的SER(引脚14)引脚,这将建立级联连接。

  2. 第二步:连接第一个74HC595的SRCLK(引脚11)RCLK(引脚12)引脚以及第二个74HC595的SRCLK(引脚11)引脚,以相同的时钟信号驱动两个芯片。

  3. 第三步:将第一个74HC595的QA-QH引脚(引脚15-1)连接到需要控制的8位输出设备的输入引脚。

  4. 第四步:将第二个74HC595的QA-QH引脚(引脚15-1)连接到另外8位输出设备的输入引脚。

  5. 第五步:分别连接每个74HC595的VCC引脚(引脚16)到正电源(通常为+5V),并将两者的GND引脚(引脚8)连接到共同的地线。

通过这种级联连接的方式,使用两枚74HC595芯片可以实现十六位输出控制。数据通过SER引脚串行输入到第一个芯片的移位寄存器,然后逐位向第二个芯片的移位寄存器传递。通过控制时钟信号,数据被移位和锁存到输出寄存器,并通过QA-QH引脚并行输出到外部设备。这样,您就可以通过编程控制和控制信号模式来控制这十六位输出设备的状态。

六、点阵屏

点阵屏是以逐行扫面的方式进行的,要不断刷新显示数据,间隔时间很少,所以在人眼上看就是同步进行的。

连接图:

在这里插入图片描述

控制流程:

控制LED点阵屏的基本流程如下:

  • 输入要显示的图案或字符的数据,通常使用一个8x8的二维数组存储。
  • 逐行遍历二维数组,按行输出数据到74HC595的SER引脚。
  • 在每次输出数据之前,通过SRCLK引脚提供一个上升沿时钟信号,将数据移位至寄存器。
  • 在所有数据输入完成后,通过RCLK引脚提供一个上升沿时钟信号,将数据锁存到寄存器中。
  • 通过级联的74HC595芯片,逐行输出控制LED点阵屏的行选引脚。
  • 在一定的时间间隔后,刷新显示下一行的数据,通过调节刷新速度可以实现持续的动画效果。

使用STM32F103控制点阵屏

1. 硬件连接:

  • 将STM32F103的相应引脚与74HC595芯片进行连接,例如将STM32F103的GPIO引脚连接到74HC595的SER(串行数据输入)、SRCLK(移位寄存器时钟)和RCLK(锁存寄存器时钟)引脚。
  • 将74HC595芯片的输出引脚(QA-QH)连接到LED点阵屏的行选和列选引脚。

2. 控制逻辑:

  • 准备要显示的图案或字符的编码数据,将其存储到适当的变量或数组中。
  • 编写逻辑代码来控制数据的传输和控制信号的生成,以实现位移寄存器和锁存寄存器的操作。
  • 使用适当的时钟信号触发数据的位移和锁存,使数据从移位寄存器移入到输出寄存器中,并在输出寄存器中锁定。
  • 使用GPIO引脚控制数据信号的传输和时钟信号的周期性触发。

3. 示例代码:

#include "stm32f10x.h"

// 定义74HC595芯片引脚连接
#define SER_PIN    GPIO_Pin_0
#define SRCLK_PIN  GPIO_Pin_1
#define RCLK_PIN   GPIO_Pin_2
#define GPIO_PORT  GPIOA

// 字符编码数据,使用负逻辑(低电平为亮)
const uint8_t font[][8] = {
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 空白字符
    {0x3E, 0x41, 0x41, 0x41, 0x41, 0x41, 0x3E, 0x00},  // 字母A
    // 添加更多字符的字模数据...
};

// 函数声明
void delay(uint32_t time);
void sendByte(uint8_t data);
void sendCommand(uint8_t cmd);
void sendData(uint8_t data);
void displayMatrix(const uint8_t matrix[8]);

int main(void) {
    // 初始化GPIO和时钟配置
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    GPIO_InitStructure.GPIO_Pin = SER_PIN | SRCLK_PIN | RCLK_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIO_PORT, &GPIO_InitStructure);

    while (1)
    {
        // 显示字符A
        displayMatrix(font[1]);
        delay(1000);  // 延时1秒
    }
}

// 延时函数
void delay(uint32_t time) {
    while (time--);
}

// 发送一个字节到74HC595芯片
void sendByte(uint8_t data) {
    uint8_t i;
    for (i = 0; i < 8; i++) {
        GPIO_ResetBits(GPIO_PORT, SRCLK_PIN);  // 时钟信号置低
        if ((data & 0x80) == 0x80)
            GPIO_SetBits(GPIO_PORT, SER_PIN);  // 输出数据为1
        else
            GPIO_ResetBits(GPIO_PORT, SER_PIN);  // 输出数据为0
        data <<= 1;
        GPIO_SetBits(GPIO_PORT, SRCLK_PIN);  // 时钟信号置高,数据移位
    }
}

// 发送命令到74HC595芯片(锁存数据)
void sendCommand(uint8_t cmd) {
    GPIO_ResetBits(GPIO_PORT, RCLK_PIN);  // 时钟信号置低
    sendByte(cmd);  // 发送数据
    GPIO_SetBits(GPIO_PORT, RCLK_PIN);  // 时钟信号置高,锁存数据
}

// 发送数据到74HC595芯片(显示数据)
void sendData(uint8_t data) {
    GPIO_SetBits(GPIO_PORT, RCLK_PIN);  // 时钟信号置高
    sendByte(data);  // 发送数据
    GPIO_ResetBits(GPIO_PORT, RCLK_PIN);  // 时钟信号置低
}

// 显示一个8x8点阵图案
void displayMatrix(const uint8_t matrix[8]) {
    uint8_t row;
    for (row = 0; row < 8; row++) {
        sendData(matrix[row]);
    }
}

七、应用场景

  1. 数码管驱动:通过级联多个74HC595芯片,可以实现大规模数码管的驱动,使用较少的GPIO引脚输出更多的信息。
  2. LED点阵控制:通过级联多个74HC595芯片,可以实现对LED点阵的控制,从而显示各种图像和文字。
  3. 扩展IO端口:通过级联多个74HC595芯片,可以有效地扩展单片机的IO端口,用于连接更多的外部设备。
  4. 按键输入:通过74HC595芯片的串行输入功能,可以实现连续多个按键的输入,减少单片机的引脚占用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/52104.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UE5、CesiumForUnreal加载无高度地形

文章目录 1.实现目标2.实现过程3.参考资料1.实现目标 在UE5中,CesiumForUnreal插件默认的地形都是带高度的,这里加载没有高度的地形,即大地高程为0,GIF动图如下: 2.实现过程 参考官方的教程,下载无高度的DEM,再切片加载到UE中。 (1)下载无高度地形DEM0。 在官方帖子…

网络安全(黑客)自学——从0开始

为什么学习黑客知识&#xff1f;有的人是为了耍酷&#xff0c;有的人是为了攻击&#xff0c;更多的人是为了防御。我觉得所有人都应该了解一些安全知识&#xff0c;了解基本的进攻原理。这样才可以更好的保护自己。这也是这系列文章的初衷。让大家了解基本的进攻与防御。 一、怎…

学习中遇到的好博客

c日志工具之——log4cpp ECU唤醒的本质就是给ECU供电。 小文件&#xff1a;零拷贝技术 传输大文件&#xff1a;异步 IO 、直接 IO&#xff1a;如何高效实现文件传输&#xff1a;小文件采用零拷贝、大文件采用异步io直接io (123条消息) Linux网络编程 | 彻底搞懂…

Pytest学习教程_装饰器(二)

前言 pytest装饰器是在使用 pytest 测试框架时用于扩展测试功能的特殊注解或修饰符。使用装饰器可以为测试函数提供额外的功能或行为。   以下是 pytest 装饰器的一些常见用法和用途&#xff1a; 装饰器作用pytest.fixture用于定义测试用例的前置条件和后置操作。可以创建可重…

6.2.tensorRT高级(1)-第一个完整的分类器程序

目录 前言1. CNN分类器2. 补充知识2.1 知识点2.2 智能指针封装 总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习 tensorRT …

【雕爷学编程】MicroPython动手做(13)——掌控板之RGB三色灯

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

第26天-秒杀服务(秒杀系统设计与实现)

1.秒杀设计 1.1.秒杀业务 秒杀具有瞬间高并发特点&#xff0c;针对这一特点&#xff0c;必须要做限流异步缓存&#xff08;页面静态化&#xff09;独立部署。 限流方式&#xff1a; 前端限流&#xff0c;一些高并发的网站直接在前端页面开始限流&#xff0c;例如&#xff1a…

vue项目环境 搭建

1、安装nodejs 2、安装vue-cli, npm i -g vue/cli-init 3、初始化项目 vue init webpack test 4、运行 cd test npm run dev

看完这篇 教你玩转渗透测试靶机Vulnhub——HarryPotter:Aragog(1.0.2)

Vulnhub靶机HarryPotter:Aragog渗透测试详解 Vulnhub靶机介绍&#xff1a;Vulnhub靶机下载&#xff1a;Vulnhub靶机安装&#xff1a;Vulnhub靶机漏洞详解&#xff1a;①&#xff1a;信息收集&#xff1a;②&#xff1a;漏洞发现&#xff1a;③&#xff1a;漏洞利用&#xff1a;…

解决eclipse 打开报错 An error has occurred. See the log file null.

解决eclipse 打开报错an error has ocurred. See the log file null 出现原因&#xff1a;安装了高版本的jdk,更换 jdk 版本&#xff0c;版本太高了。 解决方案&#xff1a;更改环境变量 改成 jkd 1.8

Flowable基础

简介 Flowable 是 BPMN 的一个基于 java 的软件实现&#xff0c;不过 Flowable 不仅仅包括 BPMN &#xff0c;还有 DMN 决策表和 CMMN Case 管理引擎&#xff0c;并且有自己的用户管理、微服务 API 等一系列功能&#xff0c; 是一个服务平台。 官方手册&#xff1a; https://…

05 http连接处理(中)

05 http连接处理&#xff08;中&#xff09; 流程图与状态机 从状态机负责读取报文的一行&#xff0c;主状态机负责对该行数据进行解析&#xff0c;主状态机内部调用从状态机&#xff0c;从状态机驱动主状态机 主状态机 三种状态&#xff0c;标识解析位置 CHECK_STATE_RE…

#P0999. [NOIP2008普及组] 排座椅

题目描述 上课的时候总会有一些同学和前后左右的人交头接耳&#xff0c;这是令小学班主任十分头疼的一件事情。不过&#xff0c;班主任小雪发现了一些有趣的现象&#xff0c;当同学们的座次确定下来之后&#xff0c;只有有限的 DD 对同学上课时会交头接耳。 同学们在教室中坐…

Spring源码(三)Spring Bean生命周期

Bean的生命周期就是指&#xff1a;在Spring中&#xff0c;一个Bean是如何生成的&#xff0c;如何销毁的 Bean生命周期流程图 1、生成BeanDefinition Spring启动的时候会进行扫描&#xff0c;会先调用org.springframework.context.annotation.ClassPathScanningCandidateCompo…

【Linux】进程轻松入门

目录 一&#xff0c; 冯* 诺依曼体系结构 1&#xff0c;存储结构 ​编辑 二&#xff0c; 操作系统 1&#xff0c;概念 2&#xff0c;设计OS的目的 3&#xff0c;定位 4&#xff0c;如何理解 "管理" 5&#xff0c; 总结 三&#xff0c;进程 1. 概念 那么…

通过clone的方式,下载huggingface中的大模型(git lfs install)

1、如图&#xff1a;可以手动一个个文件下载&#xff0c;但是那样太慢了&#xff0c;此时&#xff0c;可以点击下图圈起来的地方。 2、点击【Clone repository】&#xff0c;在命令行中&#xff0c;输入【git lfs install】&#xff08;安装了这个&#xff0c;才会下载大文件&a…

Windows 10 安装 PostgreSQL 12.x 报错 ‘psql‘ 不是内部或外部命令 由于找不到文件libintl-9.dll等问题

目录 序言一、问题总结问题 1 psql 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。问题 2 “由于找不到文件libintl-9.dll&#xff0c;无法继续执行代码&#xff0c;重新安装程序可能会解决此问题。“1、卸载2、安装3、安装 Stack Builder &#xff08;这个可…

深入学习 Redis - 深挖经典数据类型之 zset

目录 前言 一、zset 类型 1.1、操作命令 zadd / zrange&#xff08;添加 / 查询&#xff09; zcard&#xff08;个数&#xff09; zcount&#xff08;区间元素个数&#xff09; zrevrange&#xff08;逆序展示&#xff09; zrangebyscore&#xff08;按分数找元素&#…

Java框架学习(三)spring5高级49讲

文章目录 1、BeanFactory与ApplicationContext2、BeanFactory与ApplicationContext的容器实现BeanFactory的容器实现后处理器排序 ApplicationContext的容器实现 3、Bean的生命周期Bean后处理器 4、常见的Bean后处理器5、常见BeanFactory后处理器6、Aware和InitializingBean接口…

Element-plus侧边栏踩坑

问题描述 el-menu直接嵌套el-menu-item菜单&#xff0c;折叠时不会出现文字显示和小箭头无法隐藏的问题&#xff0c;但是实际开发需求中难免需要把el-menu-item封装为组件 解决 vue3项目中嵌套两层template <template><template v-for"item in list" :k…