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

我们再次定义两个集成电路的引脚连接 。在设置中,我们初始化串行监视器并根据需要设置连接 。
循环以我们之前用于从 74HC165 读取按钮值的相同例程开始 。我们再次将数据插入一个称为“传入”的 8 位字节中,并在串行监视器上显示其值 。
接下来,我们使用之前使用的相同代码将数据写入 74HC595 。但是我们对发送到移位寄存器上的数据进行了一项更改 。
请记住,我们来自交换机的数据是反转的 。如果我们将它发送到 74HC595 它将工作,但 LED 将全部亮起,除非我们按下了按钮 。
为了反转数据,当我们在shiftOut函数中使用它时,我们在“传入”变量前面使用“~”符号 。波浪号(波浪线)符号反转二进制数据,将每个零变成一,反之亦然 。正是我们需要做的 。
您还会注意到我们与早期 74HC595 代码不同的一件事是我们首先发送数据 LSB 。这与我们从按钮接收它的方式相匹配 。首先发送 MSB 会起作用,但 LED 显示会反转 。
加载它并尝试一下 。

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


很有趣,不是吗?
好吧,它确实不是,但它确实展示了如何获取并行数据(开关输入),使用移位寄存器将其转换为串行,将其发送到 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);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:rn);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;      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 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);  } }

推荐阅读