74HC595

概述

通常,有两种方法可以驱动单个 7 段数码管。一种方法是将其 8 个引脚直接连接到 Uno 板的八个端口上,这是我们之前所做的。或者,您可以将 74HC595 连接到 UNO 板的三个端口,然后将 7 段数码管连接到 74HC595。在本实验中,我们将使用后一种方法。通过这种方式,我们可以节省五个端口——考虑到 Uno 板的端口有限,这一点非常重要。现在让我们开始吧!

所需元件

本项目中,我们需要以下元件。

购买整套套件会更加方便,以下是链接:

名称

套件所含项目

链接

Elite Explorer 套件

300+

Elite Explorer Kit

您也可以从以下链接单独购买。

元件介绍

购买链接

Arduino Uno R4 WiFi

-

面包板

BUY

杜邦线

BUY

电阻

BUY

7段数码管

BUY

74HC595

BUY

接线

../_images/29-74hc595_bb.png

原理图

在本实验中,MR(引脚 10)连接到 5V(高电平),OE(引脚 1)连接到 GND(低电平)。因此,数据在 SHcp 的上升沿输入,并通过上升沿进入存储器寄存器。我们使用 shiftout() 函数通过 DS 将 8 位数据输出到移位寄存器。在 SHcp 的上升沿,移位寄存器中的数据逐次移动一位,即 Q1 中的数据移动到 Q2,依此类推。在 STcp 的上升沿,移位寄存器中的数据移入存储器寄存器。经过 8 次后,所有数据将移入存储器寄存器。然后存储器寄存器中的数据输出到总线(Q0-Q7)。因此,16 个字符依次显示在 7 段数码管上。

../_images/29_74hc595_schematic.png

代码

备注

  • 您可以直接打开路径 elite-explorer-kit-main\basic_project\29-74hc595 下的 29-74hc595.ino 文件。

  • 或者将以下代码复制到 Arduino IDE 中。

将代码上传到 Uno 板后,您应该会看到 7 段数码管从 0 到 9 以及 A 到 F 的显示。

代码分析

设置数组元素

int datArray[16] = {252, 96, 218, 242, 102, 182, 190, 224, 254, 246, 238, 62, 156, 122, 158, 142};

该数组存储了从 0 到 F 的 16 个字符的数据。252 代表 0,您可以自己计算。要显示 0,7 段数码管的 g 段(中间段)必须为低电平(熄灭)。

由于 g 段连接到 74HC595 的 Q1,将 Q1 和 DP(小数点)都设置为低电平,其余引脚保持高电平。 因此,Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0 的值为 1 1 1 1 1 1 0 0。

将二进制数转换为十进制数: 1x27+1x26+1x25+1x24+1x23+1x22+0x21+1x20=252。

这就是要显示的数字 0 的值。您可以类似地计算其他字符。

在 7 段数码管上显示 0-F

for(int num = 0; num < 16; num++)

{

  digitalWrite(STcp,LOW); // 将 ST_CP 置低,并在传输期间保持低电平

  shiftOut(DS,SHcp,MSBFIRST,datArray[num]);

  // 将锁存引脚拉高,以通知芯片

  // 不再需要监听信息

  digitalWrite(STcp,HIGH); // 拉高 ST_CP 以保存数据

  delay(1000); // 等待一秒

}

先将 STcp 设置为低电平,然后设置为高电平。这将产生一个 STcp 的上升沿脉冲。

shiftOut() 用于一次一位地移出一个字节的数据,即通过 DS 引脚将 dataArray[num] 中的一个字节数据移入移位寄存器。MSBFIRST 表示从高位开始移动。

执行 digitalWrite(STcp,HIGH) 后,STcp 将处于上升沿。此时,移位寄存器中的数据将移入存储器寄存器。

一个字节的数据经过 8 次后将传输到存储器寄存器。然后存储器寄存器的数据输出到总线(Q0-Q7)。您将看到 7 段数码管上显示一个字符。然后延迟 1000ms。之后,返回 for()。循环重复,直到 16 次后所有字符逐一显示在 7 段数码管上。