Call function by variable digit

Hi I wrote a multiplexing scheme for an uno using a 16 pin 7 segment display. As seen below, I have defined each of the 40 possible conditions using functions. I would then like to display a four digit variable by calling these functions. For example if the variable is 1337 then I would call functions: fourone, threethree, twothree, one seven. What statement allows me to identify the fourth digit and then call function fourone?

Here is my test code that runs through all the numbers

void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
}
///////////////////////////////////// clear
void zzz() {
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
}
///////////////////////////////////// zero
void onezero(){
zzz();
digitalWrite(9, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
}
void twozero(){
zzz();
digitalWrite(10, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
}
void threezero(){
zzz();
digitalWrite(11, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
}
void fourzero(){
zzz();
digitalWrite(12, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
}
///////////////////////////////////// one
void oneone() {
zzz();
digitalWrite(9, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
}
void twoone() {
zzz();
digitalWrite(10, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
}
void threeone() {
zzz();
digitalWrite(11, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
}
void fourone() {
zzz();
digitalWrite(12, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
}
///////////////////////////////////// two
void onetwo() {
zzz();
digitalWrite(9, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(8, LOW);
}
void twotwo() {
zzz();
digitalWrite(10, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(8, LOW);
}
void threetwo() {
zzz();
digitalWrite(11, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(8, LOW);
}
void fourtwo() {
zzz();
digitalWrite(12, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(8, LOW);
}
///////////////////////////////////// three
void onethree() {
zzz();
digitalWrite(9, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(8, LOW);
}
void twothree() {
zzz();
digitalWrite(10, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(8, LOW);
}
void threethree() {
zzz();
digitalWrite(11, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(8, LOW);
}
void fourthree() {
zzz();
digitalWrite(12, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(8, LOW);
}
///////////////////////////////////// four
void onefour() {
zzz();
digitalWrite(9, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
void twofour() {
zzz();
digitalWrite(10, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
void threefour() {
zzz();
digitalWrite(11, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
void fourfour() {
zzz();
digitalWrite(12, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
///////////////////////////////////// five
void onefive() {
zzz();
digitalWrite(9, HIGH);
digitalWrite(2, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
void twofive() {
zzz();
digitalWrite(10, HIGH);
digitalWrite(2, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
void threefive() {
zzz();
digitalWrite(11, HIGH);
digitalWrite(2, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
void fourfive() {
zzz();
digitalWrite(12, HIGH);
digitalWrite(2, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
///////////////////////////////////// six
void onesix() {
zzz();
digitalWrite(9, HIGH);
digitalWrite(2, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
void twosix() {
zzz();
digitalWrite(10, HIGH);
digitalWrite(2, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
void threesix() {
zzz();
digitalWrite(11, HIGH);
digitalWrite(2, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
void foursix() {
zzz();
digitalWrite(12, HIGH);
digitalWrite(2, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
///////////////////////////////////// seven
void oneseven() {
zzz();
digitalWrite(9, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
}
void twoseven() {
zzz();
digitalWrite(10, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
}
void threeseven() {
zzz();
digitalWrite(11, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
}
void fourseven() {
zzz();
digitalWrite(12, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
}
///////////////////////////////////// eight
void oneeight() {
zzz();
digitalWrite(9, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
void twoeight() {
zzz();
digitalWrite(10, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
void threeeight() {
zzz();
digitalWrite(11, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
void foureight() {
zzz();
digitalWrite(12, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
///////////////////////////////////// nine
void onenine() {
zzz();
digitalWrite(9, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
void twonine() {
zzz();
digitalWrite(10, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
void threenine() {
zzz();
digitalWrite(11, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
void fournine() {
zzz();
digitalWrite(12, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
/////////////////////////////////////
void loop() {
delay (500);
onezero();
delay (500);
twozero();
delay (500);
threezero();
delay (500);
fourzero();

delay (500);
oneone();
delay (500);
twoone();
delay (500);
threeone();
delay (500);
fourone();

delay (500);
onetwo();
delay (500);
twotwo();
delay (500);
threetwo();
delay (500);
fourtwo();

delay (500);
onethree();
delay (500);
twothree();
delay (500);
threethree();
delay (500);
fourthree();

delay (500);
onefour();
delay (500);
twofour();
delay (500);
threefour();
delay (500);
fourfour();

delay (500);
onefive();
delay (500);
twofive();
delay (500);
threefive();
delay (500);
fourfive();

delay (500);
onesix();
delay (500);
twosix();
delay (500);
threesix();
delay (500);
foursix();

delay (500);
oneseven();
delay (500);
twoseven();
delay (500);
threeseven();
delay (500);
fourseven();

delay (500);
oneeight();
delay (500);
twoeight();
delay (500);
threeeight();
delay (500);
foureight();

delay (500);
onenine();
delay (500);
twonine();
delay (500);
threenine();
delay (500);
fournine();
}

Hello,

Please edit your post and put your code in a Code Box

You could reduce your whole code to a function, something like that

void displayNumber( int number )
{
  uint8_t pos = 0;
  int n = number;
  while ( n != 0 )
  {
    displayDigit( n % 10, pos++ );
    n /= 10;
  }
}

Where displayDigit would be a function to display one digit at one position, it isn't hard to do, so try to make it :wink:

I appreciate the reply but your code doesn't really help me at this time because its too complex. I am new to Arduino but not programming.. I was thinking something like an if / case statement. I don't mind writing a bunch of code for each condition like I did for each segment, clearly there are better ways to go about this but I'm looking for simplicity because I have not been able to find clear guides on how you came up with your example.. only more examples.

I don't think there is a simpler way to split a number into digits. All it does is take the remainder of the number divided by 10, then divide the number by 10, and repeat until the number is 0. For example with 1337:

digit = 1337 % 10 = 7
number = 1337 / 10 = 133

digit = 133 % 10 = 3
number = 133 / 10 = 13

digit = 13 % 10 = 3
number = 13 / 10 = 1

digit = 1 % 10 = 1
number = 1 / 10 = 0

Anyway, here is an example how I would do it. Nothing complex, remove all printf and there is almost nothing left! If you are interested but you don't understand something, just ask and I will explain it

https://ideone.com/r87NpM

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.