@techtronicsengineering
There are a lot of seven segment Arduino libraries in the net. Did you look at other libraries before writing yours?
Your library's code doesn't seem particularly efficient to me.
Besides the fact that you ignored my comments in post #7, I'd like to point out a few more points:
- A typical seven-segment indicator has eight pins controlling the segments and the dot. Each pin can have two states: on and off. Logically, the state of the entire indicator is described as a byte, where each bit represents the state of one segment. In this case, each symbol corresponds to only one byte variable
static const uint8_t digitCodeMap[] = {
// GFEDCBA Segments 7-segment map:
0b00111111, // 0 "0" AAA
0b00000110, // 1 "1" F B
0b01011011, // 2 "2" F B
0b01001111, // 3 "3" GGG
0b01100110, // 4 "4" E C
0b01101101, // 5 "5" E C
0b01111101, // 6 "6" DDD
0b00000111, // 7 "7"
0b01111111, // 8 "8"
0b01101111, // 9 "9"
};
This method is used in almost every seven-segment indicator control library because it simplifies and shortens the code.
So instead of lot of digitalWrite() in your code:
void Display::showDigitSegments(int val){
switch(val){
case 0: digitalWrite(A,ON); digitalWrite(B,ON); digitalWrite(C,ON); digitalWrite(D,ON); digitalWrite(E,ON); digitalWrite(F,ON); digitalWrite(G,OFF); break;
case 1: digitalWrite(A,OFF); digitalWrite(B,ON); digitalWrite(C,ON); digitalWrite(D,OFF); digitalWrite(E,OFF); digitalWrite(F,OFF); digitalWrite(G,OFF); break;
case 2: digitalWrite(A,ON); digitalWrite(B,ON); digitalWrite(C,OFF); digitalWrite(D,ON); digitalWrite(E,ON); digitalWrite(F,OFF); digitalWrite(G,ON); break;
case 3: digitalWrite(A,ON); digitalWrite(B,ON); digitalWrite(C,ON); digitalWrite(D,ON); digitalWrite(E,OFF); digitalWrite(F,OFF); digitalWrite(G,ON); break;
case 4: digitalWrite(A,OFF); digitalWrite(B,ON); digitalWrite(C,ON); digitalWrite(D,OFF); digitalWrite(E,OFF); digitalWrite(F,ON); digitalWrite(G,ON); break;
case 5: digitalWrite(A,ON); digitalWrite(B,OFF); digitalWrite(C,ON); digitalWrite(D,ON); digitalWrite(E,OFF); digitalWrite(F,ON); digitalWrite(G,ON); break;
case 6: digitalWrite(A,ON); digitalWrite(B,OFF); digitalWrite(C,ON); digitalWrite(D,ON); digitalWrite(E,ON); digitalWrite(F,ON); digitalWrite(G,ON); break;
case 7: digitalWrite(A,ON); digitalWrite(B,ON); digitalWrite(C,ON); digitalWrite(D,OFF); digitalWrite(E,OFF); digitalWrite(F,OFF); digitalWrite(G,OFF); break;
case 8: digitalWrite(A,ON); digitalWrite(B,ON); digitalWrite(C,ON); digitalWrite(D,ON); digitalWrite(E,ON); digitalWrite(F,ON); digitalWrite(G,ON); break;
case 9: digitalWrite(A,ON); digitalWrite(B,ON); digitalWrite(C,ON); digitalWrite(D,ON); digitalWrite(E,OFF); digitalWrite(F,ON); digitalWrite(G,ON); break;
}
}
we can do it in more elegant way:
// Turns a segment on, as well as all corresponding digit pins
// (according to digitCodes[])
uint8_t pins[] = {A, B, C, D, E, F, G};
void showDigitSegments(uint8_t val){
if (val < 10) // check 0-9 range
{
for (uint8_t segment = 0 ; segment < 7 ; segment++) {
if (digitCodeMap[val] & (1 << segment)) { // Check a single bit
digitalWrite(pins[segment], ON);
}
else { digitalWrite(pins[segment], OFF); }
}
}
}
I took the code above from the first library I found on Google - GitHub - DeanIsMe/SevSeg: Seven segment display controller library for Arduino
- Speaking of variables, it would be more efficient to declare pins as constants and store them within a library class than to use variables from a sketch and declare them external to your code. This is error-prone.
And, as seen above, it's much more efficient to organize pins into an array.