RGB SMT LED Cube, resistors, drivers, and shift registers.

This is a better test program, I've cleaned things up, and added some more programs.

// TransistorCube  -- Test Program
#include <avr/pgmspace.h> // allows use of PROGMEM to store patterns in flash

#define CUBESIZE 4
#define PLANESIZE CUBESIZE*CUBESIZE
#define PLANETIME 3333 // time each plane is displayed in us -> 100 Hz refresh
#define TIMECONST 5 // multiplies DisplayTime to get ms - why not =100?

/*
** Defining pins in array makes it easier to rearrange how cube is wired
** This cube uses 2 plane pins and one led pin to light up any single LED.
** Pins 2-13 are used to control the 12 RG and B anodes (the rear to forward 4 LED)
** 5 banks of 4 transistors that are controlled by 8 arduino pins sink the cathodes.
** Pins (14,15,16,17) control 4 transistors that select the row(wide), and on each row.
** Pins (18,19,0,1)4 control 1 of 4 sets of 4 transistors that select the level(height). 
** First you have to turn on a row, then turn on a level to sink the LED.
** 
** This cube uses NPN transistors. We send HIGH to sink a row or level,
** and we send HIGH to turn on a anode color/forward/back LED. send LOW turns LEDs off.
*/

int RGBColumnPin[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
int RowPin[] = {14, 15, 16, 17};
int LevelPin[] = {18, 19, 0, 1};
int RowLevelCount  = 4;
int RGBColumnPinCount = 12;
// initialization
void setup()
{
  int pin; // loop counter
  // set up LED pins as output (active HIGH)
  for (pin=0; pin<(RGBColumnPinCount); pin++) {
    pinMode( RGBColumnPin[pin], OUTPUT );
  }
  // set up plane pin1 as outputs (active HIGH)
  for (pin=0; pin<CUBESIZE; pin++) {
    pinMode( RowPin[pin], OUTPUT );
  }
  // set up plane pin2 as outputs (active HIGH)
  for (pin=0; pin<CUBESIZE; pin++) {
    pinMode( LevelPin[pin], OUTPUT );
  }
}

void loop(){
// comment out lines below to run just the specific test you want
// to run. comment all but one routine at a time for best results.
// You can also change values inside the programs for different testing.

  loopFor();
  loopRand();
  loopRedWall();
  loopFullOn();

}

// This bit of programming uses 3 loops to sequence all 192 LEDs 
// one loop controls 1 LEDs anode pin, the 2 other loops control the cathode pin.
// You turn a pin HIGH, to light the LED (turn the anode HIGH, and turn 2 
// transistors HIGH to sink one cathode line (4 RGB LEDs)
// Turning all pins LOW, turns all LEDs off.
void loopFor()
{

   for(int thisRowPin = 0; thisRowPin < RowLevelCount; thisRowPin++){
     for(int thisLevelPin = 0; thisLevelPin < RowLevelCount; thisLevelPin++){
        for(int thisPin = 0; thisPin < RGBColumnPinCount; thisPin++){
        
        planesOff();
        digitalWrite(RGBColumnPin[thisPin],HIGH);
        digitalWrite(RowPin[thisRowPin],HIGH);
        digitalWrite(LevelPin[thisLevelPin],HIGH);
       
        
        delay(100); // increase value to slow down
        
        digitalWrite(RGBColumnPin[thisPin],LOW);
        digitalWrite(RowPin[thisRowPin],LOW);
        digitalWrite(LevelPin[thisLevelPin],LOW);
     //   delay(100); // if you want an off delay       
      }
    }
  } 
}

void loopRand()
{
    int randPin = random(12);
    int randPlane1 = random(4);
    int randPlane2 = random(4);
    
    planesOff();
    
    digitalWrite(RGBColumnPin[randPin],HIGH);
    digitalWrite(RowPin[randPlane1],HIGH);
    digitalWrite(LevelPin[randPlane2],HIGH);
        
    delay(50);
           
      
    digitalWrite(RGBColumnPin[randPin],LOW);
    digitalWrite(RowPin[randPlane1],LOW);
    digitalWrite(LevelPin[randPlane2],LOW);
     
     
}

void planesOff(){
    for(int thisRowPin = 0; thisRowPin < RowLevelCount; thisRowPin++){
        digitalWrite(RowPin[thisRowPin],LOW);
    }
    for(int thisLevelPin = 0; thisLevelPin < RowLevelCount; thisLevelPin++){
        digitalWrite(LevelPin[thisLevelPin],LOW);
    }
}


void loopRedWall()
{

   for(int thisRowPin = 0; thisRowPin < RowLevelCount; thisRowPin++){
        for(int thisPin = 0; thisPin < 4; thisPin++){
  
     for(int thisLevelPin = 0; thisLevelPin < RowLevelCount; thisLevelPin++){
         
        planesOff();
        digitalWrite(RGBColumnPin[0],LOW);
        digitalWrite(RGBColumnPin[1],HIGH);
        digitalWrite(RGBColumnPin[2],LOW);
        digitalWrite(RGBColumnPin[3],LOW);
        digitalWrite(RGBColumnPin[4],HIGH);
        digitalWrite(RGBColumnPin[5],LOW);
        digitalWrite(RGBColumnPin[6],LOW);
        digitalWrite(RGBColumnPin[7],HIGH);
        digitalWrite(RGBColumnPin[8],LOW);
        digitalWrite(RGBColumnPin[9],LOW);
        digitalWrite(RGBColumnPin[10],HIGH);
        digitalWrite(RGBColumnPin[11],LOW);
        digitalWrite(RowPin[thisRowPin],HIGH);
        digitalWrite(LevelPin[thisLevelPin],HIGH);
       
        
        delay(5); // increase to slow down
        
        digitalWrite(RGBColumnPin[0],LOW);
        digitalWrite(RGBColumnPin[1],LOW);
        digitalWrite(RGBColumnPin[2],LOW);
        digitalWrite(RGBColumnPin[3],LOW);
        digitalWrite(RGBColumnPin[4],LOW);
        digitalWrite(RGBColumnPin[5],LOW);
        digitalWrite(RGBColumnPin[6],LOW);
        digitalWrite(RGBColumnPin[7],LOW);
        digitalWrite(RGBColumnPin[8],LOW);
        digitalWrite(RGBColumnPin[9],LOW);
        digitalWrite(RGBColumnPin[10],LOW);
        digitalWrite(RGBColumnPin[11],LOW);
        digitalWrite(RowPin[thisRowPin],LOW);
        digitalWrite(LevelPin[thisLevelPin],LOW);
     //   delay(100);        
      }
    }
  } 
}
void loopFullOn()
// This program lights 12 LEDs ina line, and cycles through the row/levels
{
   for(int thisRowPin = 0; thisRowPin < RowLevelCount; thisRowPin++){
 //       for(int thisPin = 0; thisPin < 4; thisPin++){
  
     for(int thisLevelPin = 0; thisLevelPin < RowLevelCount; thisLevelPin++){
         
        planesOff();
        digitalWrite(RGBColumnPin[0],HIGH);
        digitalWrite(RGBColumnPin[1],HIGH);
        digitalWrite(RGBColumnPin[2],HIGH);
        digitalWrite(RGBColumnPin[3],HIGH);
        digitalWrite(RGBColumnPin[4],HIGH);
        digitalWrite(RGBColumnPin[5],HIGH);
        digitalWrite(RGBColumnPin[6],HIGH);
        digitalWrite(RGBColumnPin[7],HIGH);
        digitalWrite(RGBColumnPin[8],HIGH);
        digitalWrite(RGBColumnPin[9],HIGH);
        digitalWrite(RGBColumnPin[10],HIGH);
        digitalWrite(RGBColumnPin[11],HIGH);
        digitalWrite(RowPin[thisRowPin],HIGH);
        digitalWrite(LevelPin[thisLevelPin],HIGH);
       
        
        delay(100); //This controls speed, bigger is slower.
        
/*        digitalWrite(RGBColumnPin[0],LOW);
        digitalWrite(RGBColumnPin[1],LOW);
        digitalWrite(RGBColumnPin[2],LOW);
        digitalWrite(RGBColumnPin[3],LOW);
        digitalWrite(RGBColumnPin[4],LOW);
        digitalWrite(RGBColumnPin[5],LOW);
        digitalWrite(RGBColumnPin[6],LOW);
        digitalWrite(RGBColumnPin[7],LOW);
        digitalWrite(RGBColumnPin[8],LOW);
        digitalWrite(RGBColumnPin[9],LOW);
        digitalWrite(RGBColumnPin[10],LOW);
        digitalWrite(RGBColumnPin[11],LOW);
*/        
        digitalWrite(RowPin[thisRowPin],LOW);
        digitalWrite(LevelPin[thisLevelPin],LOW);
     //   delay(100);        
   //   }
    }
  } 
}