
#define DS 8 //линия для передачи данных
#define SH 7 //сдвиг разряда на единицу
#define ST 4 //установка режима ввода или вывода данных

//создадим "библиотеку" кодов 
//коды чисел на индикаторе
byte digitsArr[10]={
  0b11000000, //число 0
  0b11111001, //число 1
  0b10100100, //число 2
  0b10110000, //число 3
  0b10011001, //число 4
  0b10010010, //число 5
  0b10000010, //число 6
  0b11111000, //число 7
  0b10000000, //число 8
  0b10010000, //число 9
};

//коды числе с точкой на индикаторе
byte digitsDotArr[10]={
  0b01000000, //число 0
  0b01111001, //число 1
  0b00100100, //число 2
  0b00110000, //число 3
  0b00011001, //число 4
  0b00010010, //число 5
  0b00000010, //число 6
  0b01111000, //число 7
  0b00000000, //число 8
  0b00010000, //число 9
};

//коды выбора разряда числа
byte regArr[4]={
  0b11111000, //разряд 0
  0b11110100, //разряд 1
  0b11110010, //разряд 2
  0b11110001, //разряд 3
};

// массив для удобного вывода
byte chArr[4]={0,0,0,0};

int number = 0;
int MIN = 0;
int HOUR = 0;
unsigned long timer;
unsigned long timer2;

int LED_D1 = 10;                // Указываем вывод светодиода
int LED_D2 = 11;                // Указываем вывод светодиода
int LED_D3 = 12;                // Указываем вывод светодиода
int butt_1 = A1;                // Указываем вывод кнопки
int butt_2 = A2;                // Указываем вывод кнопки
int butt_3 = A3;                // Указываем вывод кнопки

int val1; 
int val2; 

void setup (){
  pinMode(DS,OUTPUT); // Устанавливаем вывод как выход
  pinMode(SH,OUTPUT); // Устанавливаем вывод как выход
  pinMode(ST,OUTPUT); // Устанавливаем вывод как выход

  pinMode(LED_D1, OUTPUT);       // Устанавливаем вывод как выход
  pinMode(LED_D2, OUTPUT);       // Устанавливаем вывод как выход
  pinMode(LED_D3, OUTPUT);       // Устанавливаем вывод как выход
  pinMode(butt_1, INPUT);        // Устанавливаем вывод как вход
  pinMode(butt_2, INPUT);        // Устанавливаем вывод как вход
  pinMode(butt_3, INPUT);        // Устанавливаем вывод как вход
}

void loop(){ 

  if (millis() - timer2 > 1000) {
      timer = millis();
      val1=digitalRead(butt_1);
      val2=digitalRead(butt_2);
      if (val1==val2){
        for (int i=0; i<4; i++){
          chArr[i]=0;
        }  
    }
  }
      
      

      
  val=digitalRead(butt_1);       // Считываем данные порта в переменную val
   
  if (val == LOW){digitalWrite(LED_D1, LOW);}
  else           {digitalWrite(LED_D1,HIGH);}
   
  val=digitalRead(butt_2);       // Считываем данные порта в переменную val
   
  if (val == LOW){digitalWrite(LED_D2, LOW);}
  else           {digitalWrite(LED_D2,HIGH);}
   
  val=digitalRead(butt_3);       // Считываем данные порта в переменную val
   
  if (val == LOW){digitalWrite(LED_D3, LOW);}
  else           {digitalWrite(LED_D3,HIGH);}
    
  //таймер "реального времени"
  if (millis() - timer > 1000) {
      timer = millis();
      MIN = MIN + 1;
      if (MIN > 59) { 
        MIN = 0;
        HOUR = HOUR + 1; 
      }
      if (HOUR>23){
        MIN=0;
        HOUR=0;
      }

       //формируем число для вывода на индикатор
      number=100*HOUR+MIN;

      int thousands = number/1000%10; //выделяем десятки часов
      int hundreds = number/100%10;   //выделяем единицы часов
      int tens = number/10%10;        //выделяем десятки минут
      int unit = number%10;           //выделяем единицы минут
      
      //записываем в массив для удобного использования
      chArr[0]=unit;
      chArr[1]=tens;
      chArr[2]=hundreds;
      chArr[3]=thousands;
   }

  

  }
  for (int i = 0; i<4; i++){
    
    //вывод числа с точной во втором разряде и без точки в остальных
    if (i==2){
      digitalWrite(ST, LOW); //Устанавливаем на 12х выводах регистров режим ввода данных
      shiftOut(DS, SH, MSBFIRST, digitsDotArr[chArr[i]]); //Запись информации в правый регистр
      shiftOut(DS, SH, MSBFIRST, regArr[i]);    //Запись информации в левый регистр
      digitalWrite(ST, HIGH); //Устанавливаем на 12х выводах регистров режим вывода данных
    }
    
    else {
      digitalWrite(ST, LOW); //Устанавливаем на 12х выводах регистров режим ввода данных
      shiftOut(DS, SH, MSBFIRST, digitsArr[chArr[i]]); //Запись информации в правый регистр
      shiftOut(DS, SH, MSBFIRST, regArr[i]);    //Запись информации в левый регистр
      digitalWrite(ST, HIGH); //Устанавливаем на 12х выводах регистров режим вывода данных
    }
  }
}

