Testing 2-digit display and scroller

I've been scrounging components and put together a test circuit with a 2-digit display (from a Sony DigiBeta tape deck) and a continuous scroll wheel (from a Panasonic VCR remote control). Arduino makes testing and learning about these components so easy!

For kicks, I recorded a video with Cycorder (iPhone, via Cydia) and uploaded it for sharing's sake:
Imgur

The code is verbose and I wonder if anybody would suggest some tighter ways of achieving the same things; I find it confusing to dive into more complex examples, esp. the matrix stuff, and am still struggling with assigning the values I want to non-int data types.

Thanks in advance for any clues!

/* Scroll and Count test
by J.M. Saltzman
Interface with a scroll controller from a Panasonic VCR remote and a 2-digit 7-segment LED display from a Sony DigiBeta deck.
This will become the next version of the coffee grinder timer
v.1: 11/12/2008:  Just starting:  first task:  count
                  second task:  mess w/LED... that'll eat a lot of pins...:o
     11/15/2008:  Counting 0-99 on the display!  Will keep code verbose for now
                  Got the scroller working-- simple!  Adding different modes...
*/

// SCROLLER
int upPin = 16;             // pin for scroll up direction
int dnPin = 17;             // pin for scroll down direction
int upPinVal = 0;
int dnPinVal = 0;
int upPinLast = LOW;
int dnPinLast = LOW;

// 2-DIGIT LED DISPLAY
int ledPins[] =   { 7, 6, 5, 0, 0, 4, 3, 2,15,14,13,12,11,10, 9, 8 };  // add 14 to analog pins
int numPins = 16;

// HORRIBLY INEFFICIENT BUT EFFECTIVE WAY TO GET NUMBERS OUT
int pos1poss[] =  { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1 };
int pos2poss[] =  { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 };
int d0[] =        { 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0 };
int d1[] =        { 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0 };
int d2[] =        { 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1 };
int d3[] =        { 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1 };
int d4[] =        { 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1 };
int d5[] =        { 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1 };
int d6[] =        { 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1 };
int d7[] =        { 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0 };
int d8[] =        { 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
int d9[] =        { 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 };

// BUTTON
int btnPin = 19;
int btnVal = 0;
// VARS FOR DEBOUNCING
long time = 0;             // the last time the output pin was toggled
long debounce = 200;       // the debounce time, increase if the output flickers
int prev = 0;              // previous value of debounce input

// PROGRAM VARS
int mode = 0;              // 0: counting up, 1: counting down, 2: dialing, 3: rotating
int ct = 0;                // count value
int ctDelay = 100;
int chaseVal = 0;          // 0-7: chase position

// GENERAL VARS
int i;                     // for keeping track of things
int j;                     // for keeping track of ms maths

// UNUSED PINS
int unusedPins[] = {0, 1, 18};   // Need two more pins for grinder timer: second button and relay

//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

void setup() {
  // SETUP SCROLL INPUT PINS 
  pinMode(upPin, INPUT);
  pinMode(dnPin, INPUT);
  // SET UP LED OUTPUTS
  for (i = 0; i < numPins; i++) {   // the array elements are numbered from 0 to num_pins - 1
    if (ledPins[i] != 0) pinMode((ledPins[i]), OUTPUT);
  }    
  // SET UP INPUT BUTTON
  pinMode(btnPin, INPUT);
  // WRITE ZEROES TO THE DIGITS
  displayDigits(0);
}

//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

void loop() {
  // DEBOUNCE BUTTON AND INCREMENT MODE
  btnVal = digitalRead(btnPin);
  if (btnVal == HIGH && prev == LOW && millis() - time > debounce) {
    mode++;
    if (mode > 4) mode=0;
    time = millis();
  }
  prev = btnVal;
 
  // COUNT UP
  if (mode == 0) {
    if (ct < 100) ct++;
    else ct = 0;
    delay(ctDelay);
  }

  // COUNT DOWN
  else if (mode == 1) {
    if (ct > -1) ct--;
    else ct = 99;
    delay(ctDelay);
  }

  // DIAL VALUE
  else if (mode == 2) {
    upPinVal = digitalRead(upPin);
    dnPinVal = digitalRead(dnPin);
    if ((upPinLast == LOW) && (upPinVal == HIGH)) ct++;
    else if ((dnPinLast == LOW) && (dnPinVal == HIGH)) ct--;
    ct = max(min(ct, 99), 0);
    upPinLast = upPinVal;
    dnPinLast = dnPinVal;
  }
  
  // CHASE
  else if (mode == 3) {
    displayChase(chaseVal);
    chaseVal++;
    if (chaseVal == 8) chaseVal = 0;
    delay(ct);
  }

  // CHASE 2
  else if (mode == 4) {
    displayChase2(chaseVal);
    chaseVal++;
    if (chaseVal == 8) chaseVal = 0;
    delay(ct);
  }

  // DISPLAY THE NUMBER
  displayDigits(ct);
}

//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

void displayChase(int val) {
  for (i = 0; i < numPins; i++) {
    if (val == 0 && i==14) digitalWrite(ledPins[i], HIGH);
    else if (val == 1 && i==9) digitalWrite(ledPins[i], HIGH);
    else if (val == 2 && i==11) digitalWrite(ledPins[i], HIGH);
    else if (val == 3 && i==7) digitalWrite(ledPins[i], HIGH);
    else if (val == 4 && i==5) digitalWrite(ledPins[i], HIGH);
    else if (val == 5 && i==2) digitalWrite(ledPins[i], HIGH);
    else if (val == 6 && i==1) digitalWrite(ledPins[i], HIGH);
    else if (val == 7 && i==13) digitalWrite(ledPins[i], HIGH);
    else digitalWrite(ledPins[i], LOW);
  }
}

void displayChase2(int val) {
  for (i = 0; i < numPins; i++) {
    if (val == 0 && (i==14 || i==9)) digitalWrite(ledPins[i], HIGH);
    else if (val == 1 && (i==9 || i==11)) digitalWrite(ledPins[i], HIGH);
    else if (val == 2 && (i==11 || i==7)) digitalWrite(ledPins[i], HIGH);
    else if (val == 3 && (i==7 || i==5)) digitalWrite(ledPins[i], HIGH);
    else if (val == 4 && (i==5 || i==2)) digitalWrite(ledPins[i], HIGH);
    else if (val == 5 && (i==2 || i==1)) digitalWrite(ledPins[i], HIGH);
    else if (val == 6 && (i==1 || i==13)) digitalWrite(ledPins[i], HIGH);
    else if (val == 7 && (i==13 || i==14)) digitalWrite(ledPins[i], HIGH);
    else digitalWrite(ledPins[i], LOW);
  }
}

void displayDigits(int val) {
  int pos2digit = val%10;
  int pos1digit = (val-pos2digit)/10;
  displayDigit(1, pos1digit);
  displayDigit(2, pos2digit);
}

void displayDigit(int pos, int digit) {
  for (i = 0; i < numPins; i++) {
    if (pos == 1) {
      if (digit == 0) { if (pos1poss[i] && d0[i]) digitalWrite(ledPins[i], HIGH);
        else if (pos1poss[i]) digitalWrite(ledPins[i], LOW); }
      if (digit == 1) { if (pos1poss[i] && d1[i]) digitalWrite(ledPins[i], HIGH);
        else if (pos1poss[i]) digitalWrite(ledPins[i], LOW); }
      if (digit == 2) { if (pos1poss[i] && d2[i]) digitalWrite(ledPins[i], HIGH);
        else if (pos1poss[i]) digitalWrite(ledPins[i], LOW); }
      if (digit == 3) { if (pos1poss[i] && d3[i]) digitalWrite(ledPins[i], HIGH);
        else if (pos1poss[i]) digitalWrite(ledPins[i], LOW); }
      if (digit == 4) { if (pos1poss[i] && d4[i]) digitalWrite(ledPins[i], HIGH);
        else if (pos1poss[i]) digitalWrite(ledPins[i], LOW); }
      if (digit == 5) { if (pos1poss[i] && d5[i]) digitalWrite(ledPins[i], HIGH);
        else if (pos1poss[i]) digitalWrite(ledPins[i], LOW); }
      if (digit == 6) { if (pos1poss[i] && d6[i]) digitalWrite(ledPins[i], HIGH);
        else if (pos1poss[i]) digitalWrite(ledPins[i], LOW); }
      if (digit == 7) { if (pos1poss[i] && d7[i]) digitalWrite(ledPins[i], HIGH);
        else if (pos1poss[i]) digitalWrite(ledPins[i], LOW); }
      if (digit == 8) { if (pos1poss[i] && d8[i]) digitalWrite(ledPins[i], HIGH);
        else if (pos1poss[i]) digitalWrite(ledPins[i], LOW); }
      if (digit == 9) { if (pos1poss[i] && d9[i]) digitalWrite(ledPins[i], HIGH);
        else if (pos1poss[i]) digitalWrite(ledPins[i], LOW); }
    }
    else if (pos == 2) {
      if (digit == 0) { if (pos2poss[i] && d0[i]) digitalWrite(ledPins[i], HIGH);
        else if (pos2poss[i]) digitalWrite(ledPins[i], LOW); }
      if (digit == 1) { if (pos2poss[i] && d1[i]) digitalWrite(ledPins[i], HIGH);
        else if (pos2poss[i]) digitalWrite(ledPins[i], LOW); }
      if (digit == 2) { if (pos2poss[i] && d2[i]) digitalWrite(ledPins[i], HIGH);
        else if (pos2poss[i]) digitalWrite(ledPins[i], LOW); }
      if (digit == 3) { if (pos2poss[i] && d3[i]) digitalWrite(ledPins[i], HIGH);
        else if (pos2poss[i]) digitalWrite(ledPins[i], LOW); }
      if (digit == 4) { if (pos2poss[i] && d4[i]) digitalWrite(ledPins[i], HIGH);
        else if (pos2poss[i]) digitalWrite(ledPins[i], LOW); }
      if (digit == 5) { if (pos2poss[i] && d5[i]) digitalWrite(ledPins[i], HIGH);
        else if (pos2poss[i]) digitalWrite(ledPins[i], LOW); }
      if (digit == 6) { if (pos2poss[i] && d6[i]) digitalWrite(ledPins[i], HIGH);
        else if (pos2poss[i]) digitalWrite(ledPins[i], LOW); }
      if (digit == 7) { if (pos2poss[i] && d7[i]) digitalWrite(ledPins[i], HIGH);
        else if (pos2poss[i]) digitalWrite(ledPins[i], LOW); }
      if (digit == 8) { if (pos2poss[i] && d8[i]) digitalWrite(ledPins[i], HIGH);
        else if (pos2poss[i]) digitalWrite(ledPins[i], LOW); }
      if (digit == 9) { if (pos2poss[i] && d9[i]) digitalWrite(ledPins[i], HIGH);
        else if (pos2poss[i]) digitalWrite(ledPins[i], LOW); }
    }
  }
}