// Static versus Multiplexed signals for 7-segment displays.
//
// 11 May 2024
// Version 1
// by Koepel, Public Domain
//
// The static signals need a lot of wires.
// The multiplexed display needs a delay.
const int staticSegmentPins[4][8] =
{
{46, 47, 48, 49, 50, 51, 52, 53}, // right display: A B C D E F G DP
{38, 39, 40, 41, 42, 43, 44, 45},
{30, 31, 32, 33, 34, 35, 36, 37},
{22, 23, 24, 25, 26, 27, 28, 29} // left display
};
const int multiplexSegmentPins[8] =
{
A8, A9, A10, A11, A12, A13, A14, A15 // A B C D E F G DP
};
const int multiplexDigitPins[4] =
{
A7, A6, A5, A4 // A7 is for most right digit
};
// Segment A is in bit 0
// Segment B is in bit 1
// and so on.
const int NumbersToSegments[10]
{
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01100111, // 9
};
int counter;
unsigned long previousMillis;
const unsigned long interval = 600UL;
void setup()
{
// Initialize all the pins for the displays with static signals.
for(int i=0; i<4; i++)
for(int j=0; j<8; j++)
pinMode(staticSegmentPins[i][j], OUTPUT);
// Initialize the pins of the 7 segments for the multiplexed signals.
for(int i=0; i<8; i++)
pinMode(multiplexSegmentPins[i], OUTPUT);
// Initialize the pins of the 4 digits for the multiplexed signals.
// They are active low, so their default value is high.
for(int i=0; i<4; i++)
{
pinMode(multiplexDigitPins[i], OUTPUT);
digitalWrite(multiplexDigitPins[i], HIGH);
}
}
void loop()
{
unsigned long currentMillis = millis();
if(currentMillis - previousMillis >= interval)
{
previousMillis = currentMillis;
counter++;
if(counter > 9999)
counter = 0;
// For the static signals, set the signals
// just once. The number will stay on the display.
ShowStaticNumber(counter);
}
// Keep it running all the time, because the actived segments
// are only actived for a short time.
ShowMultiplexedNumber(counter);
// Enable this delay to show the difference.
// delay(500);
}
// 4 display of 7 segments each makes a total of 28 wires to be set.
void ShowStaticNumber(int number)
{
for(int display=0; display<4; display++)
{
int decimaldigit = number % 10; // get the lowest decimal digit
number /= 10; // prepare for next decimal digit
for(int segment=0; segment<7; segment++)
{
int value = bitRead(NumbersToSegments[decimaldigit], segment) == 1 ? HIGH : LOW;
digitalWrite(staticSegmentPins[display][segment], value);
}
}
}
// There are less wires: 7 + 4 = 11 for all the segments.
// The code temporarily activates the segments of a single digit.
void ShowMultiplexedNumber(int number)
{
for(int digit=0; digit<4; digit++)
{
int decimaldigit = number % 10; // get the lowest decimal digit
number /= 10; // prepare for next decimal digit
for(int segment=0; segment<7; segment++)
{
int value = bitRead(NumbersToSegments[decimaldigit], segment) == 1 ? HIGH : LOW;
digitalWrite(multiplexSegmentPins[segment], value);
}
// Activate this digit.
// Keep it active for some time to show the activated segments.
digitalWrite(multiplexDigitPins[digit], LOW);
delay(10);
digitalWrite(multiplexDigitPins[digit], HIGH);
}
}
mega:SCL
mega:SDA
mega:AREF
mega:GND.1
mega:13
mega:12
mega:11
mega:10
mega:9
mega:8
mega:7
mega:6
mega:5
mega:4
mega:3
mega:2
mega:1
mega:0
mega:14
mega:15
mega:16
mega:17
mega:18
mega:19
mega:20
mega:21
mega:5V.1
mega:5V.2
mega:22
mega:23
mega:24
mega:25
mega:26
mega:27
mega:28
mega:29
mega:30
mega:31
mega:32
mega:33
mega:34
mega:35
mega:36
mega:37
mega:38
mega:39
mega:40
mega:41
mega:42
mega:43
mega:44
mega:45
mega:46
mega:47
mega:48
mega:49
mega:50
mega:51
mega:52
mega:53
mega:GND.4
mega:GND.5
mega:IOREF
mega:RESET
mega:3.3V
mega:5V
mega:GND.2
mega:GND.3
mega:VIN
mega:A0
mega:A1
mega:A2
mega:A3
mega:A4
mega:A5
mega:A6
mega:A7
mega:A8
mega:A9
mega:A10
mega:A11
mega:A12
mega:A13
mega:A14
mega:A15
sevseg1:COM.1
sevseg1:COM.2
sevseg1:A
sevseg1:B
sevseg1:C
sevseg1:D
sevseg1:E
sevseg1:F
sevseg1:G
sevseg1:DP
sevseg5:A
sevseg5:B
sevseg5:C
sevseg5:D
sevseg5:E
sevseg5:F
sevseg5:G
sevseg5:DP
sevseg5:DIG1
sevseg5:DIG2
sevseg5:DIG3
sevseg5:DIG4
sevseg5:COM
sevseg5:CLN
r1:1
r1:2
r2:1
r2:2
r3:1
r3:2
r4:1
r4:2
r5:1
r5:2
r6:1
r6:2
r7:1
r7:2
r8:1
r8:2
sevseg2:COM.1
sevseg2:COM.2
sevseg2:A
sevseg2:B
sevseg2:C
sevseg2:D
sevseg2:E
sevseg2:F
sevseg2:G
sevseg2:DP
r9:1
r9:2
r10:1
r10:2
r11:1
r11:2
r12:1
r12:2
r13:1
r13:2
r14:1
r14:2
r15:1
r15:2
r16:1
r16:2
sevseg3:COM.1
sevseg3:COM.2
sevseg3:A
sevseg3:B
sevseg3:C
sevseg3:D
sevseg3:E
sevseg3:F
sevseg3:G
sevseg3:DP
r17:1
r17:2
r18:1
r18:2
r19:1
r19:2
r20:1
r20:2
r21:1
r21:2
r22:1
r22:2
r23:1
r23:2
r24:1
r24:2
sevseg4:COM.1
sevseg4:COM.2
sevseg4:A
sevseg4:B
sevseg4:C
sevseg4:D
sevseg4:E
sevseg4:F
sevseg4:G
sevseg4:DP
r25:1
r25:2
r26:1
r26:2
r27:1
r27:2
r28:1
r28:2
r29:1
r29:2
r30:1
r30:2
r31:1
r31:2
r32:1
r32:2
r33:1
r33:2
r34:1
r34:2
r35:1
r35:2
r36:1
r36:2
r37:1
r37:2
r38:1
r38:2
r39:1
r39:2
r40:1
r40:2
Static
Multiplexed