/*
  Проверка индикаторов для часов
*/
//-------------------------------
#define ON_TIME   3        // время включенности одной цифры, мс
#define OFF_TIME 17        // время выключенности одной цифры, мс
#define N_CYCL   25        // количество циклов демонстрации цифры
#define N_NIX     7        // количество индикаторов
#define N_DIGITS  10       // количество цифр на индикаторе
// пины
#define DECODER0 A0
#define DECODER1 A1
#define DECODER2 A2
#define DECODER3 A3
#define KEY0 4    // точка
#define KEY1 10   // часы
#define KEY2 9    // часы
#define KEY3 5    // минуты
#define KEY4 6    // минуты
#define KEY5 7    // секунды
#define KEY6 8    // секунды
int opts[] = {KEY0, KEY1, KEY2, KEY3, KEY4, KEY5, KEY6};
byte    shDigit;                        // номер текущей отображаемой цифры
byte counter;
//------------------------------
void setup() {
  pinMode(DECODER0, OUTPUT);
  pinMode(DECODER1, OUTPUT);
  pinMode(DECODER2, OUTPUT);
  pinMode(DECODER3, OUTPUT);
  pinMode(KEY0, OUTPUT);
  pinMode(KEY1, OUTPUT);
  pinMode(KEY2, OUTPUT);
  pinMode(KEY3, OUTPUT);
  pinMode(KEY4, OUTPUT);
  pinMode(KEY5, OUTPUT);
  pinMode(KEY6, OUTPUT);
}
void loop() {
  for( shDigit = 0; shDigit < N_DIGITS; shDigit++) {
   showDigits();
  }
}
void showDigits() {
  setDigit(shDigit);
  for( counter = 0; counter < N_NIX; counter++) {
    for( int myTimer = 0; myTimer < N_CYCL; myTimer++) {
       digitalWrite(opts[counter], 1);
       delay(ON_TIME);
       digitalWrite(opts[counter], 0);
       delay(OFF_TIME);
    }
  }
}
// настраиваем декодер согласно отображаемой ЦИФРЕ
void setDigit(byte digit) {
  switch (digit) {
    case 0: setDecoder(0, 0, 0, 0);
      break;
    case 1: setDecoder(1, 0, 0, 0);
      break;
    case 2: setDecoder(0, 0, 1, 0);
      break;
    case 3: setDecoder(1, 0, 1, 0);
      break;
    case 4: setDecoder(0, 0, 0, 1);
      break;
    case 5: setDecoder(1, 0, 0, 1);
      break;
    case 6: setDecoder(0, 0, 1, 1);
      break;
    case 7: setDecoder(1, 0, 1, 1);
      break;
    case 8: setDecoder(0, 1, 0, 0);
      break;
    case 9: setDecoder(1, 1, 0, 0);
      break;
    case 10: setDecoder(0, 1, 1, 1);    // выключить цифру!
      break;
  }
}
// функция настройки декодера
void setDecoder(boolean dec0, boolean dec1, boolean dec2, boolean dec3) {
  digitalWrite(DECODER0, dec0);
  digitalWrite(DECODER1, dec1);
  digitalWrite(DECODER2, dec2);
  digitalWrite(DECODER3, dec3);
}