4x4 RGB Multiplex Flicker problem


I am planning to make 8x8 RGB Led Table. Firstly i made a 4x4 prototype, i used 74HC595 for the anodes and TLC5940 for the R, G, B. Anodes in the columns connected together and R,G,B in the rows connected together as shown in the scheme.
The 74HC595 and TLC5940 are connected to the Arduino. I didn’t use any capacitors or transistors.

The problem is that when i want to light up all the Red leds (or Blues or Greens) first row lights well without flickering but all the other leds are flickering and they are dimmer than the first row. I need help what could be the problem?

The code ise given below.

#include "Tlc5940.h"

int latchPin = 6;
int clockPin = 7;
int dataPin = 5;

byte data;
byte dataArray[10];

void setup() {

  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  Tlc.init(0); // initialise TLC5940 and set all channels off
  dataArray[1] = 0x01; 
  dataArray[2] = 0x02; 
  dataArray[3] = 0x04;
  dataArray[4] = 0x08;  
  dataArray[5] = 0xFF; 

void loop() {
  digitalWrite(latchPin, 0);
  shiftOut(dataPin, clockPin, dataArray[5]);
  digitalWrite(latchPin, 1);
  for(int j=0;j<12;j=j+3)
    Tlc.set(j, 4095);

// the heart of the program
void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {
  // This shifts 8 bits out MSB first,
  //on the rising edge of the clock,
  //clock idles low

  //internal function setup
  int i=0;
  int pinState;
  pinMode(myClockPin, OUTPUT);
  pinMode(myDataPin, OUTPUT);

  //clear everything out just in case to
  //prepare shift register for bit shifting
  digitalWrite(myDataPin, 0);
  digitalWrite(myClockPin, 0);

  //for each bit in the byte myDataOut?
  //This means that %00000001 or "1" will go through such
  //that it will be pin Q0 that lights.
  for (i=7; i>=0; i--)  {
    digitalWrite(myClockPin, 0);

    //if the value passed to myDataOut and a bitmask result
    // true then... so if we are at i=6 and our value is
    // %11010100 it would the code compares it to %01000000
    // and proceeds to set pinState to 1.
    if ( myDataOut & (1<<i) ) {
      pinState= 1;
    else { 
      pinState= 0;

    //Sets the pin to HIGH or LOW depending on pinState
    digitalWrite(myDataPin, pinState);
    //register shifts bits on upstroke of clock pin  
    digitalWrite(myClockPin, 1);
    //zero the data pin after shift to prevent bleed through
    digitalWrite(myDataPin, 0);

  //stop shifting
  digitalWrite(myClockPin, 0);


Hi tansel and welcome,

Suggest you get rid of your shiftOut() function and replace it with the standard Arduino shiftOut() function.

Next, looking at this part:

  for(int j=0;j<12;j=j+3)
    Tlc.set(j, 4095);

Should the Tlc.clear() and Tlc.update() really be inside the loop?

Lastly, when does your sketch ever use dataArray[1] to dataArray[4] ? Are they not supposed to be part of the multiplexing sequence? I think you have a little more code to write!


Thanks for the reply and advices.

When i use standard Shifout nothing changes, same problem. Tlc.update must be in the loop otherwise only the last row lights up, but i am not sure about the Tlc.clear.
I tried some other animations like lighting up one by one, row by row and changing colors, i used the other array values there. They also work fine but when it comes to light them all there is flicker :~

Ok, I see why the tlc.clear () and tlc.update () are in the loop now. The loop is performing the multiplexing.

I think the problem may be that the '595 can't provide enough current to light all the rows at once. If you read the data sheet, although each of its outputs can source 25mA, there is a limit of 70mA for the whole chip. I wonder if you are exceeding that. One row is getting the lion's share of the current and the other rows are getting starved.

You could maybe put an npn transistor as an emitter follower on each output of the '595. This would boost the current, but would also drop 0.6~0.7V. With the drop caused by the tlc as well, there might not be enough voltage for the blue and green leds.

Another suggestion would be pnp or p-channel mosfets attached to the '595 outputs.

Easiest of all would be to forget the tlc, the 595 and the common anode leds and use "neopixels" as adafruit call them. These are rgb leds with built-in ws2812 drivers. Just connect the power and data line in one long chain, install the neopixel library and take it from there.


I remove the Tlc.clear() and the flicker problem is solved but i don't understand why. I think i will need that for the animations.