Direct Drive 88:88 4 Digit 7 Segment Display

direct_dive_88_88

See technical data sheet: http://www.farnell.com/datasheets/95220.pdf I use HDSP-B03G, HDSP-B07G, or HDSP-B09G (Common Cathode)

Using the same code as DirectDriveLEDMatrix

Like in Direct Drive Matrix you should probably use some resistors but I run it direct…

Random numbers example (needs Timer1 library):

/*
 * 4 Digit 7 Segment Display
 * darrencperry
 * 
 * Original source code:
 * _8x8 LED matrix
 *
 * (c) 2009 BlushingBoy.net
 */

#include "TimerOne.h"


//With this pin setup you can connect pin 1 through 12 on the display to pins 2-13 on Arduino
byte pins[16] = {2,3,4,5,6,7,8,9,10,11,12,13};
byte rows[4] = {6,8,9,12};
byte cols[8] = {11,7,4,2,1,10,5,3};

byte screen[8] = {0, 0, 0, 0, 0, 0, 0, 0};
volatile byte screenRow = 0;
volatile byte screenCol = 0;

byte numbers[11][7] = {
  {1,1,1,1,1,1,0}, //zero
  {0,0,0,0,1,1,0}, //one
  {1,1,0,1,1,0,1}, //two
  {1,0,0,1,1,1,1}, //three
  {0,0,1,0,1,1,1}, //four
  {1,0,1,1,0,1,1}, //five
  {1,1,1,1,0,1,1}, //six
  {0,0,0,1,1,1,0}, //seven
  {1,1,1,1,1,1,1}, //eight
  {1,0,1,1,1,1,1}, //nine
  {0,0,0,0,0,0,0}  //off
};

void setup() {

  Timer1.initialize(100);
  for (int i = 0; i < 16; i++)
    pinMode(pins[i], OUTPUT);
  Timer1.attachInterrupt(doubleBuffer);

}

// interrupt routine
void doubleBuffer() {
  // reset the previous iteration
  digitalWrite(translatePin(rows[screenRow]), HIGH); // set previous off
  digitalWrite(translatePin(cols[screenCol]), LOW);  // set previous off
  // go to the next iteration...
  // go to the next screenCol, wrap if necessary
  screenCol++;
  if (screenCol >= 8) {
    screenCol = 0;
    // when screenCol wraps, go to the next screenRow, wrap if necessary
    screenRow++;
    if (screenRow >= 4) {
      screenRow = 0;
    }
  }
  // set this iteration
  if((screen[screenRow]>>screenCol)&B1 == B1) {
    digitalWrite(translatePin(rows[screenRow]), LOW);  // set this on
    digitalWrite(translatePin(cols[screenCol]), HIGH); // set this on
  } else {
    digitalWrite(translatePin(rows[screenRow]), HIGH); // set this off
    digitalWrite(translatePin(cols[screenCol]), LOW);  // set this off
  }

}

byte translatePin(byte original) {
  return pins[original - 1];
}

void allOFF() {
  for (int i = 0; i < 8; i++)
    screen[i]=0;
}

void on(byte row, byte column) {
    screen[column-1] |= (B1<<(row-1)); 
}

void off(byte row, byte column) {
    screen[column-1] &= ~(B1<<(row-1)); 
}

void displayNumbers(byte time[4]) {
  for (int digit = 0; digit < 4; digit++) {
    for (int i = 0; i < 7; i++) {
      if (numbers[time[digit]][i] == 1) on(i+1,digit+1);
        else off(i+1,digit+1);
    }
  }
}

void decimals(byte bottom, byte top) {
  if(bottom) on(8,2);
  else off(8,2);
  if(top) on(8,3);
  else off(8,3);
}

void loop() {
  //just some randoms numbers for testing
  byte nums[4] = {random(12)-1,
                  random(12)-1,
                  random(12)-1,
                  random(12)-1};
  displayNumbers(nums);

  decimals(random(2)-1,random(2)-1);
  delay(1000);
}