How to connect LED Matrix into Arduino using MAX 7219?
Bryan Chung had a tutorial still available on the Internet Archive on how to connect a LED Matrix to an Arduino using a MAX7219:


  Here is an experiment with an 8×8 LED
  matrix, driven by a MAX7219 IC,
  controlled through an Arduino
  micro-controller board. A custom PCB
  has been made by Tan from DinoTech to
  tidy up all the wires connecting the
  LED matrix and the IC. It comes with a
  separate 12V power supply, in order
  not to drain everything from the
  Arduino board.
  
  Only 4 wires are necessary to control
  the MAX7219 driver IC. They are the
  
  Data Clock Latch/load Ground
  
  The data and clock pins should match
  those for the shiftOut() command in
  Arduino. The latch pin will give a LOW
  to HIGH pulse after the shiftOut
  command. I have written the original
  program for Javelin Stamp. Since
  Arduino can only shift 8 bits of data,
  I have to use 2 separate commands to
  shift both the upper and lower bytes
  to the MAX7219, which needs a 2 bytes
  control for each command.
  
  For the data structure of the 8×8 LED
  matrix, I use a byte array – matrix of
  length 8. Each row in the matrix
  corresponds to the Y dimension. Each
  bit in a row corresponds to the X
  dimension. Digit 1 is on; 0 is off.
  The X direction is reversed and there
  is also an 1 bit shift. The
  updateLED() function caters for this.
  
  The first program is an animation of a
  single line motion.


int CLOCK = 12;
int LATCH = 13;
int DATA  = 11;
byte matrix[8];
int idx = 0;

void setup() {
  pinMode(CLOCK, OUTPUT);
  pinMode(LATCH, OUTPUT);
  pinMode(DATA,  OUTPUT);
  digitalWrite(CLOCK, LOW);
  digitalWrite(LATCH, LOW);
  digitalWrite(DATA,  LOW);
  initLED();
  clearLED();
}

void loop() {
  for (int j=0;j&lt;8;j++) {
    updateLED(idx, j, true);
  }
  refreshLED();
  delay(200);
  for (int j=0;j&lt;8;j++) {
    updateLED(idx, j, false);
  }
  refreshLED();
  delay(100);
  idx++;
  idx %= 8;
}

void ledOut(int n) {
  digitalWrite(LATCH, LOW);
  shiftOut(DATA, CLOCK, MSBFIRST, (n&gt;&gt;8));
  shiftOut(DATA, CLOCK, MSBFIRST, (n));
  digitalWrite(LATCH, HIGH);
  delay(1);
  digitalWrite(LATCH, LOW);
}

void initLED() {
  ledOut(0x0B07);
  ledOut(0x0A0C);
  ledOut(0x0900);
  ledOut(0x0C01);
}

void clearLED() {
  for (int i=0;i&lt;8;i++) {
    matrix[i] = 0x00;
  }
  refreshLED();
}

void refreshLED() {
  int n1, n2, n3;
  for (int i=0;i&lt;8;i++) {
    n1 = i+1;
    n2 = matrix[i];
    n3 = (n1&lt;&lt;8)+n2;
    ledOut(n3);
  }
}

void updateLED(int i, int j, boolean b) {
  int t = 1;
  int n = 0;
  int m = 0;
  if (j==0) {
    m = 7;
  }
  else {
    m = j-1;
  }
  n = t&lt;&lt;m;
  if (b) {
    matrix[i] = n | matrix[i];
  }
  else {
    n = ~n;
    matrix[i] = n &amp; matrix[i];
  }
}