Interfacing Arduino LED Matrix 8*32

Hello I have bought 4 8*8 LED Matrix.


And I saw this circuit and I have built it (eventually have all the components).
Do anybody here know how to program the LED Matrix?
Is there any available library for LED Matrix and those shift registers?

Thank you.
:slight_smile:

Fairly easy. If follows this generic process:

  1. Blank the display - you can ignore this if your OE pin is hardwared;
  2. Present the data on the latch;
  3. Pulse the hc595's clock line just once - this is the tricky part, as you need to test if the end of the last column has been reached. If so, you need to present the data bit.

The scan starts on the left most column.

  1. is really the key to allow this type of display to be updated quickly.

arjuna_wahid:
Hello I have bought 4 8*8 LED Matrix.

And I saw this circuit and I have built it (eventually have all the components).
Do anybody here know how to program the LED Matrix?
Is there any available library for LED Matrix and those shift registers?

Thank you.
:slight_smile:

Hi,

For clarification -- do you want help to program the 832 matrix that you built exactly like the schematic you attached (including the At90s2313), or do you want to build an 832 matrix similar to the schematic but controlled by an Arduino?

For the former, it looks like you'd use the SPI bus to communicate between the Arduino's ATMega and your circuit's At90s2313, but you'd have to look at the At90s2313's programming to see how you communicate with it.

For the latter, the easiest way I know to do what you want is to replace the 74hc259 with another 74hc595 (outputs driving the ULN2003, inputs on the same bus as the rest of the 74hc595s) and use the ShiftMatrixPWM library.

Good luck!

I am going to try it differently:

#define DIGS_MAX 8 //max number of matrix

//display buffer
//organization:
//row0: display-1(Q0..Q7), ..., display-8(Q0..Q7);
//...
//row7: display-1(Q0..Q7), ..., display-8(Q0..Q7);

unsigned char dispBuffer[8*DIGS_MAX); //display buffer

void display(void) {
  static unsigned char row=0; current row
  unsigned char *ptr=&dipBuffer[8*row+DIGS_MAX-1]; //pointer to display buffer, to speed up execution
  shift_out(*ptr--); //send the right most byte
  shift_out(*ptr--); //send the 2nd right most byte
  ...
  shift_out(*ptr  ); //send the left most byte
  
  row_on(row++); //turn on the current row
  latch_display(); //latch the data onto hc595

  //update row
  if (row==DIGS_MAX) row = 0; //wrap around row
}

So each time you call display, it goes out one row. If you put this function in a timer isr, it will automatically update the display. All you do is to load up dispBuffer[] with an image.