/*
Seven Segment Display
Aug 17 2024
Version 2
by trulyBent, Public Domain
This project is pretty much a complete rewrite based on a section of
Koepel's "Static versus Multiplexed signals for 7-segment displays."
(https://wokwi.com/projects/397598198000164865)
*/
// #include <Arduino.h>
#define OUT_OFF HIGH
#define OUT_ON LOW
#define DP 7
int iDigit = 0;
int iValue;
// bool bToggle = false;
const int segmentPins[8] =
{
5, 6, 7, 8, 9, 10, 11, 12 // A B C D E F G DP
};
// Segment A is in bit 0
// Segment B is in bit 1
// and so on.
const int numbersToSegments[]
{
0b00111111, // 0 add dp to numbers
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01100111, // 9
0b01110111, // A dp off from here
0b01111111, // B
0b00111001, // C
0b00001111, // D (stylized)
0b01111001, // E
0b01110001, // F
};
/*
////////////////////////////////////////////
void all_off() {
for(int i = 0; i < 8; i++)
digitalWrite(segmentPins[i], OUT_OFF);
}
*/
////////////////////////////////////////////
void setup() {
Serial.begin(115200);
// Initialize the pins of the 7 segments
for(int i = 0; i < 8; i++)
pinMode(segmentPins[i], OUTPUT);
}
////////////////////////////////////////////
void loop() {
Serial.println(iDigit);
for(int segment = 0; segment < 8; segment++) {
iValue = bitRead(numbersToSegments[iDigit], segment) == 1 ? OUT_ON : OUT_OFF;
digitalWrite(segmentPins[segment], iValue);
}
// to differentiate numbers from letters, add dp to numbers
if (iDigit <= 9)
digitalWrite(segmentPins[DP], OUT_ON);
else
digitalWrite(segmentPins[DP], OUT_OFF);
iDigit++;
if (iDigit > 15)
iDigit = 0;
delay(1000);
// all_off(); // not neccessary
}