16-segment LED displays - which driver IC?

Hi,

I'm trying to interface 8 digits of 16-segment alphanumeric LED displays (common cathode) with an Arduino. I'm having difficulties finding the right driver IC for this.

Has anyone done this before and what IC did you use?

I have found a few possible solutions but they all have some draw-backs.

First I was planning to use the famous MAX7219. This looked good until I realised that the 16-seg displays I have only have a single common cathode. So I can't connect 2 of these to one digit.

Then I was looking at the 74HC595 8 bit shift register. That should work, but I would need 2 of these per digit, so 16 in total. That seems a bit excessive. But this is probably the solution I would go with if nothing better comes up.

I have also found the MAX6955 or MAX6954. This IC would do all 8 digits in one IC and even has the "font" built in. That would be great but I can't find any place to buy these in the UK.

I can't believe that it is so hard to find a driver for 16-segment displays while it is so easy to get these for 7 segment displays.

Any suggestions welcome! :wink:

Thanks!!

only have a single common cathode. So I can't connect 2 of these to one digit.

Just a little thinking outside the box, can you AND two digit selects together.

74595s aren't really designed to drive LEDs, they will need driver chips and resistors.

Have a look at TLC5926 and TLC5927, 16 channels and constant current so only a single resistor to set current.


Rob

Thanks!

I did think about the MAX7219 for a while (since I already have the ICs) and was wondering whether I could just put some simple diodes in the digit select lines to prevent short circuit. I've drawn up some schematics for that. Have a look at the bottom where I put diodes in the lines. Any idea if that might work? I was also considering a XOR gate instead of the 2 diodes but I guess they wouldn't take the current and I'm not sure if adding transistors would interfere with the MAX's current sources.

here's my schematic:
http://yesyesserver.co.uk/temp/Arduino_Clock_Display.png

The schematic only shows 2 digits for now. I just wanted to show what I meant. I would spread the "half digits" randomly across the MAX to minimise the likelihood of 2 MAX trying to drive the same physical digit at the same time. I take it that 2 daisy-chained MAX7219 don't sync their digit scan clocking? If they did, I could completely avoid 2 MAX driving the dame digit at the same time.

I'll also check out the TLC ICs you mentioned. I do think my project needs some TLC .. :smiley:

but I can't find any place to buy these in the UK.

but not cheap.

Odd, I did check farnell, but probably only for the 6955...

But I should mention that I would need DIP through-hole packaging. I have no equipment to handle surface mount.

Those diodes are what I was suggesting, they form an AND gate (XOR is not the right logic function here).

However I don't see the need for the second 7219, you have the equivalent of 4 digits and that be handled by a single chip.

Also you don't have the segments in parallal, eg A1 goes to G1. That will make your code really difficult as the bit pattern for a given character will be different for each display.


Rob

thanks for that. This has given me confidence to try it this way on a breadboard without the fear of frying something.

In the end I want to use 8 digits. I have only drawn 2 for now to show the idea I had with the diodes.
The cross wiring of the segments was intentional. The idea was to minimise the chance that 2 MAX would drive the same common cathode at the same time. Do you think that makes no sense?
The project will only display something like 10 fixed words, so I would create a bit array for those words (one bit per segment) and wouldn't need to convert text on-the-fly.

Are you sure that AND is the right logic though? In my understanding it should be either one or the other MAX driving that line but never both, which is, in my understanding, an XOR. But correct me if that's wrong...

I haven't looked at the 7219 specs properly but I assume it pulls the digit select low as they are common cathode.

In that case you want say digit 1 and 2 to activate the same display. So the logic is

OP low if IP1 low OR IP2 low

That's an OR function with inversions on all pins, aka an AND function.

That's working on the digit being driven from a single 7219.

either one or the other MAX driving that line but never both

I can see no way of connecting both chips to a single display, they would never be synchronised and segments would be lighting up all over the place.

2 MAX would drive the same common cathode at the same time. Do you think that makes no sense?

Yes I think that makes no sense :), because of the above reasoning.


Rob

aaahhhhhhh, I see what you mean...
Use 2 digit lines from the same MAX to drive the 2 halves of one physical digit connected to the same common cathode with diodes. That way it would NEVER try to drive the cathode from 2 places as only one digit line is active at any one time....

Will amend the schematic and post as I'm not sure I can put this in words properly .. :wink:

Here is the modified schematic:
http://yesyesserver.co.uk/temp/Arduino_Clock_Display_2.png

Is that what you meant? I would drive 4 digits with the first MAX and the other 4 digits with the other MAX...

I've tidied it up a bit and extended it to all 8 alpha digits.
http://yesyesserver.co.uk/temp/Arduino_Clock_Display_3.png

That looks about right. Let us know if it works.


Rob

OK, I just wired this up on a bread board (and, boy, am I glad I stocked up on jumper wires recently). :wink:

While it does work in principle, it will always light up both segments that share a segment line. For example segment A1 and G1 as they are both connected to the SEG_A line. Having a look back at the schematic it makes perfect sense.

Back to the drawing board...
Any ideas how I could resolve this? Can it even be done with a single common cathode?

Doh, of course it will. I should have seen that.

Any ideas how I could resolve this?

Yep, use shift registers. :slight_smile:

OR a 16-seg driver like the MAX6954, supposedly available in a DIP 40 but I can't find any.

Then there's the ICM7244

SMD only though.


Rob

I'm beginning to think it won't work this way...

Possible ways forward would be

  • find a 16 segment LED display with 2 separate common cathodes (can't seem to find any)
  • use a 8x8 dot matrix per digit instead (would require 1 MAX per digit)
  • use a 16 bit shift register IC per digit

I've decided to go with the 8x8 matrix. I've ordered 2 of these now to see how it works. They are bi-colour (red and green) but I will only be using the red part.

I'll update the thread with my progress, if anyone is still interested.

I might even make it modular and design a small PCB that holds one matrix and one MAX7219. ;D