Eight digit seven segment display from DealExtreme

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).

sku_250813_1

display1

display2

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