So I made an 8x8 matrix of LEDs in a common cathode arrangement. Only one column is ever on at any time, but they cycle from left to right so quick that you and your camera can't get to see that little artefact. This does save on power though so the whole layer can be run directly from the arduino LeoStick in the top right of picture. Thanks again to Freetronics for giving those little gems away at LCA!
8x8 LED matrix, two 595 shifties and a ULN2003 current sink from Ben Martin on Vimeo.
The LEDs to light on a row are selected by a 595 shift register providing power for each row. The resistors are on the far right of the grid leading to that shift register. The cathodes for each individual column are connected together leading to the top of the grid (as seen in the video). Those head over to a uln2003 current sink IC. In the future I'll use either two 2003 chips or one single 2803 (which can do all 8 columns at once) to get the first column to light up too.
The uln2003 is itself controlled by supplying power to the opposite side to select which column's cathodes will be grounded at any given moment. The control of the uln2003 is also done by a 595 shift register which is connected to the row shifty too. The joy of all this is you can pump in the new state and latch the shift registers at once to apply the new row pattern and select which column is lit.
The joy of this design is that I can add 8x8 layers on top at the cost of 8 resistors and one 595 to perform row select.
There are also some still images of the array if you're peaked.
The 595 chips can be had for around 40c a pop and the uln2003 for about 30c. LEDs in quantity 500+ go at around 5-7c a pop.
The code is fairly unimaginative, mainly to see how well the column select works and how detectable it is. In the future I should setup a "framebuffer" to run the show and have a timer refresh the array automatically...
#define DATA 6
#define LATCH 8
#define CLOCK 10 // digital 10 to pin 11 on the 74HC595
for ( i = 0; i < 256; i++ )
int col = 1;
for( col = 1; col < 256; col <<= 1 )
shiftOut(DATA, CLOCK, MSBFIRST, col );
shiftOut(DATA, CLOCK, MSBFIRST, i );