4 shift registers in and out getting artifact

You can simplify your code quite a bit

//Pin callouts
//74HC165
const int load = 3;                // Shift in PL pin 1 GW
const int clockEnablePin = 4;      // Shift in CE pin 15 BW
const int dataIn = 5;              // Shift in Q7 pin 7 GR
const int clockIn = 6;             // Shift in CP pin 2 BL
//74HC595
const int latchPin = 7;            // Shift Out ST_CP pin 12 BL
const int clockPin = 8;            // Shift Out SH-CP pin 11 BW
const int dataPin = 9;             // Shift Out ser   pin 14 GW

const int numOfRegisters = 4;
byte registerState[numOfRegisters];

void setup() {
  Serial.begin(115200);

  // Setup 74HC165 connections
  pinMode(load, OUTPUT);
  pinMode(clockEnablePin, OUTPUT);
  pinMode(clockIn, OUTPUT);
  pinMode(dataIn, INPUT);
  // Setup 74HC595 connecttions
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);

  regclear();
}

void loop() {
  GetInputs();
  delay(800);
  regWriteNew();
}

void regWriteNew() {
  digitalWrite(latchPin, LOW);
  for ( int i = 0; i < numOfRegisters; ++i ) {
    shiftOut(dataPin, clockPin, MSBFIRST, registerState[i]);
  }
  digitalWrite(latchPin, HIGH);
}

void regclear() {
  for (int i = 0; i < numOfRegisters; i++) {
    registerState[i] = 0;
  }
  regWriteNew();
}


void GetInputs() {
  //  serialPrintLoop("GetInputs");
  digitalWrite(load, LOW);
  delayMicroseconds(10);
  digitalWrite(load, HIGH);
  delayMicroseconds(10);

  Serial.print("Pin States:");
  // Get data from 74HC165
  digitalWrite(clockIn, HIGH);
  digitalWrite(clockEnablePin, LOW);
  for (int i = 0; i < numOfRegisters; ++i) {
    byte data = shiftIn(dataIn, clockIn, LSBFIRST);
    data = ~data;   // invert
    registerState[i] = data;
    Serial.println(data, BIN);
  }
  digitalWrite(clockEnablePin, HIGH);
}
1 Like