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


/*  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]);     // ST_CP HIGH change LEDs    digitalWrite(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将数组中的数据发送到移位寄存器 。

用移位寄存器来扩展 8位移位寄存器


加载代码并观察显示 。如果一切都正确连接,您会看到它从 0 到 F 计数,然后重复 。
74HC165 的额外输入端口现在我们已经了解了如何使用移位寄存器添加输出端口,现在是时候做相反的事情并添加一些输入了 。对于这项工作,我们将使用 74HC165 。
我们将使用 74HC165 移位寄存器和八个轻触式按钮开关 。移位寄存器将从开关中获取 8 个输入,并将它们作为串行数据发送到 Arduino 。
Arduino shiftIn() 函数Arduino 再次具有用于接收串行数据的专用功能 。
所述SHIFTIN()函数中的一个字节在一个时间移位串行数据 。可以设置为先取 MSB 或 LSB 。它通常与 74HC165 或CD4021BE等移位寄存器一起使用 。
与其表亲shiftOut函数一样,shiftIn函数也提供时钟信号来同步数据传输 。

推荐阅读