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

一、功能概述:

平时我们需要实现使用单片机点亮一个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芯片的串行输入功能,可以实现连续多个按键的输入,减少单片机的引脚占用。