Use MAX7219 to drive common cathode display.
Make it 8 digits and have a countdown timer too.
MAX7219 controls the display, you only need to send it an register number & data to display. Very easy.
Here's a very little card I offer that does the same. Can find larger versions easily enough.
From arduino you connect it to +5, Gnd, SCK, MOSI, CS, or use a library that fakes those in software.
Big portions of the code needed:
void setup(){
pinMode (busyPin, INPUT_PULLUP);
pinMode (ssPin, OUTPUT);
SPI.begin();
// MAX7219 setup:
MAX7219setup();
// Update display
numberDisplay(); // send to display
commandDisplay(); // send to display
} // end setup
void numberDisplay(){
// send data to 'screen'
digitalWrite (ssPin, LOW);
SPI.transfer(8); // address
SPI.transfer(fontArray[songLower]);
digitalWrite (ssPin, HIGH);
digitalWrite (ssPin, LOW);
SPI.transfer(7); // address
SPI.transfer(fontArray[songMiddle]);
digitalWrite (ssPin, HIGH);
digitalWrite (ssPin, LOW);
SPI.transfer(6); // address
SPI.transfer(fontArray[songUpper]);
digitalWrite (ssPin, HIGH);
}
void commandDisplay(){
// send to display
digitalWrite (ssPin, LOW);
SPI.transfer(5); // address
SPI.transfer(fontArray[commandArray[4]]);
digitalWrite (ssPin, HIGH);
digitalWrite (ssPin, LOW);
SPI.transfer(4); // address
SPI.transfer(fontArray[commandArray[3]]);
digitalWrite (ssPin, HIGH);
digitalWrite (ssPin, LOW);
SPI.transfer(3); // address
SPI.transfer(fontArray[commandArray[2]]);
digitalWrite (ssPin, HIGH);
digitalWrite (ssPin, LOW);
SPI.transfer(2); // address
SPI.transfer(fontArray[commandArray[1]]);
digitalWrite (ssPin, HIGH);
digitalWrite (ssPin, LOW);
SPI.transfer(1); // address
SPI.transfer(fontArray[commandArray[0]]);
digitalWrite (ssPin, HIGH);
}
void MAX7219setup(){
// MAX7219 setup:
// shutdown mode
digitalWrite (ssPin, LOW);
SPI.transfer(0x0C);
SPI.transfer(0);
digitalWrite (ssPin, HIGH);
// scan register, 8 digits
digitalWrite (ssPin, LOW);
SPI.transfer(0x0B);
SPI.transfer(0x07);
digitalWrite (ssPin, HIGH);
// no decode mode
digitalWrite (ssPin, LOW);
SPI.transfer(0x09);
SPI.transfer(0);
digitalWrite (ssPin, HIGH);
// display test off
digitalWrite (ssPin, LOW);
SPI.transfer(0x0F);
SPI.transfer(0);
digitalWrite (ssPin, HIGH);
// intensity
digitalWrite (ssPin, LOW);
SPI.transfer(0x0A);
SPI.transfer(7); // 1/2 bright
digitalWrite (ssPin, HIGH);
// all done, normal mode
digitalWrite (ssPin, LOW);
SPI.transfer(0x0C);
SPI.transfer(1);
digitalWrite (ssPin, HIGH);
}