Working on using an Arduino and a Maxim7219 to control 292 LEDs in a display.
All of the literature on the Maxim7219 seems to be for controlling a matrix or a seven segment LED display.
The LEDs displayed in the project are in a curvilinear line.
Have worked out a PCB that breaks out the LEDs into a linear display.
But have a bit of rat's nest in construction because the anode from any one
LED is connected to cathode on a different group of connections.
This PCB is based on a schematic (for a matrix display) from the Arduino forum at
http://playground.arduino.cc/Main/MAX72XXHardware
That is, in the diagram of the PCB marked 'MAXIM 7219 Breakout
171230', above, sixteen groups of eight connections are shown. The first LED 000,
cathode is in the group marked 2 and the anode to the same LED is going to cathode group 22.
The second anode is in group 14 and the cathode group 22.
And so on thru 64 LEDs until the PCB that looks like this in the beginning
looks but like this when complete.
A real headache for construction and a nightmare for troubleshooting.
So began looking at a way to use PCB traces to simplify the construction. Because the PCB
is four layers the voltage source, ground, Clock, Load and DIN are in one plane and
the anodes and cathodes are in the remaining three planes.
In this diagram of the anode/cathode planes of the PCB just the first sixteen LEDS are traced w/o
the voltage source, ground, Clock, Load and DIN.
The LEDs are numbered
000, 001, 002,...007, 010, 011, 012, ...017.
This is to align with Arduino sketch:
lc.setLed(0,0,0,true);
delay(delaytime2);
lc.setLed(0,0,1,true);
delay(delaytime2);
lc.setLed(0,0,2,true);
(Complete sketch copied to this post at end.)
This arrangement would put the LED anode/cathode pairs next to each other, a marked improvement.
As I worked thru the traces for another $400 PCB order I wondered if there was away to
do, programatically, what the traces on the improved PCB would do electronicly.
To this end some research was conducted and a sketch was found that uses what seems to be
binary code to control a 7-segment.
The code can be found at
http://tronixstuff.com/2013/10/11/tutorial-arduino-max7219-led-display-driver-ic/
but part of it is
void loop(){
scrollMessage(scrollText);
scrollFont();
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
prog_uchar font5x7 [] PROGMEM = { //Numeric Font Matrix (Arranged as 7x font data + 1x kerning data)
B00000000, //Space (Char 0x20)
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
6,
Have done Javascript and C# programming but cannot make
heads or tails of it. Is the 'B' for binary?
The comment says '7x font data + 1x kerning data'
but it looks like nine characters to me , not 8.
So that's the question: Does anyone know how the sketch now
being used could be adapted to address the LEDs so that
the connections are parallel to each other as on the PCB marked
Maxim 7219 Breakout. That is, the anode and cathode can
be deployed shoulder to shoulder in a more orderly fashion?
It would save me a fistfull of cash if programmatic solution
over an electronic one could be developed. Not asking for
a complete solution just some thing to get me going.
Thanks
Allen in Dallas
All of the literature on the Maxim7219 seems to be for controlling a matrix or a seven segment LED display.
The LEDs displayed in the project are in a curvilinear line.
Have worked out a PCB that breaks out the LEDs into a linear display.

But have a bit of rat's nest in construction because the anode from any one
LED is connected to cathode on a different group of connections.
This PCB is based on a schematic (for a matrix display) from the Arduino forum at
http://playground.arduino.cc/Main/MAX72XXHardware
That is, in the diagram of the PCB marked 'MAXIM 7219 Breakout
171230', above, sixteen groups of eight connections are shown. The first LED 000,
cathode is in the group marked 2 and the anode to the same LED is going to cathode group 22.
The second anode is in group 14 and the cathode group 22.
And so on thru 64 LEDs until the PCB that looks like this in the beginning
looks but like this when complete.
A real headache for construction and a nightmare for troubleshooting.
So began looking at a way to use PCB traces to simplify the construction. Because the PCB
is four layers the voltage source, ground, Clock, Load and DIN are in one plane and
the anodes and cathodes are in the remaining three planes.

In this diagram of the anode/cathode planes of the PCB just the first sixteen LEDS are traced w/o
the voltage source, ground, Clock, Load and DIN.
The LEDs are numbered
000, 001, 002,...007, 010, 011, 012, ...017.
This is to align with Arduino sketch:
lc.setLed(0,0,0,true);
delay(delaytime2);
lc.setLed(0,0,1,true);
delay(delaytime2);
lc.setLed(0,0,2,true);
(Complete sketch copied to this post at end.)
This arrangement would put the LED anode/cathode pairs next to each other, a marked improvement.
As I worked thru the traces for another $400 PCB order I wondered if there was away to
do, programatically, what the traces on the improved PCB would do electronicly.
To this end some research was conducted and a sketch was found that uses what seems to be
binary code to control a 7-segment.
The code can be found at
http://tronixstuff.com/2013/10/11/tutorial-arduino-max7219-led-display-driver-ic/
but part of it is
void loop(){
scrollMessage(scrollText);
scrollFont();
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
prog_uchar font5x7 [] PROGMEM = { //Numeric Font Matrix (Arranged as 7x font data + 1x kerning data)
B00000000, //Space (Char 0x20)
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
6,
Have done Javascript and C# programming but cannot make
heads or tails of it. Is the 'B' for binary?
The comment says '7x font data + 1x kerning data'
but it looks like nine characters to me , not 8.
So that's the question: Does anyone know how the sketch now
being used could be adapted to address the LEDs so that
the connections are parallel to each other as on the PCB marked
Maxim 7219 Breakout. That is, the anode and cathode can
be deployed shoulder to shoulder in a more orderly fashion?
It would save me a fistfull of cash if programmatic solution
over an electronic one could be developed. Not asking for
a complete solution just some thing to get me going.
Thanks
Allen in Dallas
C:
#include "LedControl.h"
LedControl lc=LedControl(12,11,10,1);
unsigned long delaytime=500;
unsigned long delaytime2=100;
void setup() {
lc.shutdown(0,false);
/* Set the brightness to a medium values */
lc.setIntensity(0,8);
/* and clear the display */
lc.clearDisplay(0);
}
void loop() {
lc.setLed(0,0,0,true);
delay(delaytime2);
lc.setLed(0,0,1,true);
delay(delaytime2);
lc.setLed(0,0,2,true);
delay(delaytime2);
lc.setLed(0,0,3,true);
delay(delaytime2);
lc.setLed(0,0,4,true);
delay(delaytime2);
lc.setLed(0,0,5,true);
delay(delaytime2);
lc.setLed(0,0,6,true);
delay(delaytime2);
lc.setLed(0,0,7,true);
delay(delaytime2);
lc.setLed(0,0,0,false);
delay(delaytime2);
lc.setLed(0,0,1,false);
delay(delaytime2);
lc.setLed(0,0,2,false);
delay(delaytime2);
lc.setLed(0,0,3,false);
delay(delaytime2);
lc.setLed(0,0,4,false);
delay(delaytime2);
lc.setLed(0,0,5,false);
delay(delaytime2);
lc.setLed(0,0,6,false);
delay(delaytime2);
lc.setLed(0,0,7,false);
delay(delaytime2);
lc.setLed(0,1,0,true);
delay(delaytime2);
lc.setLed(0,1,1,true);
delay(delaytime2);
lc.setLed(0,1,2,true);
delay(delaytime2);
lc.setLed(0,1,3,true);
delay(delaytime2);
lc.setLed(0,1,4,true);
delay(delaytime2);
lc.setLed(0,1,5,true);
delay(delaytime2);
lc.setLed(0,1,6,true);
delay(delaytime2);
lc.setLed(0,1,7,true);
delay(delaytime2);
lc.setLed(0,1,0,false);
delay(delaytime2);
lc.setLed(0,1,1,false);
delay(delaytime2);
lc.setLed(0,1,2,false);
delay(delaytime2);
lc.setLed(0,1,3,false);
delay(delaytime2);
lc.setLed(0,1,4,false);
delay(delaytime2);
lc.setLed(0,1,5,false);
delay(delaytime2);
lc.setLed(0,1,6,false);
delay(delaytime2);
lc.setLed(0,1,7,false);
delay(delaytime2);
lc.setLed(0,2,0,true);
delay(delaytime2);
lc.setLed(0,2,1,true);
delay(delaytime2);
lc.setLed(0,2,2,true);
delay(delaytime2);
lc.setLed(0,2,3,true);
delay(delaytime2);
lc.setLed(0,2,4,true);
delay(delaytime2);
lc.setLed(0,2,5,true);
delay(delaytime2);
lc.setLed(0,2,6,true);
delay(delaytime2);
lc.setLed(0,2,7,true);
delay(delaytime2);
lc.setLed(0,2,0,false);
delay(delaytime2);
lc.setLed(0,2,1,false);
delay(delaytime2);
lc.setLed(0,2,2,false);
delay(delaytime2);
lc.setLed(0,2,3,false);
delay(delaytime2);
lc.setLed(0,2,4,false);
delay(delaytime2);
lc.setLed(0,2,5,false);
delay(delaytime2);
lc.setLed(0,2,6,false);
delay(delaytime2);
lc.setLed(0,2,7,false);
delay(delaytime2);
lc.setLed(0,3,0,true);
delay(delaytime2);
lc.setLed(0,3,1,true);
delay(delaytime2);
lc.setLed(0,3,2,true);
delay(delaytime2);
lc.setLed(0,3,3,true);
delay(delaytime2);
lc.setLed(0,3,4,true);
delay(delaytime2);
lc.setLed(0,3,5,true);
delay(delaytime2);
lc.setLed(0,3,6,true);
delay(delaytime2);
lc.setLed(0,3,7,true);
delay(delaytime2);
lc.setLed(0,3,0,false);
delay(delaytime2);
lc.setLed(0,3,1,false);
delay(delaytime2);
lc.setLed(0,3,2,false);
delay(delaytime2);
lc.setLed(0,3,3,false);
delay(delaytime2);
lc.setLed(0,3,4,false);
delay(delaytime2);
lc.setLed(0,3,5,false);
delay(delaytime2);
lc.setLed(0,3,6,false);
delay(delaytime2);
lc.setLed(0,3,7,false);
delay(delaytime2);
lc.setLed(0,4,0,true);
delay(delaytime2);
lc.setLed(0,4,1,true);
delay(delaytime2);
lc.setLed(0,4,2,true);
delay(delaytime2);
lc.setLed(0,4,3,true);
delay(delaytime2);
lc.setLed(0,4,4,true);
delay(delaytime2);
lc.setLed(0,4,5,true);
delay(delaytime2);
lc.setLed(0,4,6,true);
delay(delaytime2);
lc.setLed(0,4,7,true);
delay(delaytime2);
lc.setLed(0,4,0,false);
delay(delaytime2);
lc.setLed(0,4,1,false);
delay(delaytime2);
lc.setLed(0,4,2,false);
delay(delaytime2);
lc.setLed(0,4,3,false);
delay(delaytime2);
lc.setLed(0,4,4,false);
delay(delaytime2);
lc.setLed(0,4,5,false);
delay(delaytime2);
lc.setLed(0,4,6,false);
delay(delaytime2);
lc.setLed(0,4,7,false);
delay(delaytime2);
lc.setLed(0,5,0,true);
delay(delaytime2);
lc.setLed(0,5,1,true);
delay(delaytime2);
lc.setLed(0,5,2,true);
delay(delaytime2);
lc.setLed(0,5,3,true);
delay(delaytime2);
lc.setLed(0,5,4,true);
delay(delaytime2);
lc.setLed(0,5,5,true);
delay(delaytime2);
lc.setLed(0,5,6,true);
delay(delaytime2);
lc.setLed(0,5,7,true);
delay(delaytime2);
lc.setLed(0,5,0,false);
delay(delaytime2);
lc.setLed(0,5,1,false);
delay(delaytime2);
lc.setLed(0,5,2,false);
delay(delaytime2);
lc.setLed(0,5,3,false);
delay(delaytime2);
lc.setLed(0,5,4,false);
delay(delaytime2);
lc.setLed(0,5,5,false);
delay(delaytime2);
lc.setLed(0,5,6,false);
delay(delaytime2);
lc.setLed(0,5,7,false);
delay(delaytime2);
lc.setLed(0,6,0,true);
delay(delaytime2);
lc.setLed(0,6,1,true);
delay(delaytime2);
lc.setLed(0,6,2,true);
delay(delaytime2);
lc.setLed(0,6,3,true);
delay(delaytime2);
lc.setLed(0,6,4,true);
delay(delaytime2);
lc.setLed(0,6,5,true);
delay(delaytime2);
lc.setLed(0,6,6,true);
delay(delaytime2);
lc.setLed(0,6,7,true);
delay(delaytime2);
lc.setLed(0,6,0,false);
delay(delaytime2);
lc.setLed(0,6,1,false);
delay(delaytime2);
lc.setLed(0,6,2,false);
delay(delaytime2);
lc.setLed(0,6,3,false);
delay(delaytime2);
lc.setLed(0,6,4,false);
delay(delaytime2);
lc.setLed(0,6,5,false);
delay(delaytime2);
lc.setLed(0,6,6,false);
delay(delaytime2);
lc.setLed(0,6,7,false);
delay(delaytime2);
lc.setLed(0,7,0,true);
delay(delaytime2);
lc.setLed(0,7,1,true);
delay(delaytime2);
lc.setLed(0,7,2,true);
delay(delaytime2);
lc.setLed(0,7,3,true);
delay(delaytime2);
lc.setLed(0,7,4,true);
delay(delaytime2);
lc.setLed(0,7,5,true);
delay(delaytime2);
lc.setLed(0,7,6,true);
delay(delaytime2);
lc.setLed(0,7,7,true);
delay(delaytime2);
lc.setLed(0,7,0,false);
delay(delaytime2);
lc.setLed(0,7,1,false);
delay(delaytime2);
lc.setLed(0,7,2,false);
delay(delaytime2);
lc.setLed(0,7,3,false);
delay(delaytime2);
lc.setLed(0,7,4,false);
delay(delaytime2);
lc.setLed(0,7,5,false);
delay(delaytime2);
lc.setLed(0,7,6,false);
delay(delaytime2);
lc.setLed(0,7,7,false);
delay(delaytime2);
}
Last edited by a moderator: