8位移位存放器(用移位存放器来扩充)

即日咱们将运用几个基础的电子“建立模块”,移位存放器。那些简单的摆设可用来百般用处,如数据变换、缓冲和保存,但即日咱们将看到它们也可用来扩充 Arduino 数字 I/O 端口的数目。

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

经过进修运用移位存放器,您将为安排师的东西包增添另一个简单的东西。

目次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位并行输出——串行输入

8位移位寄存器(用移位寄存器来扩展) 第1张

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 代码 17.3 74HC595 和 74HC165 代码 2 – 令人激动!

8. 论断

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

扩充您的 ArduinoArduino 仍旧有很多数字 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 具备“三态”输入。这表示着并行数据输入上的引脚不妨居于三种各别的状况。

8位移位寄存器(用移位寄存器来扩展) 第2张

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 之上的任何值都不妨平常处事。保证您查看库容器的极性。

在我的面包板上,我用一个 82220 欧姆的电阻阵列替代了八个降压电阻。当您须要洪量沟通的电阻器时,这是一个简单的组件。固然,即使您没有阵列,您不妨运用分立电阻器。

8位移位寄存器(用移位寄存器来扩展) 第3张

这边有很多电缆,以是请提防查看您的接报。您不妨先贯穿 LED 降压电阻器拉拢,而后向电阻器强加 5 伏电压,即使接报精确,您将点亮 LED。对一切八个电阻-LED 对反复尝试。在贯穿 74HC595 和 Arduino 之前实行此操纵。

一旦十足贯穿好,您就不妨连接进步并编写少许代码以使其十足处事。

Arduino shiftOut() 因变量有几种本领不妨运用 Arduino 与移位存放器“对话”。一种本领是运用 SPI 总线,它承诺您运用现有库来简化代码编写。

另一种本领是运用 Arduino 上的任何规范 I/O 引脚来创造时钟并调换串行数据。这是咱们将用来处置 74HC595 移位存放器的本领。

Arduino 供给了一个shiftOut()因变量来简化串行贯穿上的数据挪动。它不妨获得一个字节值并以串行方法与另一个引脚上的时钟脉冲同步输入。不妨采用两个目标输入数据。

MSB First– 最上位在前。以是二进制数 10110010 将以“101”发端,大概从左到右,一次输入一位。

LSB First – 最低灵验位在前。在这种情景下,二进制数 10110010 将以“010”发端,或从右到左,一次输入一位。

咱们将在咱们的代码中运用这个功效。

8位移位寄存器(用移位寄存器来扩展) 第4张

Arduino 和 74HC595 代码咱们的代码特殊大略。该SHIFTOUT因变量能将咱们的数据发送给移位存放器和创造时钟旗号。

/*

8位移位寄存器(用移位寄存器来扩展) 第5张

  74HC595 Shift Register Demonstration 1

  74hc595-demo.ino

  Count in Binary and display on 8 LEDs

 

  Modified from "Hello World" example by Carlyn Maw,Tom Igoe and David A. Mellis

 

  DroneBot Workshop 2020

  https://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 Outputs  pinMode(latchPin, OUTPUT);

  pinMode(clockPin, OUTPUT);

  pinMode(dataPin, OUTPUT);

}

 void loop() {

  // Count from 0 to 255 and display in binary 

  for (int numberToDisplay = 0; numberToDisplay < 256; numberToDisplay++) {

 

    // ST_CP LOW to keep LEDs from changing while reading serial data    digitalWrite(latchPin, LOW);

 

    // Shift out the bits    shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay);

 

    // ST_CP HIGH change LEDs    digitalWrite(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 用作少量点。在某些表露中,这不妨用冒号包办。

8位移位寄存器(用移位寄存器来扩展) 第6张

LED 表露屏有两种摆设:

共阳极– 一切 LED 都运用共阳极(阳极)贯穿。

共负极- 一切 LED 都与一个共负极(负极)贯穿贯串。

两种表露典型都运用沟通的引脚陈设,所以领会您的典型特殊要害。一个很好的确定本领(除去参考表露器元件号)是在“二极管尝试”功效上运用万用表。当以精确的极性贯穿时,它可用来点亮 LED 元件。

共负极表露器更罕见,是咱们将用来试验的典型。

74HC595 7 段表露器贯穿因为共负极 7 段 LED 表露屏本质上不过将八个 LED 贯穿到一个大众负极(负极)端子,所以与咱们在第一个试验中运用的八个 LED 没有什么各别。以是咱们不妨运用实足沟通的通路来接报。

8位移位寄存器(用移位寄存器来扩展) 第7张

运用贯穿图中的图表将表露引脚贯穿到降压电阻。COM 引脚(大众负极)贯穿到 Arduino 的地。请提防,表露器将有两个 COM 引脚,您只需贯穿一个。

实行一切贯穿后,您不妨经过运转上一个代码来尝试它,该代码该当尝试一切 LED 段,囊括少量点。

但要真实表露连接的货色,咱们须要各别的代码。

74HC595 7段表露代码这是咱们将用来尝试咱们的 7 段表露器的代码。

/*

  74HC595 Shift Register with 7-segment LED display

  74hc595-7segdisplay.ino

  Count in hex from 0-F and display on 7-segment Common Cathode LED display

 

  DroneBot Workshop 2020

  https://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 Outputs  pinMode(latchPin, OUTPUT);

  pinMode(clockPin, OUTPUT);

  pinMode(dataPin, OUTPUT);

}void loop(){

  // Count from 0 to 15  for (int num = 0; num < 16; num++)

  {

    // ST_CP LOW to keep LEDs from changing while reading serial data    digitalWrite(latchPin, LOW);

 

    // Shift out the bits    shiftOut(dataPin, clockPin, MSBFIRST, datArray[num]);

8位移位寄存器(用移位寄存器来扩展) 第8张

 

    // ST_CP HIGH change LEDs    digitalWrite(latchPin, HIGH);

 

    delay(1000);

  }

}此代码与前一个代码有很多一致之处,当您觉得它在同一件事上做得很好时,这并不怪僻。

咱们经过设置与 74HC595 的贯穿从新发端。

而后咱们创造一个包括 16 个元素的数组,每个元素代办要在 7 段 LED 上表露的字符形式。

8位移位寄存器(用移位寄存器来扩展) 第9张

那些元素以二进制情势编写,所以很简单领会它们的处事道理。在二进制字节中,每一位代办一个 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 1

  74hc165-demo.ino

  Read from 8 switches and display values on serial monitor

 

  DroneBot Workshop 2020

  https://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 Monitor  Serial.begin(9600);

 

  // Setup 74HC165 connections  pinMode(load, OUTPUT);

  pinMode(clockEnablePin, OUTPUT);

  pinMode(clockIn, OUTPUT);

  pinMode(dataIn, INPUT);

}

 void loop(){

 

  // Write pulse to load pin  digitalWrite(load, LOW);

  delayMicroseconds(5);

  digitalWrite(load, HIGH);

8位移位寄存器(用移位寄存器来扩展) 第10张

  delayMicroseconds(5);

 

8位移位寄存器(用移位寄存器来扩展) 第11张

  // Get data from 74HC165  digitalWrite(clockIn, HIGH);

  digitalWrite(clockEnablePin, LOW);

  byte incoming = shiftIn(dataIn, clockIn, LSBFIRST);

  digitalWrite(clockEnablePin, HIGH);

 

  // Print to serial monitor  Serial.print("Pin States:\r\n");

&n百思特网bsp; Serial.println(incoming, BIN);

  delay(200);

}代码与咱们之前的一切代码一律,设置了到 IC 的四个贯穿。

在树立中,咱们初始化串行监督器,而后按照须要树立贯穿。

在轮回中,咱们开始向加载引脚写入一个脉冲,这将使其将并行输出中的数据加载到要处置的缓冲区中。

接下来,咱们树立 74HC165 筹备发送数据,而后运用shiftIn因变量获得该数据,开始是 LSB(最低灵验位)。咱们经过将时钟引脚拉高来实行,这表白咱们仍旧实行了。

结果,咱们将截止打字与印刷到串行监督器。

加载代码,翻开串行监督器并查看输入。赶快你就会提防到少许工作。

数据在输入端十足维持高电平,与板上接报差异。按下按钮将使其读数为低,纵然这与本质爆发的情景差异。

这是由于咱们运用的是 74HC165 的取反输入。咱们的数据是差异的。

我将在稍后的代码中向您展现怎样以精确的办法将其转回顾。连接观赏!

8位移位寄存器(用移位寄存器来扩展) 第12张

咱们方才运用的示例有很多本质运用,个中一个鲜明的运用是动作小键盘(纵然有更好的本领来创造大键盘)。对于须要洪量电门的名目来说,这是一种有效的安排本领。

8位移位寄存器(用移位寄存器来扩展) 第13张

该通路的一个要害运用是将它与 DIP 电门或跳线一道运用,那些电门或跳线不过偶然树立。您不妨运用 74NC165 来缩小读取 8 位 DIP 电门所需的贯穿数目,只需在树立步调中读取它,再不仅在摆设回电或复位时读取。

74HC595 和 74HC165 一道运用固然,将一切那些 LED 和电门贯穿起来而不采用特殊的办法将它们贯穿在一道将是一种滥用!以是让咱们如许做。

74HC595 和 74HC165 贯穿即使您像我一律在本人的无焊面包板上建立每个演练,那么将它们贯穿在一道特殊大略。

在个中一个演练中将 Arduino 与其面包板割断贯穿,哪个并不要害。将贯穿留在面包板上,再不您不妨将它们从新贯穿到另一个 Arduino。您不妨将 5 伏和接地贯穿贯穿到其余面包板电源轨。

实行后试验在 Arduino 上运转之前的代码,十足都该当仍旧灵验。即使某些货色不起效率,请查看您的接报,当您介入名目时,某些货色大概已割断贯穿 - 这边有很多电缆!

尝试完一切实质后,就不妨察看代码以同声运用 74HC165 和 74HC595。

74HC595 和 74HC165 代码 1因为咱们的演练实质上是将两个演练融洽在一道,所以咱们的代码实足沟通。你会看到这个代码和之前的代码有很多一致之处,这并非偶尔——个中少许是字面上的剪切和粘贴!

代码的手段是大略地运用 LED 来表露按钮的状况。动作演练,它运转杰出。我保护在这之后咱们会连接做少许更令人激动的工作!

/*

  74HC595 & 74HC165 Shift Register Demonstration

  74hc595-to-74ch165.ino

  Input for 8 pushbuttons using 74HC165

  Output to 0 LEDs using 74HC595

 

  DroneBot Workshop 2020

  https://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 Monitor  Serial.begin(9600);

 

  // 74HC165 pins  pinMode(load, OUTPUT);

  pinMode(clockEnablePin, OUTPUT);

8位移位寄存器(用移位寄存器来扩展) 第14张

  pinMode(clock百思特网In, OUTPUT);

  pinMode(dataIn, INPUT);

 

  // 74HC595 pins  pinMode(latchPin, OUTPUT);

  pinMode(clockPin, OUTPUT);

8位移位寄存器(用移位寄存器来扩展) 第15张

  pinMode(dataPin, OUTPUT);

 

}

 

 void loop() {

 

  // Read Switches 

  // Write pulse to load pin  digitalWrite(load, LOW);

  delayMicroseconds(5);

  digitalWrite(load, HIGH);

  delayMicroseconds(5);

 

  // Get data from 74HC165  digitalWrite(clockIn, HIGH);

  digitalWrite(clockEnablePin, LOW);

  byte incoming = shiftIn(dataIn, clockIn, LSBFIRST);

  digitalWrite(clockEnablePin, HIGH);

 

  // Print to serial monitor  Serial.print("Pin States:\r\n");

  Serial.println(incoming, BIN);

 

 

  // Write to LEDs 

  // ST_CP LOW to keep LEDs from cha百思特网nging while reading serial data  digitalWrite(latchPin, LOW);

 

8位移位寄存器(用移位寄存器来扩展) 第16张

  // Shift out the bits  shiftOut(dataPin, clockPin, LSBFIRST, ~incoming);

 

  // ST_CP HIGH change LEDs  digitalWrite(latchPin, HIGH);

 

  delay(500);

 

}咱们再次设置两个集成通路的引脚贯穿。在树立中,咱们初始化串行监督器并按照须要树立贯穿。

轮回以咱们之前用来从 74HC165 读取按钮值的沟通例程发端。咱们再次将数据插入一个称为“传入”的 8 位字节中,并在串行监督器上表露其值。

8位移位寄存器(用移位寄存器来扩展) 第17张

接下来,咱们运用之前运用的沟通代码将数据写入 74HC595。然而咱们对发送给移位存放器上的数据举行了一项变动。

请记取,咱们来自调换机的数据是回转的。即使咱们将它发送给 74HC595 它将处事,但 LED 将十足亮起,只有咱们按下了按钮。

为了回转数据,当咱们在shiftOut因变量中运用它时,咱们在“传入”变量前方运用“~”标记。海浪号(海浪线)标记回转二进制数据,将每个零形成一,反之亦然。恰是咱们须要做的。

您还会提防到咱们与早期 74HC595 代码各别的一件事是咱们开始发送数据 LSB。这与咱们从按钮接受它的办法相配合。开始发送 MSB 会起效率,但 LED 表露会回转。

加载它并试验一下。

很风趣,不是吗?

好吧,它真实不是,但它真实展现了怎样获得并行数据(电门输出),运用移位存放器将其变换为串行,将其发送给 Arduino,将其发送回第二个移位存放器并举行变换它再次回到串联状况(LED 输入)。这有点令人激动。

即使您不是很激动,请不要担忧,此刻咱们有 8 个电门和 8 个 LED,咱们不妨做其余工作。

74HC595 和 74HC165 代码 2 – 令人激动!为了给咱们的演练填补少许料,让咱们运用八个电门来采用 LED 灯闪耀形式。由于咱们有八个电门,以是咱们不妨采用八个形式。

这是咱们怎样做到的代码:

/*

  74HC595 & 74HC165 Shift Register Demonstration 2

  74hc595-to-74ch165-pattern.ino

  Input from 8 pushbuttons using 74HC165

  Output to 8 LEDs using 74HC595

  

  Select LED pattern using pushbuttons

  

  DroneBot Workshop 2020

  https://dronebotworkshop.com

*/// Define Connections to 74HC165 // PL pin 1int load = 7;  // CE pin 15      int clockEnablePin = 4;  // Q7 pin 7  int dataIn = 5;  // CP pin 2  int 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);

8位移位寄存器(用移位寄存器来扩展) 第18张

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 pattern switch (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;

8位移位寄存器(用移位寄存器来扩展) 第19张

  

8位移位寄存器(用移位寄存器来扩展) 第20张

    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:

  

8位移位寄存器(用移位寄存器来扩展) 第21张

    datArray[0] = B10000000;

    datArray[1] = B00000001;

    datArray[2] = B01000000;

    datArray[3] = B00000010;

    datArray[4] = B00100000;

    datArray[5] = B00000100;

    datArray[6] = B00010000;

8位移位寄存器(用移位寄存器来扩展) 第22张

    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 7  for(int num = 0; num < 8; num++)

  {

    // ST_CP LOW to keep LEDs from changing while reading serial data    digitalWrite(latchPin, LOW);

    

    // Shift out the bits    shiftOut(dataPin,clockPin,MSBFIRST,datArray[num]);

 

    // ST_CP HIGH change LEDs    digitalWrite(latchPin, HIGH);

    

    delay(200);

  }

8位移位寄存器(用移位寄存器来扩展) 第23张

 

8位移位寄存器(用移位寄存器来扩展) 第24张

}正如你所看到的,我再次从之前的一切演练中滥用了源代码。究竟上,这个代码惟有一件事各别,那即是承诺您采用 LED 形式的 switch-case 语句。

咱们运用生存电门值的“传入”字节动作语句的电门。而后咱们有八个情景,每个电门按下一个。即使您想承诺同声按下两个按钮,您大概不妨增添更多按钮,但八个对我来说仍旧充满了!

在每个情景下,咱们用 LED 图案弥补datArray阵列,以二进制编写,再不于察看。在每个字节中,“1”表白 LED 点亮,而“0”表白 LED 扑灭。

我在数组中运用了八个元素以使其更简单,但您不妨将其减少到您爱好的任何数字。只需变动数组设置和轮回遍历数组元素的 for-next 轮回中的数字即可。

我将形式变动之间的推迟树立为 200 毫秒,但您不妨变动它。更好的是,试验将推迟动作每个案例评价中的变量,如许您就不妨使形式以各别的速率运转。

代码依照预见的办法运转,本质上观察起来很风趣。

您不妨经过级联 74HC595 以增添更多 LED 来矫正代码。您还不妨经过将电位计增添到模仿输出之一并运用它来树立推迟功夫来使速率可变。74HC595 上的使能输出不妨用 PWM 启动来变换 LED 强度,你不妨用第二个电位器来遏制。

您以至不妨增添少许 MOSFET 来启动更大的 LED 并创造您本人的殊效!

一个有很多后劲的大略演练。

论断移位存放器大概是基础建立块,即使您须要为名目增添特殊的输出或输入,它们会特殊有效,它们既廉价又容易运用。