I ran across this cheap (USD$4.70 SKU 250813) multi digit 7 segment display from DealExtreme. It’s composed of 3461BS displays and two 74HC595D shift registers. It runs cleanly on 5VDC (only voltage I tested). It requires three GPIO lines to run (latch, data, clock). Because the displays are multiplexed, it can only display one character at a time. This means you need to set activate each character faster enough to avoid any flicker (at least >= 20 hertz).



#define latch 9
#define clock 10
#define data 11
#define kDigitCount 8
char gDisplayBuffer[kDigitCount+1];
void setup()
{
pinMode(latch, OUTPUT);
pinMode(clock, OUTPUT);
pinMode(data, OUTPUT);
Serial.begin( 9600 );
memset(gDisplayBuffer, ' ', kDigitCount);
}
void writeDigit(int digit, char inValue)
{
byte value = 0;
byte bitsToSend = 0;
bitSet(bitsToSend, digit);
digitalWrite(latch,LOW);
shiftOut(data,clock,MSBFIRST, bitsToSend);
switch (inValue)
{
case '.': value = B01111111; break;
case '1': value = B11111001; break;
case '2': value = B10100100; break;
case '3': value = B10110000; break;
case '4': value = B10011001; break;
case '5': value = B10010010; break;
case '6': value = B10000011; break;
case '7': value = B11111000; break;
case '8': value = B10000000; break;
case '9': value = B10010000; break;
case '0': value = B11000000; break;
case 'H': value = B10001001; break;
case 'i': value = B11111011; break;
default:
case ' ': value = B11111111; break;
}
shiftOut(data,clock,MSBFIRST,value);
digitalWrite(latch,HIGH);
}
void writeToDisplay(bool inOveride)
{
for (int i = 0 ; i < kDigitCount ; i++)
{
if (' ' != gDisplayBuffer[i] || inOveride)
writeDigit(i, gDisplayBuffer[i]);
}
}
void loop()
{
char cmdBuffer[16];
if (0 < Serial.available())
{
memset(cmdBuffer, ' ', 16);
int iBytes = Serial.readBytesUntil('\n', cmdBuffer, 16);
cmdBuffer[iBytes] = 0;
if (!strncmp(cmdBuffer, "SET ", 4))
{
if (12 != strlen( cmdBuffer))
Serial.println("ERR");
else
memcpy(gDisplayBuffer, &cmdBuffer[4], kDigitCount);
}
else if (!strncmp(cmdBuffer, "CLR", 3))
{
memcpy(gDisplayBuffer, " ", kDigitCount);
writeToDisplay(true);
}
}
writeToDisplay(false);
}