"your pretty pro"
Well, yes & no - you just made me realize that Q1 needs to go to D1, Q1 to D2, Q2, to D2, Q3 to D4, Q4 to D5, Q5 to D6, Q6 to D7, and Q7 to the next chip as drawn.
So not quite straight across the chip, but 1 pin over.
All the Qs go to LEDs.
If the OE is grounded, then you will see some flicker as the data is shifted out.
If you take OE high while the data is shifted in, you will not see that flicker.
The you can write a loop that updates the anodes & cathodes to refresh the display
// code for an 24 x 16 array (8 RGB LEDs, 16 columns) as an example
// not all code parts shown, just the highlights
// set up an array for the cathode drives
byte cathodeslower[ ] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0,0,0,0,0,0,0,0}; // walking 1 for lower 8 NPNs
byte cathodeshigher[ ] = {0,0,0,0,0,0,0,0,0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; // walking 1 for upper 8 NPNs
byte anodes1 [16]; // array to hold 1st 3rd of RGB info
byte anodes2 [16]; // array to hold 2nd 3rd of RGB info
byte anodes3 [16]; // array to hold 3rd 3rd of RGB info
byte columncount;
byte oe = 2;
unsigned long updateTime=0;
void setup(){
pinMode (oe/, OUTPUT);
digitalWrite (oe/, HIGH);
SPI.begin;
}
void loop(){
// set up for blink without delay operation
if (millis() >=updateTime){
// yes, set up for next update
updateTime = updateTime +2; // update a column every 2 milliseconds, 16 columns at ~24 Hz rate
digitalWrite (oe, HIGH); // turn off display
SPI.transfer (anodes1[columncount]); // update anodes
SPI.transfer (anodes2[columncount]); // update anodes
SPI.transfer (anodes3[columncount]); // update anodes
SPI.transfer (cathodeslower[columncount]); // turn on a cathode
SPI.transfer (cathodesupper[columncount]); // turn on a cathode
digitalWrite (oe, LOW); / turn display back on
columncount = columncount+1; // update for next column
if (columncount == 16){columncount = 0;} // reset if reach the end
} //end display refresh
// now the fun part, for you!
// read buttons, or whatever processing you plan to do for patterns, etc.,
// and update anodes1, anodes2, anode3 as needed
//
} // end void loop