Change to BroHogan multiplexor

I have been playing with two cascaded 8x8 RGY (being bicolour) and the excellent multiplexing solution by BroHogan. http://www.arduino.cc/playground/Main/MultiplexMAX72xx I had two systems set up... BroHogans and mine which were wired as per his article above and duplicated. I wondered about timer 2 not being available and came up with the following, which worked perfectly beside the other and no steps in the counting were missed or corrupted and all three colours show. (not to say that something won't go wrong later when I move to 4 displays)

My version uses a 555 timer set to about 260Hz and provides a hardware interrupt on pin3. Another timer set to one second updates the display via interrupt on pin 2. All the timer 2 code was removed and also the start stop ISR wrappers. I am testing to try to find any conflicts that require them but it is likely to be OK because the first interrupt to arrive stops all others. If there is any adverse situation I may try Anding and separating the two interrupts. The code is below, it does not use loop and does not scan/send the rows so only those required are sent. There is a very slight visual pulse at the one second update time but no other flicker (any more than the original)

It may be of interest or useful to somebody.

//2 cascaded RGY Matrix v.1 22-10-10 Donone
//No timer used, 2 external interrupts with 555's or 556
//update 1sec & plex ~260Hz
//No wrappers for LED functions so no specific turn on/off only
//that causeed by update turning off other interrupts naturally.
//Sends new row data, changes only, per second. No loop().

//Modified from... and thank you...
/* RG Matrix Example   v.2 8/1/08  BroHogan
 * Demos 2 color 8x8 matrix driven by 2 MAX7821's
 */
#include "LedControl.h"                 // to drive the matrix
#define ISR_FREQ 190     //190=650Hz    // Sets the speed of the ISR - LOWER IS FASTER
                  
// prescaler is /128 -  125,000/ISR_FREQ+1 (i.e 249=500Hz, 190=650Hz)
// Tweaked depending on the overhead in the ISR & and other factors in the sketch
// Display will be slow if too FAST. Sketch will hang on delay() if way too fast!

#define RED 0
#define GREEN 1
#define REDa 0                       //MAX7219 for the red leds display a             
#define GREENa 1                     //MAX7219 for the green leds display a
#define REDb 2                       //MAX7219 for the red leds display b                          
#define GREENb 3                     //MAX7219 for the green leds display b

int maxInShutdown=RED;               // tells which MAX7219 is currently off
LedControl lc=LedControl(10,9,8,4);  // pins 12=DataIn, 11=CLK, 10=LOAD + 4 MAX7219s
volatile int count=0;

void setup() {
  lc.setIntensity(REDa,12);
  lc.setIntensity(REDb,12);
  lc.setIntensity(GREENa,15);            // 0 = dim, 15 = full brightness 15
  lc.setIntensity(GREENb,15);

  pinMode(2, INPUT); 
  attachInterrupt( 0, update, RISING );
  pinMode(3, INPUT);
  attachInterrupt(1, plex, RISING);
}

void loop() {
}

void Display() {
    lc.setRow(GREENb,count&7,count&255);
    lc.setRow(REDb,(count+1)&7,count&255);
    lc.setRow(GREENa,(count+1)&7,count&255);
    lc.setRow(REDa,(count&7), count&255);     
}

void plex() {  //This ISR toggles shutdown between the 2MAX7221's
  if(maxInShutdown==RED){
    lc.shutdown(GREENa,true);  // The order here is critical - Shutdown first!
    lc.shutdown(GREENb,true);  // The order here is critical - Shutdown first!
    lc.shutdown(REDa,false);   // . . . Then restart the other.
    lc.shutdown(REDb,false);   // . . . Then restart the other.
    maxInShutdown=GREEN;
 }
  else {
    lc.shutdown(REDa,true);
    lc.shutdown(REDb,true);
    lc.shutdown(GREENa,false);
    lc.shutdown(GREENb,false);
    maxInShutdown=RED;
  }
}  

void update()
{
  Display();
  count=count+1;
}
//not used
void ClearMatrix(){
  lc.clearDisplay(REDa);
  lc.clearDisplay(GREENa);
  lc.clearDisplay(REDb);
  lc.clearDisplay(GREENb);
}