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); }