/*#########################
 * Zuornung Inputs Outputs#
 ########################*/

#define data 10       // Schieberegister Pin 14
// Schieberegister Pin 13 Output-Enable auf GND
#define latch 9       // Schieberegister Pin 12
#define clk 8         // Schieberegister Pin 11
#define clr 7         // Schieberegister Pin 10
#define setinput 2
#define hourinput 3
#define mininput 4
#define secinput 5
#define timerinput 6  //1Hz Counter Input

int sec;                          //Init - Globale Variablen
int minu;
int hour;
int sec1;
int sec2;
int sech;
int minu1;
int minu2;
int minuh;
int hour1;
int hour2;
int hourh;
int data1;
int set;
int hourset;
int minset;
int secset;
int timer;

void setup() {
  pinMode(data, OUTPUT);            //Init - PinMode setzen
  pinMode(clk, OUTPUT);
  pinMode(latch, OUTPUT);
  pinMode(clr, OUTPUT);
  pinMode(setinput, INPUT);
  pinMode(hourinput, INPUT);
  pinMode(mininput, INPUT);
  pinMode(secinput, INPUT);
  pinMode(timerinput, INPUT);

  digitalWrite(clr, LOW);           //Init - Schieberegister löschen
  digitalWrite(latch, LOW);
  digitalWrite(latch, HIGH);
  digitalWrite(clr, HIGH);
}

void loop() {

timer = digitalRead(timerinput);
while (timer == 1) {

  if (sec > 59) {                   //Global Clock Counter
    sec = 0;
    minu++;
    }
      if (minu >= 59) {
        minu = 0;
        hour++;
        }
          if (hour > 23) {
            hour = 0;
            }

/*##############################################
 * Zeitausgabe ohne Einstellen                 #
 * Stunden ausrechnen und ins Register schieben#
 #############################################*/

hour2 = hour / 10;                    //Zehner ausrechnen
hour1 = hour - hour2 * 10;             //Einer ausrechnen
  switch (hour2) {                   //Muster für 10er auswählen
    case 0: hourh = 1;
    break;
    case 1: hourh = 2;
    break;
    case 2: hourh = 4;
    break;
    case 3: hourh = 8;
    break;
    case 4: hourh = 16;
    break;
    case 5: hourh = 32;
    break;
}
  for (int i=0; i<6; i++) {         // 10er ins Register schieben (6 Stellen)
      digitalWrite(latch, LOW);
      digitalWrite(clk, LOW);
      data1 = hourh & 1;
      if (data1 == 1) {
      digitalWrite(data, HIGH);
      }
      else digitalWrite(data, LOW);
      hourh = hourh>>1;
      digitalWrite(clk, HIGH);
      }
  switch (hour1) {                   //Muster für 1er auswählen
    case 0: hourh = 1;
    break;
    case 1: hourh = 2;
    break;
    case 2: hourh = 4;
    break;
    case 3: hourh = 8;
    break;
    case 4: hourh = 16;
    break;
    case 5: hourh = 32;
    break;
    case 6: hourh = 64;
    break;
    case 7: hourh = 128;
    break;
    case 8: hourh = 256;
    break;
    case 9: hourh = 512;
    break;
}
  for (int i=0; i<10; i++) {       // 1er ins register schieben (10 Stellen)
      digitalWrite(latch, LOW);
      digitalWrite(clk, LOW);
      data1 = hourh & 1;
      if (data1 == 1) {
      digitalWrite(data, HIGH);
      }
      else digitalWrite(data, LOW);
      hourh = hourh>>1;
      digitalWrite(clk, HIGH);
      }

/*###############################################
 * Minuten ausrechnen und ins Registern schieben#
 ##############################################*/

minu2 = minu / 10;                    //Zehner ausrechnen
minu1 = minu - minu2 * 10;             //Einer ausrechnen
  switch (minu2) {                   //Muster für 10er auswählen
    case 0: minuh = 1;
    break;
    case 1: minuh = 2;
    break;
    case 2: minuh = 4;
    break;
    case 3: minuh = 8;
    break;
    case 4: minuh = 16;
    break;
    case 5: minuh = 32;
    break;
}
  for (int i=0; i<6; i++) {         // 10er ins Register schieben (6 Stellen)
      digitalWrite(latch, LOW);
      digitalWrite(clk, LOW);
      data1 = minuh & 1;
      if (data1 == 1) {
      digitalWrite(data, HIGH);
      }
      else digitalWrite(data, LOW);
      minuh = minuh>>1;
      digitalWrite(clk, HIGH);
      }
  switch (minu1) {                   //Muster für 1er auswählen
    case 0: minuh = 1;
    break;
    case 1: minuh = 2;
    break;
    case 2: minuh = 4;
    break;
    case 3: minuh = 8;
    break;
    case 4: minuh = 16;
    break;
    case 5: minuh = 32;
    break;
    case 6: minuh = 64;
    break;
    case 7: minuh = 128;
    break;
    case 8: minuh = 256;
    break;
    case 9: minuh = 512;
    break;
}
  for (int i=0; i<10; i++) {       // 1er ins register schieben (10 Stellen)
      digitalWrite(latch, LOW);
      digitalWrite(clk, LOW);
      data1 = minuh & 1;
      if (data1 == 1) {
      digitalWrite(data, HIGH);
      }
      else digitalWrite(data, LOW);
      minuh = minuh>>1;
      digitalWrite(clk, HIGH);
      }

/*###############################################
 * Sekunden ausrechnen und ins Register schieben#
 ##############################################*/
     
sec2 = sec / 10;                    //Zehner ausrechnen
sec1 = sec - sec2 * 10;             //Einer ausrechnen
  switch (sec2) {                   //Muster für 10er auswählen
    case 0: sech = 1;
    break;
    case 1: sech = 2;
    break;
    case 2: sech = 4;
    break;
    case 3: sech = 8;
    break;
    case 4: sech = 16;
    break;
    case 5: sech = 32;
}
for (int i=0; i<6; i++) {         // 10er ins Register schieben (6 Stellen)
      digitalWrite(latch, LOW);
      digitalWrite(clk, LOW);
      data1 = sech & 1;
      if (data1 == 1) {
      digitalWrite(data, HIGH);;
      }
      else digitalWrite(data, LOW);
      sech = sech >> 1;
      digitalWrite(clk, HIGH);
      }
sec2 = sec / 10;                    //Zehner ausrechnen
sec1 = sec - sec2 * 10;             //Einer ausrechnen
  switch (sec1) {                   //Muster für 1er auswählen
    case 0: sech = 1;
    break;
    case 1: sech = 2;
    break;
    case 2: sech = 4;
    break;
    case 3: sech = 8;
    break;
    case 4: sech = 16;
    break;
    case 5: sech = 32;
    break;
    case 6: sech = 64;
    break;
    case 7: sech = 128;
    break;
    case 8: sech = 256;
    break;
    case 9: sech = 512;
    break;
}
  for (int i=0; i<10; i++) {       // 1er ins register schieben (10 Stellen)
      digitalWrite(latch, LOW);
      digitalWrite(clk, LOW);
      data1 = sech & 1;
      if (data1 == 1) {
      digitalWrite(data, HIGH);
      }
      else digitalWrite(data, LOW);
      sech = sech>>1;
      digitalWrite(clk, HIGH);
      }
      digitalWrite(latch, HIGH);
      
/*#####################################
 * Hier die Zeitausgabe mit Einstellen#
 ####################################*/

set = digitalRead(setinput);          //Nachschauen ob der Set-Button gedrückt ist
while (set == 1) {
  hourset = digitalRead(hourinput);   //Nachschauen ob Stunden hochgezählt werden
  minset = digitalRead(mininput);     //Nachschauen ob Minuten hochgezählt werden
  secset = digitalRead(secinput);     //Nachschauen ob Sekunden hochgezählt werden
  if (hourset == 1) {                 //Hochzählen hour, sec, minu
    hour++;
  }
  if (minset == 1) {
    minu++;
  }
  if (secset == 1) {
    sec++;
  }
    if (sec > 59) {                   //Limits für Counter um nicht über 60Sek,60Min,24Std zu kommen
    sec = 0;
    }
      if (minu >= 59) {
        minu = 0;
        }
          if (hour > 23) {
            hour = 0;
            }
set = digitalRead(setinput);          //Nachschauen ob der Set-Button noch gedrückt wird
delay(200);                           //Zeit zum aktivieren des Hochzählens bei gedrückter Taste

/*##############################################
 * Stunden ausrechnen und ins Register schieben#
 #############################################*/

hour2 = hour / 10;                    //Zehner ausrechnen
hour1 = hour - hour2 * 10;            //Einer ausrechnen
  switch (hour2) {                   //Muster für 10er auswählen
    case 0: hourh = 1;
    break;
    case 1: hourh = 2;
    break;
    case 2: hourh = 4;
    break;
    case 3: hourh = 8;
    break;
    case 4: hourh = 16;
    break;
    case 5: hourh = 32;
    break;
}
  for (int i=0; i<6; i++) {         // 10er ins Register schieben (6 Stellen)
      digitalWrite(latch, LOW);
      digitalWrite(clk, LOW);
      data1 = hourh & 1;
      if (data1 == 1) {
      digitalWrite(data, HIGH);
      }
      else digitalWrite(data, LOW);
      hourh = hourh>>1;
      digitalWrite(clk, HIGH);
      }
  switch (hour1) {                   //Muster für 1er auswählen
    case 0: hourh = 1;
    break;
    case 1: hourh = 2;
    break;
    case 2: hourh = 4;
    break;
    case 3: hourh = 8;
    break;
    case 4: hourh = 16;
    break;
    case 5: hourh = 32;
    break;
    case 6: hourh = 64;
    break;
    case 7: hourh = 128;
    break;
    case 8: hourh = 256;
    break;
    case 9: hourh = 512;
    break;
}
  for (int i=0; i<10; i++) {       // 1er ins register schieben (10 Stellen)
      digitalWrite(latch, LOW);
      digitalWrite(clk, LOW);
      data1 = hourh & 1;
      if (data1 == 1) {
      digitalWrite(data, HIGH);
      }
      else digitalWrite(data, LOW);
      hourh = hourh>>1;
      digitalWrite(clk, HIGH);
      }

/*###############################################
 * Minuten ausrechnen und ins Registern schieben#
 ##############################################*/

minu2 = minu / 10;                    //Zehner ausrechnen
minu1 = minu - minu2 * 10;             //Einer ausrechnen
  switch (minu2) {                   //Muster für 10er auswählen
    case 0: minuh = 1;
    break;
    case 1: minuh = 2;
    break;
    case 2: minuh = 4;
    break;
    case 3: minuh = 8;
    break;
    case 4: minuh = 16;
    break;
    case 5: minuh = 32;
    break;
}
  for (int i=0; i<6; i++) {         // 10er ins Register schieben (6 Stellen)
      digitalWrite(latch, LOW);
      digitalWrite(clk, LOW);
      data1 = minuh & 1;
      if (data1 == 1) {
      digitalWrite(data, HIGH);
      }
      else digitalWrite(data, LOW);
      minuh = minuh>>1;
      digitalWrite(clk, HIGH);
      }
switch (minu1) {                   //Muster für 1er auswählen
    case 0: minuh = 1;
    break;
    case 1: minuh = 2;
    break;
    case 2: minuh = 4;
    break;
    case 3: minuh = 8;
    break;
    case 4: minuh = 16;
    break;
    case 5: minuh = 32;
    break;
    case 6: minuh = 64;
    break;
    case 7: minuh = 128;
    break;
    case 8: minuh = 256;
    break;
    case 9: minuh = 512;
    break;
}
  for (int i=0; i<10; i++) {       // 1er ins register schieben (10 Stellen)
      digitalWrite(latch, LOW);
      digitalWrite(clk, LOW);
      data1 = minuh & 1;
      if (data1 == 1) {
      digitalWrite(data, HIGH);
      }
      else digitalWrite(data, LOW);
      minuh = minuh>>1;
      digitalWrite(clk, HIGH);
      }

/*###############################################
 * Sekunden ausrechnen und ins Register schieben#
 ##############################################*/
     
sec2 = sec / 10;                    //Zehner ausrechnen
sec1 = sec - sec2 * 10;             //Einer ausrechnen
  switch (sec2) {                   //Muster für 10er auswählen
    case 0: sech = 1;
    break;
    case 1: sech = 2;
    break;
    case 2: sech = 4;
    break;
    case 3: sech = 8;
    break;
    case 4: sech = 16;
    break;
    case 5: sech = 32;
}
for (int i=0; i<6; i++) {         // 10er ins Register schieben (6 Stellen)
      digitalWrite(latch, LOW);
      digitalWrite(clk, LOW);
      data1 = sech & 1;
      if (data1 == 1) {
      digitalWrite(data, HIGH);;
      }
      else digitalWrite(data, LOW);
      sech = sech >> 1;
      digitalWrite(clk, HIGH);
      }

sec2 = sec / 10;                    //Zehner ausrechnen
sec1 = sec - sec2 * 10;             //Einer ausrechnen
  switch (sec1) {                   //Muster für 1er auswählen
    case 0: sech = 1;
    break;
    case 1: sech = 2;
    break;
    case 2: sech = 4;
    break;
    case 3: sech = 8;
    break;
    case 4: sech = 16;
    break;
    case 5: sech = 32;
    break;
    case 6: sech = 64;
    break;
    case 7: sech = 128;
    break;
    case 8: sech = 256;
    break;
    case 9: sech = 512;
    break;
}
  for (int i=0; i<10; i++) {       // 1er ins register schieben (10 Stellen)
      digitalWrite(latch, LOW);
      digitalWrite(clk, LOW);
      data1 = sech & 1;
      if (data1 == 1) {
      digitalWrite(data, HIGH);
      }
      else digitalWrite(data, LOW);
      sech = sech>>1;
      digitalWrite(clk, HIGH);
      }
      digitalWrite(latch, HIGH);
}
timer = digitalRead(timerinput);
}
timer = digitalRead(timerinput);
while (timer == 0) {
  timer = digitalRead(timerinput);
}
sec++;                              // Hochzählen!
}