the emitter follower setup on your rows is not the most ideal thing in the world, but its worked ok enough for me, question is where is the emitters connected in your columns?
The idea is to do column scanning method and run it at 100kHz.
Originally I had the exact same setup but I was using PNPs for the rows instead. The only problem I found with that setup was that when using a higher voltage source for the LEDs, when the PNPs bases were set as HIGH (+5v), the base voltage was still lower than the emitter voltage (+9v) so current was still flowing from the emitter to the collector. So basically i had no way to switch the PNPs off.
Why do you need 6-th row?
Why 3904, there are a lot of high power transistors.
My only questions are about the hardware itself.
Looks like this not only your problem. Running "software PWM" requires re-refreshing update speed much higher than you think, 100 Hz x N, where N - number of brightness levels. For 256 levels, it would jump up to 25.6 kHz, or just 40 usec per cycle. I'm not saying it's impossible, but code optimization would be necessary, which is out of discussion till we see your actual code.
I balance the on/off time so the maximum time spent in each LED adds up to 1ms.The total time to loop through the matrix is then 10ms so it is refreshing at 100Hz.Does that make sense?
I'm assuming that yes. A FWD voltage of 2.2 each, 2.2*3 = 6.6 + (0.7 * 2) (transistor drop) = 8v.
The answer to the PNP "problem" is either to use a potential divider driving the base, or an NPN driving transistor.