Introduction to Displays 2
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!
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.
