I have decided to see if I can get beyond two shift registers for future projects.  The code below is a binary LED display counter. 16 LED lights is a counter from 0 to 15 that shows 2 ^ x or 0 to 32768.   You will see in the video that it shows each LED proper to the LCD screen.

#include // Library for LCD

int latchPin = 10;
int clockPin = 11;
int dataPin = 12;
unsigned int y = 0;

LiquidCrystal_I2C lcd20x4_24 = LiquidCrystal_I2C(0x24, 20, 4); // Change to (0x27,20,4) for 20×4 LCD.

int numOfRegisters = 2;
byte* registerState;

void HeartOfStainlessSteel_20x4_24() {
lcd20x4_24.init();
lcd20x4_24.backlight();

lcd20x4_24.init();
lcd20x4_24.backlight();

lcd20x4_24.setCursor(0, 0); // 4th column 1st row
lcd20x4_24.print(" ");

lcd20x4_24.setCursor(0, 1); // 9th column 2nd row
lcd20x4_24.print(" ");

lcd20x4_24.setCursor(0, 2); // 7th column 3rd row
lcd20x4_24.print(" ");

lcd20x4_24.setCursor(3, 3); // 3rd column 4th row
lcd20x4_24.print("LCD 20x4: 0x24");

}

void setup() {
Serial.begin(9600);
// These control the LCD displays
HeartOfStainlessSteel_20x4_24();

pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);

for ( int x = 0; x < 16; x++ ) {

y = 0.5 + pow(2,x);
Serial.print(x);
Serial.print(" ");
Serial.print(y);
Serial.print("\n");

//Mask counter with 1111111100000000 to select high order byte and divide by 256 to scale to a 8 bit output
int ByteHigh_Test = (y & 65280)/256;
//Mask counter with 0000000011111111 to select low order byte
int ByteLow_Test = y & 255;

//display integer
lcd20x4_24.setCursor(0, 0); // 1st column 1st row
lcd20x4_24.print("LED: ");
lcd20x4_24.setCursor(5, 0); // 4th column 1st row
lcd20x4_24.print(x + 1);

lcd20x4_24.setCursor(8, 0); // 1st column 1st row
lcd20x4_24.print("Int: ");
lcd20x4_24.setCursor(13, 0); // 4th column 1st row
lcd20x4_24.print(y);

//binary display
lcd20x4_24.setCursor(0, 1); // 1st column 2nd row
lcd20x4_24.print("Bin: ");
lcd20x4_24.setCursor(0, 2); // 4th column 2nd row
lcd20x4_24.print(y, BIN);

digitalWrite(latchPin, LOW); //When the latchPin goes from low to high, the data gets moved from the shift registers to the output pins
shiftOut(dataPin, clockPin, MSBFIRST, ByteHigh_Test);
shiftOut(dataPin, clockPin, MSBFIRST, ByteLow_Test);
digitalWrite(latchPin, HIGH); // Move the data from shift registers to output pins
delay(1000);

//reset LEDs to off
int ByteHigh_Reset = 0;
int ByteLow_Reset = 0;

digitalWrite(latchPin, LOW); //When the latchPin goes from low to high, the data gets moved from the shift registers to the output pins
shiftOut(dataPin, clockPin, MSBFIRST, ByteHigh_Reset);
shiftOut(dataPin, clockPin, MSBFIRST, ByteLow_Reset);
digitalWrite(latchPin, HIGH); // Move the data from shift registers to output pins
delay(1000);

}

}

void loop() {

}

#include // Library for LCD

int latchPin = 10;
int clockPin = 11;
int dataPin = 12;
unsigned int y = 0;

LiquidCrystal_I2C lcd20x4_24 = LiquidCrystal_I2C(0x24, 20, 4); // Change to (0x27,20,4) for 20×4 LCD.

int numOfRegisters = 2;
byte* registerState;

void HeartOfStainlessSteel_20x4_24() {
lcd20x4_24.init();
lcd20x4_24.backlight();

lcd20x4_24.init();
lcd20x4_24.backlight();

lcd20x4_24.setCursor(0, 0); // 4th column 1st row
lcd20x4_24.print(” “);

lcd20x4_24.setCursor(0, 1); // 9th column 2nd row
lcd20x4_24.print(” “);

lcd20x4_24.setCursor(0, 2); // 7th column 3rd row
lcd20x4_24.print(” “);

lcd20x4_24.setCursor(3, 3); // 3rd column 4th row
lcd20x4_24.print(“LCD 20×4: 0x24”);

}

void setup() {
Serial.begin(9600);
// These control the LCD displays
HeartOfStainlessSteel_20x4_24();

pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);

for ( int x = 0; x < 16; x++ ) {

y = 0.5 + pow(2,x);
Serial.print(x);
Serial.print(” “);
Serial.print(y);
Serial.print(“\n”);

//Mask counter with 1111111100000000 to select high order byte and divide by 256 to scale to a 8 bit output
int ByteHigh_Test = (y & 65280)/256;
//Mask counter with 0000000011111111 to select low order byte
int ByteLow_Test = y & 255;

//display integer
lcd20x4_24.setCursor(0, 0); // 1st column 1st row
lcd20x4_24.print(“LED: “);
lcd20x4_24.setCursor(5, 0); // 4th column 1st row
lcd20x4_24.print(x + 1);

lcd20x4_24.setCursor(8, 0); // 1st column 1st row
lcd20x4_24.print(“Int: “);
lcd20x4_24.setCursor(13, 0); // 4th column 1st row
lcd20x4_24.print(y);

//binary display
lcd20x4_24.setCursor(0, 1); // 1st column 2nd row
lcd20x4_24.print(“Bin: “);
lcd20x4_24.setCursor(0, 2); // 4th column 2nd row
lcd20x4_24.print(y, BIN);

digitalWrite(latchPin, LOW); //When the latchPin goes from low to high, the data gets moved from the shift registers to the output pins
shiftOut(dataPin, clockPin, MSBFIRST, ByteHigh_Test);
shiftOut(dataPin, clockPin, MSBFIRST, ByteLow_Test);
digitalWrite(latchPin, HIGH); // Move the data from shift registers to output pins
delay(1000);

//reset LEDs to off
int ByteHigh_Reset = 0;
int ByteLow_Reset = 0;

digitalWrite(latchPin, LOW); //When the latchPin goes from low to high, the data gets moved from the shift registers to the output pins
shiftOut(dataPin, clockPin, MSBFIRST, ByteHigh_Reset);
shiftOut(dataPin, clockPin, MSBFIRST, ByteLow_Reset);
digitalWrite(latchPin, HIGH); // Move the data from shift registers to output pins
delay(1000);

}

}

void loop() {

}