首页 » 科学 » 用移位寄存器来扩展 Arduino 数字 I/O 端口的数量_数据_移位存放器

用移位寄存器来扩展 Arduino 数字 I/O 端口的数量_数据_移位存放器

雨夜梧桐 2024-12-23 11:01:04 0

扫一扫用手机浏览

文章目录 [+]

本文原创: 加拿大DroneBotWorkshop.com 翻译整理:DIY百事

通过学习利用移位寄存器,您将为设计师的工具包添加另一个方便的工具。

用移位寄存器来扩展 Arduino 数字 I/O 端口的数量_数据_移位存放器 科学

目录

1简介1.1扩展您的 Arduino

2 移位寄存器 2.1移位寄存器的类型 2.1.1串行输入-并行输出 2.1.2并行输入-串行输出 2.1.3并行输入-并行输出 & 串行输入-串行输出 2.2移位寄存器的事情事理 2.3级联移位寄存器

3 74HC575 & 74HC165 移位寄存器 3.1 74HC595——8位串行输入——并行输出 3.2 74HC165——8位并行输入——串行输出

4. 74HC595 的额外输出端口 4.1 Arduino & 74HC595 连接 4.2 Arduino shiftOut() 函数 4.3 Arduino & 74HC595 草图

5. 驱动 7 段显示器 5.1 7 段 LED 显示 5.2 74HC595 7 段显示器连接 5.3 74HC595 7段显示示意图

6. 74HC165 的额外输入端口 6.1 Arduino shiftIn() 函数 6.2 Arduino & 74HC165 连接 6.3 Arduino & 74HC165 代码

7. 74HC595 和 74HC165 一起利用 7.1 74HC595 和 74HC165 连接 7.2 74HC595 和 74HC165 代码 1 7.3 74HC595 和 74HC165 代码 2 – 令人愉快!

8. 结论

---------------------------------------------------------------------------------------------------------

扩展您的 Arduino

Arduino 已经有许多数字 I/O 端口,事实上,Arduino Mega 250 拥有 54 个数字 I/O 引脚和其余 16 个可以兼作数字 I/O 引脚的仿照输入。
因此,对付 70 个潜在的 I/O 引脚,您常日不须要更多。
但有时你确实须要更多。

以熟习的“LED Cube”为例。
一个 4x4x4 尺寸的立方体须要 64 个 LED,如果你“借用”几个仿照引脚,这在 Arduino Mega 2560 的能力范围内。
但是你快到极限了。

如果你想扩展到一个 5x5x5 的立方体,那么你就不交运了,为此你须要 125 个 LED,而且你不能用一个 Arduino 单独掌握它们。

纵然是利用标准(即不可寻址)RGB LED 的 4x4x4 立方体也会超过限定。

有很多方法可以办理这些问题,包括在矩阵中运行 LED 或利用移位寄存器。
移位寄存器将许可您仅利用几个 Arduino I/O 引脚来寻址大量 LED。

有时,您有很多传感器、显示器或其他 I/O 设备,无法为 LED 或开关留出大量引脚,但您须要一个多 LED 显示器或一个小键盘。
移位寄存器可以再次派上用场。

让我们来看看这些设备的利用。

移位寄存器

移位寄存器是用于二进制数据的转换、存储或传输的时序逻辑电路。

这些设备用于在串行和并行数据之间进行转换。
它们可用于数据通信电路以及存储器和缓冲电路。
许多繁芜的电子电路,例如微处理器和微掌握器,在内部利用移位寄存器。

移位寄存器的类型

移位寄存器处理其输入和输出上的串行和并行数据,并且它们可以在这些格式之间进行转换。

有四种基本类型的移位寄存器:

串行输入-并行输出

并行输入 - 串行输出

并行输入 - 串行输出 (PISO) 移位寄存器将并行数据转换为串行数据。
它用于通信并将多个输入端口转换为串行数据。

并行输入 – 并行输出 & 串行输入 – 串行输出

你可能会以为这两个很奇怪。
为什么须要一个移位寄存器,以与输入的格式相同的格式输出数据?

答案是这可以用作缓冲区,以在特天命量的时钟周期内保存数据。
我们本日利用的移位寄存器都利用类似的缓冲器来保存他们输入和输出上的数据,因此在寄存器移位时它不会改变。

移位寄存器的事情事理

内部移位寄存器由许多基本逻辑门组成,个中许多被安排为“触发器”。

如果您不熟习触发器,它是一种基本的电子电路,可以用来保存来自其输入的数据值。
它是一个基本的构建块,无处不在,包括在许多形式的存储器电路中。

串行输入-并行输出或 SIPO 寄存器利用一系列触发器,并行输出上的每个位对应一个触发器。
此处的插图显示的是 4 位设备。

当串行数据的第一位被计时,它存储在触发器中并涌如今其输出上。

下一位数据将原始位推送到下一个触发器。

随着串行数据的输入,该过程连续进行。
请把稳,触发器仅在输入时更新输入值。

末了,当并行输出中的所有数据都被计时时,就可以读取了。
在大多数移位寄存器中,一个额外的缓冲区保存并行数据,并且在所有数据输入时钟之前不会变动它。

PISO 或并行输入 - 串行输出移位寄存器的布局如下

该图的“MUX”部分实际上由许多分立的逻辑门组成,它们用于在精确的韶光将数据馈入干系的触发器。

这很主要,由于 PISO 移位寄存器须要单独计时并行数据的每一位。
这意味着并行输入上的数据在读取时不能变动,同样,大多数实际设计采取缓冲区来保存并行数据。

级联移位寄存器

移位寄存器按其处理的位数进行分类,前面插图中显示的那些是 4 位寄存器,而我们本日将利用的两个移位寄存器都是 8 位设备。

如果您须要增加可以利用移位寄存器处理的并行数据量,您可以将其与另一个移位寄存器级联。
以是两个 8 位移位寄存器可以支持 16 位,再加一个支持 24 位,等等。

您不须要额外连接到微掌握器来级联移位寄存器,因此这是驱动大量 LED 或读取大量开关而不该用大量端口的好方法。

74HC575 & 74HC165 移位寄存器

本日我们将利用两个非常常见且随意马虎得到的移位寄存器,即 74HC595 SIPO 和 74HC165 PISO。
让我们仔细看看这些芯片

74HC595——8位串行输入——并行输出

该74HC575是一个8级串行移位寄存器,它也具有一个内部存储寄存器。
存储寄存器缓冲输出数据并且可以独立于移位寄存器计时。
这可以防止数据在加载时发生变革。

74HC595 具有“三态”输出。
这意味着并行数据输出上的引脚可以处于三种不同的状态。

低高关

OFF 状态是高阻态,有效断开芯片的输出。
这种技能许可多个三态芯片驱动同一条总线,在任何给定时间只有个中一个处于活动状态。

DIP 封装中 74HC575 的引脚排列如下所示:

串行数据在 DS 引脚(引脚 14)上输入。
您可以利用 Q7' 引脚来级联这些设备,以增加您可以掌握的并行输出数量。

输出使能(引脚 13)掌握三态总线,如果它为低电平,则输出总线被使能。

74HC165 – 8 位并行输入 – 串行输出

该74HC165是具有串行输出的8位并行负载移位寄存器。
它具有互补输出,个中一个可以连接到另一个 74HC165 以将它们级联。

该器件用于并行到串行数据转换,具有以下引脚排列:

与 74HC595 一样,这是一种非常常见的集成电路,您险些可以从任何电子供应商处得到它。

74HC595 的额外输出端口

我们将从 74HC595 SIPO(串行输入-并行输出)移位寄存器开始我们的实验。

74HC595 许可我们扩展 Arduino 上的数字 I/O 端口的数量。
在这些实验中,我们将利用它来驱动一些 LED,我们将利用 Arduino 掌握这些 LED。

Arduino & 74HC595 连接

以下是我们将 74HC595 连接到 Arduino 和八个 LED 的方法。

请把稳在电源两端添加了一个去耦电容器,当利用 74HC595 等 TTL 芯片时,这是一个好主张。
我利用了一个 100uf 的电容器,但 10uf 以上的任何值都可以正常事情。
确保您不雅观察电容器的极性。

在我的面包板上,我用一个 8×2220 欧姆的电阻阵列更换了八个降压电阻。
当您须要大量相同的电阻器时,这是一个方便的组件。
当然,如果您没有阵列,您可以利用分立电阻器。

这里有很多电线,以是请仔细检讨您的接线。
您可以先连接 LED 降压电阻器组合,然后向电阻器施加 5 伏电压,如果接线精确,您将点亮 LED。
对所有八个电阻-LED 对重复测试。
在连接 74HC595 和 Arduino 之前实行此操作。

一旦全部连接好,您就可以连续提高并编写一些代码以使其全部事情。

Arduino shiftOut() 函数

有几种方法可以利用 Arduino 与移位寄存器“对话”。
一种方法是利用 SPI 总线,它许可您利用现有库来简化代码编写。

另一种方法是利用 Arduino 上的任何标准 I/O 引脚来创建时钟并交流串行数据。
这是我们将用于处理 74HC595 移位寄存器的方法。

Arduino 供应了一个shiftOut()函数来简化串行连接上的数据移动。
它可以获取一个字节值并以串行格式与另一个引脚上的时钟脉冲同步输出。
可以选择两个方向输出数据。

MSB First– 最高位在前。
以是二进制数 10110010 将以“101”开始,或者从左到右,一次输出一位。
LSB First – 最低有效位在前。
在这种情形下,二进制数 10110010 将以“010”开始,或从右到左,一次输出一位。

我们将在我们的代码中利用这个功能。

Arduino 和 74HC595 代码

我们的代码非常大略。
SHIFTOUT函数能将我们的数据发送到移位寄存器和创建时钟旗子暗记

/74HC595 Shift Register Demonstration 174hc595-demo.inoCount in Binary and display on 8 LEDsModified from "Hello World" example by Carlyn Maw,Tom Igoe and David A. MellisDroneBot Workshop 2020https://dronebotworkshop.com/// Define Connections to 74HC595// ST_CP pin 12const int latchPin = 10;// SH_CP pin 11const int clockPin = 11;// DS pin 14const int dataPin = 12;void setup (){// Setup pins as OutputspinMode(latchPin, OUTPUT);pinMode(clockPin, OUTPUT);pinMode(dataPin, OUTPUT);}void loop() {// Count from 0 to 255 and display in binaryfor (int numberToDisplay = 0; numberToDisplay < 256; numberToDisplay++) {// ST_CP LOW to keep LEDs from changing while reading serial datadigitalWrite(latchPin, LOW);// Shift out the bitsshiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay);// ST_CP HIGH change LEDsdigitalWrite(latchPin, HIGH);delay(500);}}

我们首先为连接到 74HC595 的引脚分配变量名称。
然后将所有这些引脚设置为输出。
然后我们进入循环。

我们利用 for-next 循环从 0 到 255 计数,递增 1。
在每次增量时,我们将计数器值写入移位寄存器。
锁存引脚用于在我们准备好之前保存数据,以便在加载移位寄存器时显示不会闪烁。

半秒延迟后,下一个数字被加载。

结果是 LED 显示从 0 到 255 的二进制计数。

您可以试验代码并操纵一些值并不雅观察对 LED 的影响。
考试测验将shiftOut 语句中的MSBFIRST参数变动为LSBFIRST,看看会发生什么。

这是理解基本移位寄存器操作的大略方法。

驱动 7 段显示器

74HC575 的另一个用场是驱动 7 段 LED 显示屏。
您可以利用它来显示连接到一台显示器的数量,或者您可以级联多个 74HC595 来驱动多台显示器。

7 段 LED 显示屏

范例的 7 段 LED 显示布局如下所示:

请把稳,“7 段”显示器中实际上有八个 LED 元件,第八个 LED 用作小数点。
在某些显示中,这可以用冒号代替。

LED 显示屏有两种配置:

共阳极– 所有 LED 都利用共阳极(正极)连接。
共阴极- 所有 LED 都与一个共阴极(负极)连接相连。

两种显示类型都利用相同的引脚排列,因此理解您的类型非常主要。
一个很好的判断方法(除了参考显示器部件号)是在“二极管测试”功能上利用万用表。
当以精确的极性连接时,它可用于点亮 LED 元件。

共阴极显示器更常见,是我们将用于实验的类型。

74HC595 7 段显示器连接

由于共阴极 7 段 LED 显示屏实际上只是将八个 LED 连接到一个公共阴极(负极)端子,因此与我们在第一个实验中利用的八个 LED 没有什么不同。
以是我们可以利用完备相同的电路来接线。

利用连接图中的图表将显示引脚连接到降压电阻。
COM 引脚(公共阴极)连接到 Arduino 的地。
请把稳,显示器将有两个 COM 引脚,您只需连接一个。

完成所有连接后,您可以通过运行上一个代码来测试它,该代码该当测试所有 LED 段,包括小数点。

但要真正显示连贯的东西,我们须要不同的代码。

74HC595 7段显示代码

这是我们将用来测试我们的 7 段显示器的代码。

/74HC595 Shift Register with 7-segment LED display74hc595-7segdisplay.inoCount in hex from 0-F and display on 7-segment Common Cathode LED displayDroneBot Workshop 2020https://dronebotworkshop.com/// Define Connections to 74HC595// ST_CP pin 12const int latchPin = 10;// SH_CP pin 11const int clockPin = 11;// DS pin 14const int dataPin = 12;// Patterns for characters 0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,Fint datArray[16] = {B11111100, B01100000, B11011010, B11110010, B01100110, B10110110, B10111110, B11100000, B11111110, B11110110, B11101110, B00111110, B10011100, B01111010, B10011110, B10001110};void setup (){// Setup pins as OutputspinMode(latchPin, OUTPUT);pinMode(clockPin, OUTPUT);pinMode(dataPin, OUTPUT);}void loop(){// Count from 0 to 15for (int num = 0; num < 16; num++){// ST_CP LOW to keep LEDs from changing while reading serial datadigitalWrite(latchPin, LOW);// Shift out the bitsshiftOut(dataPin, clockPin, MSBFIRST, datArray[num]);// ST_CP HIGH change LEDsdigitalWrite(latchPin, HIGH);delay(1000);}}

此代码与前一个代码有许多相似之处,当您认为它在同一件事上做得很好时,这并不奇怪。

我们通过定义与 74HC595 的连接重新开始。

然后我们创建一个包含 16 个元素的数组,每个元素代表要在 7 段 LED 上显示的字符模式。

这些元素以二进制形式编写,因此很随意马虎理解它们的事情事理。
在二进制字节中,每一位代表一个 LED 段。
从 MSB 到 LSB(从左到右),它们代表显示屏中的以下段:

a – b – c – d – e – f – g – DP

当该位设置为“1”时,LED 各段点亮,“0”表示熄灭。

数组是有序的,以是元素 0 是“0”的字符。
元素1是“1”等的字符。
它是十六进制的,以是元素15是“F”。

查看数组元素,您将看到排列。

再次在设置中,我们将连接设置为输出,然后进入循环。

我们再次利用计数器,只是这次 介于 0 和 15 之间。
我们将在 LED 显示屏上以十六进制格式显示这些值。

我们一次遍历数组一个元素,利用shiftOut将数组中的数据发送到移位寄存器。

加载代码并不雅观察显示。
如果统统都精确连接,您会看到它从 0 到 F 计数,然后重复。

74HC165 的额外输入端口

现在我们已经理解了如何利用移位寄存器添加输出端口,现在是时候做相反的事情并添加一些输入了。
对付这项事情,我们将利用 74HC165。

我们将利用 74HC165 移位寄存器和八个轻触式按钮开关。
移位寄存器将从开关中获取 8 个输入,并将它们作为串行数据发送到 Arduino。

Arduino shiftIn() 函数

Arduino 再次具有用于吸收串行数据的专用功能。

所述SHIFTIN()函数中的一个字节在一个韶光移位串行数据。
可以设置为先取 MSB 或 LSB。
它常日与 74HC165 或CD4021BE等移位寄存器一起利用。

与其表亲shiftOut函数一样,shiftIn函数也供应时钟旗子暗记来同步数据传输。

Arduino & 74HC165 连接

74HC165 的输入须要拉低以防止缺点读数,因此除了我们的八个按钮开关之外,我们还须要八个下拉电阻。
我利用了 10k 电阻,但从 4.7k 到 27k 的任何值都可以正常事情。

我再次利用了一个 100uf 的去耦电容,确保在连接时把稳极性。

一旦你把它全部连接起来,我们就可以专注于我们将用来完成这项事情的代码。

Arduino & 74HC165 代码

我们的代码非常大略,由于它所做的只是读取按钮的状态并在串行监视器上显示结果。
但这便是理解如何从按钮和 74HC165 获取数据所须要做的全部事情。

/74HC165 Shift Register Demonstration 174hc165-demo.inoRead from 8 switches and display values on serial monitorDroneBot Workshop 2020https://dronebotworkshop.com/// Define Connections to 74HC165// PL pin 1int load = 7;// CE pin 15int clockEnablePin = 4;// Q7 pin 7int dataIn = 5;// CP pin 2int clockIn = 6;void setup(){// Setup Serial MonitorSerial.begin(9600);// Setup 74HC165 connectionspinMode(load, OUTPUT);pinMode(clockEnablePin, OUTPUT);pinMode(clockIn, OUTPUT);pinMode(dataIn, INPUT);}void loop(){// Write pulse to load pindigitalWrite(load, LOW);delayMicroseconds(5);digitalWrite(load, HIGH);delayMicroseconds(5);// Get data from 74HC165digitalWrite(clockIn, HIGH);digitalWrite(clockEnablePin, LOW);byte incoming = shiftIn(dataIn, clockIn, LSBFIRST);digitalWrite(clockEnablePin, HIGH);// Print to serial monitorSerial.print("Pin States:\r\n");Serial.println(incoming, BIN);delay(200);}

代码与我们之前的所有代码一样,定义了到 IC 的四个连接。

在设置中,我们初始化串行监视器,然后根据须要设置连接。

在循环中,我们首先向加载引脚写入一个脉冲,这将使其将并行输入中的数据加载到要处理的缓冲区中。

接下来,我们设置 74HC165 准备发送数据,然后利用shiftIn函数获取该数据,首先是 LSB(最低有效位)。
我们通过将时钟引脚拉高来完成,这表示我们已经完成了。

末了,我们将结果打印到串行监视器。

加载代码,打开串行监视器并不雅观察输出。
立时你就会把稳到一些事情。

数据在输出端全部保持高电平,与板上接线相反。
按下按钮将使其读数为低,纵然这与实际发生的情形相反。

这是由于我们利用的是 74HC165 的取反输出。
我们的数据是相反的。

我将在稍后的代码中向您展示如何以精确的办法将其转回来。
连续阅读!

我们刚刚利用的示例有许多实际运用,个中一个明显的运用是作为小键盘(只管有更好的方法来制作大键盘)。
对付须要大量开关的项目来说,这是一种有用的设计技巧。

该电路的一个主要运用是将它与 DIP 开关或跳线一起利用,这些开关或跳线只是偶尔设置。
您可以利用 74NC165 来减少读取 8 位 DIP 开关所需的连接数量,只需在设置程序中读取它,以便仅在设备通电或复位时读取。

74HC595 和 74HC165 一起利用

当然,将所有这些 LED 和开相干接起来而不采纳额外的步骤将它们连接在一起将是一种摧残浪费蹂躏!
以是让我们这样做。

74HC595 和 74HC165 连接

如果您像我一样在自己的无焊面包板上构建每个演示,那么将它们连接在一起非常大略。

在个中一个演示中将 Arduino 与其面包板断开连接,哪个并不主要。
将连接留在面包板上,以便您可以将它们重新连接到另一个 Arduino。
您可以将 5 伏和接地连接连接到其他面包板电源轨。

完成后考试测验在 Arduino 上运行之前的代码,统统都该当仍旧有效。
如果某些东西不起浸染,请检讨您的接线,当您加入项目时,某些东西可能已断开连接 - 这里有很多电线!

测试完所有内容后,就可以查看代码以同时利用 74HC165 和 74HC595。

74HC595 和 74HC165 代码 1

由于我们的演示实质上是将两个演示领悟在一起,因此我们的代码完备相同。
你会看到这个代码和之前的代码有很多相似之处,这并非有时——个中一些是字面上的剪切和粘贴!

代码的目的是大略地利用 LED 来显示按钮的状态。
作为演示,它运行良好。
我担保在这之后我们会连续做一些更令人愉快的事情!

/74HC595 & 74HC165 Shift Register Demonstration74hc595-to-74ch165.inoInput for 8 pushbuttons using 74HC165Output to 0 LEDs using 74HC595DroneBot Workshop 2020https://dronebotworkshop.com/// Define Connections to 74HC165// PL pin 1int load = 7;// CE pin 15int clockEnablePin = 4;// Q7 pin 7int dataIn = 5;// CP pin 2int clockIn = 6;// Define Connections to 74HC595// ST_CP pin 12const int latchPin = 10;// SH_CP pin 11const int clockPin = 11;// DS pin 14const int dataPin = 12;void setup () {// Setup Serial MonitorSerial.begin(9600);// 74HC165 pinspinMode(load, OUTPUT);pinMode(clockEnablePin, OUTPUT);pinMode(clockIn, OUTPUT);pinMode(dataIn, INPUT);// 74HC595 pinspinMode(latchPin, OUTPUT);pinMode(clockPin, OUTPUT);pinMode(dataPin, OUTPUT);}void loop() {// Read Switches// Write pulse to load pindigitalWrite(load, LOW);delayMicroseconds(5);digitalWrite(load, HIGH);delayMicroseconds(5);// Get data from 74HC165digitalWrite(clockIn, HIGH);digitalWrite(clockEnablePin, LOW);byte incoming = shiftIn(dataIn, clockIn, LSBFIRST);digitalWrite(clockEnablePin, HIGH);// Print to serial monitorSerial.print("Pin States:\r\n");Serial.println(incoming, BIN);// Write to LEDs// ST_CP LOW to keep LEDs from changing while reading serial datadigitalWrite(latchPin, LOW);// Shift out the bitsshiftOut(dataPin, clockPin, LSBFIRST, ~incoming);// ST_CP HIGH change LEDsdigitalWrite(latchPin, HIGH);delay(500);}

我们再次定义两个集成电路的引脚连接。
在设置中,我们初始化串行监视器并根据须要设置连接。

循环以我们之前用于从 74HC165 读取按钮值的相同例程开始。
我们再次将数据插入一个称为“传入”的 8 位字节中,并在串行监视器上显示其值。

接下来,我们利用之前利用的相同代码将数据写入 74HC595。
但是我们对发送到移位寄存器上的数据进行了一项变动。

请记住,我们来自交流机的数据是反转的。
如果我们将它发送到 74HC595 它将事情,但 LED 将全部亮起,除非我们按下了按钮。

为了反转数据,当我们在shiftOut函数中利用它时,我们在“传入”变量前面利用“~”符号。
波浪号(波浪线)符号反转二进制数据,将每个零变成一,反之亦然。
正是我们须要做的。

您还会把稳到我们与早期 74HC595 代码不同的一件事是我们首先发送数据 LSB。
这与我们从按钮吸收它的办法相匹配。
首先发送 MSB 会起浸染,但 LED 显示会反转。

加载它并考试测验一下。

很有趣,不是吗?

好吧,它确实不是,但它确实展示了如何获取并行数据(开关输入),利用移位寄存器将其转换为串行,将其发送到 Arduino,将其发送回第二个移位寄存器并进行转换它再次回到并联状态(LED 输出)。
这有点令人愉快。

如果您不是很愉快,请不要担心,现在我们有 8 个开关和 8 个 LED,我们可以做其他事情。

74HC595 和 74HC165 代码 2 – 令人愉快!

为了给我们的演示增长一些料,让我们利用八个开关来选择 LED 灯闪烁模式。
由于我们有八个开关,以是我们可以选择八个模式。

这是我们如何做到的代码:

/74HC595 & 74HC165 Shift Register Demonstration 274hc595-to-74ch165-pattern.inoInput from 8 pushbuttons using 74HC165Output to 8 LEDs using 74HC595Select LED pattern using pushbuttonsDroneBot Workshop 2020https://dronebotworkshop.com/// Define Connections to 74HC165// PL pin 1int load = 7;// CE pin 15int clockEnablePin = 4;// Q7 pin 7int dataIn = 5;// CP pin 2int clockIn = 6;// Define Connections to 74HC595// ST_CP pin 12const int latchPin = 10;// SH_CP pin 11const int clockPin = 11;// DS pin 14const int dataPin = 12;// Define data arrayint datArray[8];void setup () {// Setup Serial MonitorSerial.begin(9600);// 74HC165 pinspinMode(load, OUTPUT);pinMode(clockEnablePin, OUTPUT);pinMode(clockIn, OUTPUT);pinMode(dataIn, INPUT);// 74HC595 pinspinMode(latchPin,OUTPUT);pinMode(clockPin,OUTPUT);pinMode(dataPin,OUTPUT);}void loop() {// Read Switches// Write pulse to load pindigitalWrite(load,LOW);delayMicroseconds(5);digitalWrite(load,HIGH);delayMicroseconds(5);// Get data from 74HC165digitalWrite(clockIn,HIGH);digitalWrite(clockEnablePin,LOW);byte incoming = shiftIn(dataIn, clockIn, LSBFIRST);digitalWrite(clockEnablePin,HIGH);// Print to serial monitorSerial.print("Pin States:\r\n");Serial.println(incoming, BIN);// Setup array for LED patternswitch (incoming) {case B11111110:datArray[0] = B11111111;datArray[1] = B01111110;datArray[2] = B10111101;datArray[3] = B11011011;datArray[4] = B11100111;datArray[5] = B11011011;datArray[6] = B10111101;datArray[7] = B01111110;break;case B11111101:datArray[0] = B00000001;datArray[1] = B00000010;datArray[2] = B00000100;datArray[3] = B00001000;datArray[4] = B00010000;datArray[5] = B00100000;datArray[6] = B01000000;datArray[7] = B10000000;break;case B11111011:datArray[0] = B10000001;datArray[1] = B01000010;datArray[2] = B00100100;datArray[3] = B00011000;datArray[4] = B00000000;datArray[5] = B00100100;datArray[6] = B01000010;datArray[7] = B10000001;break;case B11110111:datArray[0] = B10101010;datArray[1] = B01010101;datArray[2] = B10101010;datArray[3] = B01010101;datArray[4] = B10101010;datArray[5] = B01010101;datArray[6] = B10101010;datArray[7] = B01010101;break;case B11101111:datArray[0] = B10000000;datArray[1] = B00000001;datArray[2] = B01000000;datArray[3] = B00000010;datArray[4] = B00100000;datArray[5] = B00000100;datArray[6] = B00010000;datArray[7] = B00001000;break;case B11011111:datArray[0] = B11000000;datArray[1] = B01100000;datArray[2] = B00110000;datArray[3] = B00011000;datArray[4] = B00001100;datArray[5] = B00000110;datArray[6] = B00000011;datArray[7] = B10000001;break;case B10111111:datArray[0] = B11100000;datArray[1] = B01110000;datArray[2] = B00111000;datArray[3] = B00011100;datArray[4] = B00001110;datArray[5] = B00000111;datArray[6] = B10000011;datArray[7] = B11000001;break;case B01111111:datArray[0] = B10001000;datArray[1] = B01000100;datArray[2] = B00100010;datArray[3] = B00010001;datArray[4] = B10001000;datArray[5] = B01000100;datArray[6] = B00100010;datArray[7] = B00010001;break;default:break;}// Write to LEDs// Count from 0 to 7for(int num = 0; num < 8; num++){// ST_CP LOW to keep LEDs from changing while reading serial datadigitalWrite(latchPin, LOW);// Shift out the bitsshiftOut(dataPin,clockPin,MSBFIRST,datArray[num]);// ST_CP HIGH change LEDsdigitalWrite(latchPin, HIGH);delay(200);}}

正如你所看到的,我再次从之前的所有演示中借用了编码。
事实上,这个代码只有一件事不同,那便是许可您选择 LED 模式的 switch-case 语句。

我们利用保存开关值的“传入”字节作为语句的开关
然后我们有八个情形,每个开关按下一个。
如果您想许可同时按下两个按钮,您可能可以添加更多按钮,但八个对我来说已经足够了!

在每个情形下,我们用 LED 图案添补datArray阵列,以二进制编写,以便于查看。
在每个字节中,“1”表示 LED 点亮,而“0”表示 LED 熄灭。

我在数组中利用了八个元素以使其更随意马虎,但您可以将其增加到您喜好的任何数字。
只需变动数组定义和循环遍历数组元素的 for-next 循环中的数字即可。

我将模式变动之间的延迟设置为 200 毫秒,但您可以变动它。
更好的是,考试测验将延迟作为每个案例评估中的变量,这样您就可以使模式以不同的速率运行。

代码按照预想的办法运行,实际上不雅观看起来很有趣。

您可以通过级联 74HC595 以添加更多 LED 来改进代码。
您还可以通过将电位计添加到仿照输入之一并利用它来设置延迟韶光来使速率可变。
74HC595 上的使能输入可以用 PWM 驱动来改变 LED 强度,你可以用第二个电位器来掌握。

您乃至可以添加一些 MOSFET 来驱动更大的 LED 并制作您自己的殊效!

一个有很多潜力的大略演示。

结论

移位寄存器可能是基本构建块,如果您须要为项目添加额外的输入或输出,它们会非常有用,它们既便宜又易于利用。

相关文章

IT认证,打造数字化时代的专业基石

在数字化时代,信息技术(IT)已经成为各行各业发展的核心驱动力。而IT认证,作为衡量个人技术能力和职业素养的重要标准,正日益受到广...

科学 2024-12-25 阅读0 评论0

晶振的更换需要留心什么?_晶振_无源

1. 品牌同一款晶振,但是牌子不同,详细参数也就有细微的差别。在选择更换时,要仔细比拟产品规格书,例如负载电容,调度频差,温度频差...

科学 2024-12-25 阅读0 评论0

食物谣言之超纯水不能喝_超纯水_矿物资

超纯水不能喝,紧张干系内容这天本存了5万吨超纯水,本来是个普通的用来做中微子实验的设计,但是在某些谣言号中描述便是:1、天下上只有...

科学 2024-12-25 阅读0 评论0