Here my method. I use shiftOut(); to send the data into the MAX7219.
And I recomend you download the datasheet here : http://www.datasheetcatalog.org/datasheet/maxim/MAX7219-MAX7221.pdf and read it multiple times to make sure you understand. Don't forget about R set. It limit the current going into a segment. I set my circuit about 56 K to 68 K. I want to limit the segments current between 5 mA to 15 mA to be safe. If you want a bigger currents, well use a transistor to control the segments.
Here my test code. My code is simply this : Display 1,2,3,4,5,6,7,8 for a second and display 8,7,6,5,4,3,2,1. I use Mode 3. For a multiples leds paterns, use No Mode. To further understand this... read the datasheet. The MAX7219 init is in the setup. I don't use SPI. I use shiftOut(). I have the flexibility of choosing the output pins. And beside, I have 70 chips at my place. I better learn to use it. I do have a code for a multiples leds. I use No Mode. The other test code simply count 0 to 255 in binary. Use Leds arrays has leds.
If you want to design program for the MAX7219, think in HEX and in BINARY. Use Arrays a lots. And a lots of for() loops.
Mode 3 test code.
const byte datapin = 12;
const byte latchpin = 11;
const byte clockpin = 10;
void setup()
{
pinMode(datapin, OUTPUT);
pinMode(latchpin, OUTPUT);
pinMode(clockpin, OUTPUT);
// set : Normal Mode
digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, 0x0C );
shiftOut(datapin, clockpin, MSBFIRST, 0x01 );
digitalWrite(latchpin, HIGH);
delay(5);
// set : Normal Operation
digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, 0x0F );
shiftOut(datapin, clockpin, MSBFIRST, 0x00 );
digitalWrite(latchpin, HIGH);
delay(5);
// set : Intensity
digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, 0x0A );
shiftOut(datapin, clockpin, MSBFIRST, 0x0B );
digitalWrite(latchpin, HIGH);
delay(5);
// set : Numbers of digits
digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, 0x0B );
shiftOut(datapin, clockpin, MSBFIRST, 0x07 );
digitalWrite(latchpin, HIGH);
delay(5);
// set : Decode Mode Register
digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, 0x09 );
shiftOut(datapin, clockpin, MSBFIRST, 0xFF );
digitalWrite(latchpin, HIGH);
}
void loop()
{
byte j;
for (int i=1;i<9;i++)
{
digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, i );
shiftOut(datapin, clockpin, MSBFIRST, i );
digitalWrite(latchpin, HIGH);
delay(5);
}
delay(2000);
j = 8;
for (int i=1;i<9;i++)
{
digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, i );
shiftOut(datapin, clockpin, MSBFIRST, j );
digitalWrite(latchpin, HIGH);
delay(5);
j--;
}
delay(2000);
}
Here the No Mode test code.
const byte datapin = 12;
const byte latchpin = 11;
const byte clockpin = 10;
byte display_number[8] = {0,0,0,0,0,0,0,0};
void setup()
{
pinMode(datapin, OUTPUT);
pinMode(latchpin, OUTPUT);
pinMode(clockpin, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
// set : Normal Mode
digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, 0x0C );
shiftOut(datapin, clockpin, MSBFIRST, 0x01 );
digitalWrite(latchpin, HIGH);
delay(5);
// set : Normal Operation
digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, 0x0F );
shiftOut(datapin, clockpin, MSBFIRST, 0x00 );
digitalWrite(latchpin, HIGH);
delay(5);
// set : Intensity
digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, 0x0A );
shiftOut(datapin, clockpin, MSBFIRST, 0x0B );
digitalWrite(latchpin, HIGH);
delay(5);
// set : Numbers of digits
digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, 0x0B );
shiftOut(datapin, clockpin, MSBFIRST, 0x07 );
digitalWrite(latchpin, HIGH);
delay(5);
// set : Decode Mode Register
digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, 0x09 );
shiftOut(datapin, clockpin, MSBFIRST, 0x00 );
digitalWrite(latchpin, HIGH);
delay(5);
// set display to zero
display_the_max();
}
void loop()
{
for (int j=0;j<8;j++)
{
for (int i=0;i<256;i++)
{
display_number[j]=lowByte(i);
display_the_max();
delay(25);
}
display_number[j]=0;
display_the_max();
digitalWrite(13, HIGH);
delay(5000);
digitalWrite(13, LOW);
}
digitalWrite(13, HIGH);
delay(2000);
digitalWrite(13, LOW);
}
void display_the_max()
{
for (int k=0; k<8;k++)
{
digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, (k+1));
shiftOut(datapin, clockpin, MSBFIRST, display_number[k]);
digitalWrite(latchpin, HIGH);
delay(5);
}
}