#define LED_1 13 // LED pins
#define LED_2 12
#define LED_3 11
#define LED_4 10

#define BUZ 3 // The speaker enable

#define POT A0 // The analog input for the potentiometer

#define S_1 A1 // The input pushbuttons
#define S_2 A2
#define S_3 A3

#define D_LATCH 4 // The 3 pins that control the display
#define D_CLK 7
#define D_DATA 8

const byte numMap[] = {0x03, 0x9F, 0x25, 0x0D, 0x99, 0x49, 0x41, 0x1F, 0x01, 0x09, 0x11, 0xC1, 0x63, 0x85, 0x61, 0x71, 0xFF};
const byte digitMap[] = {0x00, 0x80, 0x40, 0x20, 0x10};

int dig1, dig2, dig3, dig4;

unsigned int count;

unsigned long timer = millis();

void dispNum(int digitNum, int Value) {
  digitalWrite(D_LATCH, LOW);
  shiftOut(D_DATA, D_CLK, LSBFIRST, numMap[Value]);
  shiftOut(D_DATA, D_CLK, LSBFIRST, digitMap[digitNum] );
  digitalWrite(D_LATCH, HIGH);
}


void setup() {
  //Leds
  pinMode(LED_1, OUTPUT);
  digitalWrite(LED_1, HIGH);
  pinMode(LED_2, OUTPUT);
  digitalWrite(LED_2, HIGH);
  pinMode(LED_3, OUTPUT);
  digitalWrite(LED_3, HIGH);
  pinMode(LED_4, OUTPUT);
  digitalWrite(LED_4, HIGH);

  //Drukknoppen
  pinMode(S_1, INPUT);
  pinMode(S_2, INPUT);
  pinMode(S_3, INPUT);

  //Buzzer
  pinMode(BUZ, OUTPUT);
  digitalWrite(BUZ, HIGH);

  //Display
  pinMode(D_LATCH , OUTPUT);
  pinMode(D_CLK , OUTPUT);
  pinMode(D_DATA , OUTPUT);
  dispNum(1, 16);
  dispNum(2, 16);
  dispNum(3, 16);
  dispNum(4, 16);
  dispNum(0, 16);
}

void loop() {
  
  dig1 = count / 4096;
  dispNum(1, dig1);
  dig2 = (count - (dig1 * 4096)) / 256;
  dispNum(2, dig2);
  dig3 = (count - dig1 * 4096 - dig2 * 256) / 16;
  dispNum(3, dig3);
  dig4 = (count - dig1 * 4096 - dig2 * 256 - dig3 * 16);
  dispNum(4, dig4);
  dispNum(0, 16);
  delay(25);

  if(timer < millis()) {
    count++;
    timer = timer + 100;
  }
}