Much like the previous tutorial (how to use a 4-digit seven segment display), this time we’ve got only one seven segment digit, but with a strange number of pins!

View this post on Instagram

A post shared by Marginally Clever Robots (@imakerobots) on

First I did my homework and found a PDF of a possible pin schematic. Two anodes? Strange. With two anodes there would only need to be 4 cathodes (6 pins total). With one anode there would be 8 cathodes (9 total). So why ten? Mystery!

The second problem was figuring out which pin does what. Rather than make an awkward picture or explain in words, I used the Arduino to solve the problem for me.

## Usage

• Connect the ten pins of your display to Arduino UNO pins 2-11, inclusive.
• Open the serial window to Newline+57600.
• Answer the questions.
• Enjoy digits.
• Tweet your success vid to @marginallyc.

## Code

```#define NUM_SEGS 8
#define NUM_PINS 10

// a map of which segment draws which digit.
// segment     1,2,3,4,5,6,7,8
int zero [] = {1,1,1,1,1,1,0,0};
int one  [] = {0,1,1,0,0,0,0,0};
int two  [] = {1,1,0,1,1,0,1,0};
int three[] = {1,1,1,1,0,0,1,0};
int four [] = {0,1,1,0,0,1,1,0};
int five [] = {1,0,1,1,0,1,1,0};
int six  [] = {1,0,1,1,1,1,1,0};
int seven[] = {1,1,1,0,0,0,0,0};
int eight[] = {1,1,1,1,1,1,1,0};
int nine [] = {1,1,1,1,0,1,1,0};

int *digits[] = {zero,one,two,three,four,five,six,seven,eight,nine};

// filled in by the user
int pins[NUM_SEGS];

void setup() {
Serial.begin(57600);
Serial.println();
Serial.println(" 111 ");
Serial.println("6   2");
Serial.println("6   2");
Serial.println(" 777 ");
Serial.println("5   3");
Serial.println("5   3");
Serial.println(" 444  8");
Serial.println();

int i;
for(i=2;i<2+NUM_PINS;++i) {
pinMode(i,OUTPUT);
digitalWrite(i,LOW);
}

for(i=2;i<12;++i) {
//Serial.print("I am lighting pin ");
//Serial.println(i);
digitalWrite(i,HIGH);
int index = readPinFromUser();
if(index>0) {
pins[index-1] = i;
}
digitalWrite(i,LOW);
}
}

int readPinFromUser() {
Serial.println("\nWhich light is lit?  (0 for none)");

int done=0;
int sum=0;
while(1) {
if(Serial.available()) {
char c = Serial.read();
if(c=='\n') break;
int d = c-'0';
if(d<0 || d>(NUM_SEGS+1) ) {
Serial.print("invalid character '");
Serial.print(c);
Serial.println("'");
}
sum *= 10;
sum += d;
//Serial.print("** ");
//Serial.println(sum);
}
}
//  Serial.print("I heard you say '");
//  Serial.print(sum);
//  Serial.println("'");
return sum;
}

void loop() {
int i=0;

Serial.println("\nDisplaying digits");

// all ten digits
for(i=0;i<10;++i) {
// 300ms each
long t=millis()+300;
while(millis()>t) {
// show!
displayDigit(i);
}
}
}

void displayDigit(int i) {
int j;
for(j=0;j<NUM_SEGS;++j) {
if(digits[i][j]==1) {
digitalWrite(pins[j],HIGH);
digitalWrite(pins[j],LOW);
}
}
}```

## Final thoughts

This code can be found in our Arduino Starter Kit.

Why are there two anodes? Tell me in the comments below.