// PORTD = D0 - D7
// PORTC = A0 - A5, PC6 = RESET
// PORTB = D8 - D13
/*
  DDRB7  PORTB7  example
  DDRxn  PORTxn  state (?PINxn?)
  0       0    INPUT
  0       1    INPUT_PULLUP
  1       0    OUTPUT LOW
  1       1    OUTPUT HIGH

  SEGMENTS
     A
    ---
  F| G |B
    ---
  E|   |C
    --- o DP
     D

   PINS D13 D12 D11 D10 D09 D08 | D07 D06 D05 D04 D03 D02 TxD RxD 
   PORT PB5 PB4 PB3 PB2 PB1 PB0 | PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0 
   SEGS  L   -   -   -  dp   g  |  f   e   d   c   b   a   -   - 

   PINS A05 A04 A03 A02 A01 A00 RST
   PORT PC5 PC4 PC3 PC2 PC1 PC0 PC6
         -   -   -   -   -   -   -
*/

byte digit[] = {
  B11111100, // 0 = 0xfd, dp = 0
  B01100000, // 1
  B11011010, // 2
  B11110010, // 3
  B01100110, // 4
  B10110110, // 5
  B00111110, // 6
  B11100000, // 7
  B11111110, // 8
  B11110110  // 9
};

byte tensdigit, unitsdigit, counter = 0;
int dly = 1000;
byte buttonPin = 18; // analog pin A4

void setup() {
  DDRD |= B11111110;
  DDRB |= B00000110;
  PORTD = 0x00;
  PORTB = 0x00;
  shownumber(2);
  while (1);
}

void loop() {
  if (digitalRead(buttonPin)) {
    for (counter = 0; counter < 100; counter++) {

      tensdigit = counter / 10;
      unitsdigit = counter % 10;

      PORTB |= B00000100;
      PORTB &= B11111101;
      shownumber(unitsdigit);
      delay(dly);

      PORTB |= B00000010;
      PORTB &= B11111011;
      shownumber(tensdigit);
      delay(dly);
    }
  }
}

void shownumber(int number) {
  switch (number) {
    case 0 :
      PORTD = digit[0];
      break;

    case 1:
      PORTD = digit[1];
      break;

    case 2:
      PORTD = digit[2];
      break;

    case 3:
      PORTD = digit[3];
      break;

    case 4:
      PORTD = digit[4];
      break;

    case 5:
      PORTD = digit[5];
      break;

    case 6:
      PORTD = digit[6];
      break;

    case 7:
      PORTD = digit[7];
      break;

    case 8:
      PORTD = digit[8];
      break;

    case 9:
      PORTD = digit[9];
      break;
  }
}