MAX7219 problems

I am trying to control a grid of 8x8 LED’s using the Arduino. I’ve been referencing this page:
http://www.arduino.cc/playground/LEDMatrix/Max7219 to set-up my hardware, which is a single 7219 chip. I have successfully been able to turn on a single LED, but as soon as I try to add another one (row) to a column, the new LED will come on, but the original one will turn off. In terms of the code below, the call to
maxSingle(1,1);
will work, until I try to call

 maxSingle(1,8);

then, then column 1, row 1 quits working.
I have started to comment next to each command, how the code relates (at least from my experimenting) to the pins on the chip (Seg D, Dig 0, etc.)

Here is my complete code:

int dataIn = 12; int load = 10; int clock = 11;

int maxInUse = 1; //change this variable to set how many MAX7219's you'll use

int e = 0; // just a varialble

                     // define max7219 registers

byte max7219_reg_noop = 0x00; byte max7219_reg_digit0 = 0x01; byte max7219_reg_digit1 = 0x02; byte max7219_reg_digit2 = 0x03; byte max7219_reg_digit3 = 0x04; byte max7219_reg_digit4 = 0x05; byte max7219_reg_digit5 = 0x06; byte max7219_reg_digit6 = 0x08; byte max7219_reg_digit7 = 0x01; byte max7219_reg_decodeMode = 0x09; byte max7219_reg_intensity = 0x0a; byte max7219_reg_scanLimit = 0x0b; byte max7219_reg_shutdown = 0x0c; byte max7219_reg_displayTest = 0x0f;

void putByte(byte data) {

  byte i = 8;
  byte mask;
  while(i > 0) {
    mask = 0x01 << (i - 1);      // get bitmask
    digitalWrite( clock, LOW);   // tick
    if (data & mask){            // choose bit
      digitalWrite(dataIn, HIGH);// send 1
    }else{
      digitalWrite(dataIn, LOW); // send 0
    }
    digitalWrite(clock, HIGH);   // tock
    --i;                         // move to lesser bit
  }

}

void maxSingle( byte reg, byte col) { //maxSingle is the "easy" function to use for a //single max7219

  digitalWrite(load, LOW);       // begin     
  putByte(reg);                  // specify register
  putByte(col);//((data & 0x01) * 256) + data >> 1); // put data   
  digitalWrite(load, LOW);       // and load da shit
  digitalWrite(load,HIGH); 

}

void maxAll (byte reg, byte col) { // initialize all MAX7219's in the system

  int c = 0;
  digitalWrite(load, LOW);  // begin     
  for ( c =1; c<= maxInUse; c++) {
  putByte(reg);  // specify register
  putByte(col);//((data & 0x01) * 256) + data >> 1); // put data
    }
  digitalWrite(load, LOW);
  digitalWrite(load,HIGH);

}

void maxOne(byte maxNr, byte reg, byte col) { //maxOne is for adressing different MAX7219's, whilele having a couple of them cascaded

  int c = 0;
  digitalWrite(load, LOW);  // begin     

  for ( c = maxInUse; c > maxNr; c--) {
    putByte(0);    // means no operation
    putByte(0);    // means no operation
  }

  putByte(reg);  // specify register
  putByte(col);//((data & 0x01) * 256) + data >> 1); // put data 

  for ( c =maxNr-1; c >= 1; c--) {
    putByte(0);    // means no operation
    putByte(0);    // means no operation
  }

  digitalWrite(load, LOW); // and load da shit
  digitalWrite(load,HIGH); 

}

void setup () {

  pinMode(dataIn, OUTPUT);
  pinMode(clock,  OUTPUT);
  pinMode(load,   OUTPUT);

  beginSerial(9600);
  digitalWrite(13, HIGH);  

//////////////////////////////////////////////initiation of the max 7219

  maxSingle(max7219_reg_scanLimit, 0x07);      
  maxSingle(max7219_reg_decodeMode, 0x00);  // using an led matrix (not digits)
  maxSingle(max7219_reg_shutdown, 0x01);    // not in shutdown mode
  maxSingle(max7219_reg_displayTest, 0x00); // no display test
   for (e=1; e<=8; e++) {    // empty registers, turn all LEDs off 
    maxSingle(e,0);
  }
  maxSingle(max7219_reg_intensity, 0x0f & 0x0f);    // the first 0x0f is the value you can set
                                                  // range: 0x00 to 0x0f

}

void loop () {

   maxSingle(1,1);                       //  + - - - - - - -   Dig 0, Seg G
   //maxSingle(2,2);                       //  - + - - - - - -
  // maxSingle(3,4);                       //  - - + - - - - -
  // maxSingle(4,8);                       //  - - - + - - - -   Dig 3, Seg D
  // maxSingle(5,16);                      //  - - - - + - - -
  // maxSingle(6,32);                      //  - - - - - + - -
  // maxSingle(7,64);                      //  - - - - - - + -
  // maxSingle(8,128);                     //  - - - - - - - +

   maxSingle(1,8);                       //  - - - + - - - -   Dig 0, Seg D


  delay(2000);

}

Hi
have a look at the playground article again:
maxSingle(1,1); turns on the led column 1 , row 1
maxSingle(1,8); also turns on a single Led : column 4, row 1

If you want them both to light up you just have to add up the values
maxSingle(1,9) should light up both leds.

If you are not familiar with this bit-twiddling stuff, I suggest you have a look at this tutorial :
http://www.arduino.cc/playground/Code/BitMath

Eberhard

thanks! that was the problem.

I read that in the playground article, but thought the functions were taking care of it (adding up the columns) somehow.

cheers,

Doug