What is Charlieplexing?
When you use microcontrollers and you are out of PIN's to connect some LED's for status or when you want to drive a binary clock with few pins left in microcontroller, there is a way that can solve this issue.
Its called charlieplexing and if you know multiplexing you will have some idea of how it works. I will do an example using Arduino for demonstration.
Charlieplexing is a method to drive multiple LED's with few pins available in your microcontroller.
Here is the formula to calculate how many LEDs can be drive from N number of pins.
Number of LED's = No. of PINS available ( No. of PINS available - 1)
For example you have only 3 pins left in Arduino and you want to know how many LED's can be drive.
Number of LED's = 3(3-1)
Number of LED's = 3(2)
Number of LED's = 6
So from 3 PINS you can drive 6 LED's.
Since arduino have tri-state output (INPUT, HIGH and LOW) its easy to drive the LED's using this method.
L = LOW (make out pin as LOW)
H = HIGH (make out pin as HIGH)
I = INPUT (make pin as INPUT) so this pin will be an open circuit
To drive LED 1
You have to make pin 2 and 3 as output pins. Pin 4 as an input.
So when you sent pin 2 = LOW and pin 3 = HIGH and leave pin 4 as an INPUT, the LED 1 will light up.
To drive LED 3
You have to make pin 3 and 4 as output pins. Pin 2 as an input.
So when you sent pin 3 = LOW and pin 4 = HIGH and leave pin 2 as an INPUT, the LED 3 will light up.
Here is an arduino test code that i have written for test charlieplexing.
#define L1 2
#define L2 3
#define L3 4
int delays = 400;
void setup() {
}
void loop() {
pinMode(L1,OUTPUT);
pinMode(L2,OUTPUT);
pinMode(L3,INPUT);
digitalWrite(L1,LOW);
digitalWrite(L2,HIGH);
delay(delays);
digitalWrite(L1,HIGH);
digitalWrite(L2,LOW);
delay(delays);
pinMode(L1,INPUT);
pinMode(L2,OUTPUT);
pinMode(L3,OUTPUT);
digitalWrite(L2,HIGH);
digitalWrite(L3,LOW);
delay(delays);
digitalWrite(L2,LOW);
digitalWrite(L3,HIGH);
delay(delays);
pinMode(L1,OUTPUT);
pinMode(L2,INPUT);
pinMode(L3,OUTPUT);
digitalWrite(L1,LOW);
digitalWrite(L3,HIGH);
delay(delays);
digitalWrite(L1,HIGH);
digitalWrite(L3,LOW);
delay(delays);
}
Its called charlieplexing and if you know multiplexing you will have some idea of how it works. I will do an example using Arduino for demonstration.
Charlieplexing is a method to drive multiple LED's with few pins available in your microcontroller.
Here is the formula to calculate how many LEDs can be drive from N number of pins.
Number of LED's = No. of PINS available ( No. of PINS available - 1)
For example you have only 3 pins left in Arduino and you want to know how many LED's can be drive.
Number of LED's = 3(3-1)
Number of LED's = 3(2)
Number of LED's = 6
So from 3 PINS you can drive 6 LED's.
Since arduino have tri-state output (INPUT, HIGH and LOW) its easy to drive the LED's using this method.
![]() |
how leds are connected to 3 pins of an arduino |
![]() |
Truth table of how its drive |
H = HIGH (make out pin as HIGH)
I = INPUT (make pin as INPUT) so this pin will be an open circuit
To drive LED 1
You have to make pin 2 and 3 as output pins. Pin 4 as an input.
So when you sent pin 2 = LOW and pin 3 = HIGH and leave pin 4 as an INPUT, the LED 1 will light up.
To drive LED 3
You have to make pin 3 and 4 as output pins. Pin 2 as an input.
So when you sent pin 3 = LOW and pin 4 = HIGH and leave pin 2 as an INPUT, the LED 3 will light up.
Here is an arduino test code that i have written for test charlieplexing.
#define L1 2
#define L2 3
#define L3 4
int delays = 400;
void setup() {
}
void loop() {
pinMode(L1,OUTPUT);
pinMode(L2,OUTPUT);
pinMode(L3,INPUT);
digitalWrite(L1,LOW);
digitalWrite(L2,HIGH);
delay(delays);
digitalWrite(L1,HIGH);
digitalWrite(L2,LOW);
delay(delays);
pinMode(L1,INPUT);
pinMode(L2,OUTPUT);
pinMode(L3,OUTPUT);
digitalWrite(L2,HIGH);
digitalWrite(L3,LOW);
delay(delays);
digitalWrite(L2,LOW);
digitalWrite(L3,HIGH);
delay(delays);
pinMode(L1,OUTPUT);
pinMode(L2,INPUT);
pinMode(L3,OUTPUT);
digitalWrite(L1,LOW);
digitalWrite(L3,HIGH);
delay(delays);
digitalWrite(L1,HIGH);
digitalWrite(L3,LOW);
delay(delays);
}
hope this will help you.