I understand the principle of charlieplex and the use of tri-state. What I don't understand is, can I light all segments on a display at once or do I have to light one segment at a time?

Say I have 8 displays in a charlieplex configuration with 8 transistors to select which display I want to use (displays are common-anode).

enter image description here

I turn D0 high to saturate Q1 and turn D1-D7 low to ground all segments, D8->input to 'disconnect' it from circuit. No other transistors should be saturated and LEDs connected to D0 should block the reverse voltage. Display 1 is lit and all others are off? I feel like I'm not understanding something.

  • \$\begingroup\$ I don't think that You correctly understand what charlieplexing is - on Your schematic displays are ordinarily multipexed. \$\endgroup\$ Commented Sep 4, 2016 at 14:22
  • 2
    \$\begingroup\$ @lustful-rat it looks ordinary, doesn't it? But it's not. The 8 lines electrically address 56 LEDs in an 8 dimensional triangle of anti-parallel LED pairs, like a normal Charliplex. BUT those 56 LEDs are physically arranged in digits to look like a normal multiplex. It's one of the niceties of geometry that you can arrive at exactly the same arrangement for an n(n-1) multiplex in n lines. A normal multiplex would use 8 seperate lines for the digit drivers, consuming a total of 15 lines, rather than re-using the unused segment lines for a total of 8 lines. \$\endgroup\$
    – Neil_UK
    Commented Sep 4, 2016 at 15:28
  • \$\begingroup\$ +1 It took me a moment to realise that the drive for any particular digit is not used as a segment drive on that digit. In your circuit you should be able to drive a whole digit at a time, software permitting. \$\endgroup\$
    – KalleMP
    Commented Sep 4, 2016 at 18:19

2 Answers 2


Charlieplexing is fun, I do it too much. Usually the advantage of fewer lines costs too much in restricted facility, and the need to three-state the outputs rather than just drive them high and low.

You can light one digit at a time, which is the same as you can do with normal 15 line multiplexing. Anybody that tells you only a single segment at a time hasn't been thinking hard enough.

If you drive your array directly from MCU pins, then one-at-a-time might be indicated if you want to keep the pin current down. If your array includes digit drivers (which yours does) with proper resistive dividers ahead so they can tell the difference between driven and three-state (which I can't tell whether yours does or not due to the scale of the drawing), then you can drive a whole digit at a time.

With a little care, the lines can be assigned so that software driving is straightforward (not like you've assigned them). Having wired all 8 lines to the first digit, one to the common, and the other 7 to the segments, rotate the lines one step for the next digit. Now in software, you require only one lookup table, and you use a circular rotate command to cycle the pattern through the other 7 positions to light the other 7 digits. With your assignment, you need a different lookup table for each digit.

  • \$\begingroup\$ It looks like you have a firm grasp of this. I like the idea and it is a lot of segments for very little pins. \$\endgroup\$
    – KalleMP
    Commented Sep 4, 2016 at 18:23
  • \$\begingroup\$ There still is something that I do not understand. Let's call his data lines, top to bot, D[0..7]. We are working with the first digit, so we pull D0 high to turn on the first transistor. Since D0 is connected to the cathodes of the other leds this is not a problem, but if we want to keep a segment off, e.g. D1 is high, this will turn on the transistor driving the second digit, which will now have the same segments (or a permutation) turned on, because it is enabled. What am I missing? \$\endgroup\$ Commented Sep 4, 2016 at 21:28
  • \$\begingroup\$ Moreover, if you say that instead we drive D1 to high Z, I have got the feeling that the series transistor-segment-transistor-other leds can turn on. You also get quite some mA of base current which is more than enough to turn on other select transistors. \$\endgroup\$ Commented Sep 4, 2016 at 21:30
  • \$\begingroup\$ What are you refering to as a digit driver? There is no LED driving ICs in use, only the MCU. And why do the 'digit drivers' need to tell the difference between driven and three-state (unclear what three-state is reffering too)? \$\endgroup\$ Commented Sep 4, 2016 at 21:34
  • \$\begingroup\$ The digit drivers are the transistors. And using three state is key of this thing because you have 7x8=56 leds that would normally require a 7x8 matrix. But you are using a 9 bit bus and leds are arranged in a special way. What is missing to me is also that usually in CP you have anti parallel polarized devices, being led or any dipole, which is something that is not happening here. So, where's the catch? \$\endgroup\$ Commented Sep 4, 2016 at 21:49

With Charlieplexing you only turn a single segment on at a time.

You will quickly see that it's pretty much useless for a configuration such as yours because the duty cycle is so low (1/64) that it will not be visible in normal lighting.

Conventional multiplexing will allow you to get a 1/8 duty cycle which is about as far as I would recommend pushing it.

  • 2
    \$\begingroup\$ If you have 8 lines, and drive one high, and another low, you can turn on one segment. What about the other 6 lines? If you drive those low as well, the high line will source current to all 7. Maybe too much for all lines connected to an MCU, but if each group of 7 LEDs has a digit driver, turned on by the one line not connected to a segment in that digit, you can turn all segments of each digit on at the same time. Result, as efficient in duty cycle as a conventional 15 line multiplex. Drawbacks - extra resistor or two for digit drivers, software complexity, difficult to expand. \$\endgroup\$
    – Neil_UK
    Commented Sep 4, 2016 at 15:32
  • \$\begingroup\$ @Neil_UK I guess that would be Neilplexing® \$\endgroup\$ Commented Sep 4, 2016 at 17:16
  • \$\begingroup\$ The OPs arrangemet is pretty neat. If you look the drive for any particular digit is not used as a segment drive on that digit. \$\endgroup\$
    – KalleMP
    Commented Sep 4, 2016 at 18:18
  • 3
    \$\begingroup\$ @SpehroPefhany I love the way you get 2 for 2 lines, 6 for 3 lines, 12 for 4 lines etc, whether you do the triangular lattice of pairs of LEDs, or an n*(n-1) mux array with the unused column line used for the row select. I was quite gobsmacked when I sketched that out for the first time. \$\endgroup\$
    – Neil_UK
    Commented Sep 4, 2016 at 19:13

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.