Custom matrix; dimming individual LEDs

This is some code to show you the basic idea of dimming LEDs in a matrix using PWM generated by the refresh routine.
In order to get to 30 complete refreshes per second you have to run the refresh every 0.2mS, this sample code just refreshes it at 1mS intervals.
It is untested, you might have to change the pin assignments to match the pins you have used I I had not access to your circuit when I wrote this.

/*
 * Dimming matrix - Mike Cook
 *
 * multiplexes a matrix and allows each LED to have its brightness controlled
 * with 16 levels of brightness for each
 * all rows on at any one time with the multiplexing happening on the columns
 ****** warning this is not tested code may contain nuts ********
 */

byte rowPins[] = {2, 3, 4, 5, 6, 7, 8, 9 };  // set up the 8 pins to use as row output - source for LEDs through a resistor
byte colPins[] = {10, 11, 12, 13, 14, 15, 16, 17 };  //  set up the 8 pins to use as column output driving a darlington pulling to ground
long int pattern[] = {0x01234567, 0x89ABCDEF, 0x76543210, 0xFEDCBA98, 0x01234567, 0x89ABCDEF, 0x76543210, 0xFEDCBA98};  // array to hold the pattern data
// each LED's brightness is stored in 4 bits in a long int giving data for all 8 LEDs in a column in one long int
long int refreshTime;

byte tick = 0, col = 0;  // global variables to keep track of what to do next

void setup()                    // is run once, when the sketch starts
{
  for(int i=0; i<8; i++){
  pinMode(rowPins[i], OUTPUT);      // sets the digital pins as output
  pinMode(colPins[i], OUTPUT);
  digitalWrite(rowPins[i], LOW);    // initally turn them all off
  digitalWrite(colPins[i], LOW);
  }
  refreshTime = millis();   // to see when to refresh the matrix
}

void loop()                     // run over and over again
{ 
   if(millis() >= refreshTime) {
      refreshTime = millis()+1;   // actually needs to be done every 0.2mS but here doing it every 1mS
      refreshMatrix();
     }

}  // end of loop() function

void refreshMatrix(){
  tick++;
  if((tick & 0x10) !=0) { // tick has overflowed so move on to next column
      tick = 0; // reset tick
      digitalWrite(colPins[col], LOW); // turn off the active coloum
        for(int i = 0; i<8; i++) { // turn off all the rows
          digitalWrite(rowPins[i], LOW);
           }
        col = (col +1 ) & 0xF; // increment column and wrap round if need be to keep value from 0 to 7
        digitalWrite(colPins[col], HIGH); // turn on new coloum
       }
   long int data = pattern[col];
   for(int i = 0; i<8; i++) { // turn on / off the individual LEDs
   if((data & 0xF) > tick) digitalWrite(rowPins[i], LOW); else digitalWrite(rowPins[i], HIGH);  // turn LED on or off that is do the PWM bit
   data = data >> 4; // move the pattern data so that the next LED information is in the bottom four bits
   }
}  // end of refresh matrix