Прошу помощи со скетчем для часов на вакуумно-люминисцентном индикаторе

Arnold

✩✩✩✩✩✩✩
17 Мар 2021
1
0
Попал ко мне в руки вакуумно-люминисцентный индикатор от какой-то кассы, точно не знаю. Индикатор семи сегментный, 10 разрядов. Рядом на плате расположен 20 битный сдвиговый регистр, которым управляется индикатор. Конечно сам бог велел сделать из этого часы.
Путём нехитрых экспериментов выяснил, что регистр 5812 (надпись на корпусе), управляется точно так-же как и всем известный 74HC595, только вместо 1байта нужно слать 20 бит.
Выходы регистра 5812 соединены с анодами (a, b, c, d, e, f, g, dp, h) и сетками (1, 2, 3, 4, 5, 6, 7, 8, 9, 10). Для того, чтобы вывести какое ни-будь число на индикатор я через функцию shiftOut передаю 20 байт.
Для себя сделал табличку соответствия цифр и разрядов. Например чтобы высветилось число пять в шестом разряде нужно на вход регистра послать 0х16083.
также написал скетч который выводит на индикатор любое число до 10 знаков.
C++:
#define DATA_PIN    7 // пин данных (англ. data)
#define LATCH_PIN   9 // пин строба (англ. latch)
#define CLOCK_PIN   8 // пин такта (англ. clock)
unsigned long digital;  //число которое будем выводить
unsigned long bytesHex[10]; // массив буфера чисел в HEX коде
unsigned long bytesOut[10]; // массив кодов HEX для вывода на индикатор
byte amount; // количество цифр в числе digital
void setup() {
  Serial.begin(9600);

  pinMode(DATA_PIN, OUTPUT); //объявляем пины как выход
  pinMode(CLOCK_PIN, OUTPUT);
  pinMode(LATCH_PIN, OUTPUT);



  //Разбиваем число на цыфры
  digital = 12345678;   // число, которое нужно разбить
  int8_t bytes[10];      // буфер
  //byte amount;           // количество цифр в числе
  for (byte i = 0; i < 10; i++) { //>
    bytes[i] = digital % 10; // записываем остаток в буфер
    digital /= 10;         // "сдвигаем" число
    if (digital == 0) {    // если число закончилось
      amount = i;       // запомнили, сколько знаков
      break;
    }
  }
  // массив bytes хранит цифры числа data в обратном порядке!
  for (int8_t i = amount; i >= 0; i--) {  //>
    Serial.println(bytes[i]);   // выводим
  }


  //Присваиваем цыфрам код для вывода на индикатор
  for (int8_t i = amount; i >= 0; i--) {
    switch (bytes[i])  // массив с цыфрами числа digital
    {
      case 0:                        //на выходе получаем всем цифрам присвоен код в HEX
        bytesHex[i] = {0x1E005};
        break;
      case 1:
        bytesHex[i] = {0xC000};
        break;
      case 2:
        bytesHex[i] = {0x1A006};
        break;
      case 3:
        bytesHex[i] = {0x1E002};
        break;
      case 4:
        bytesHex[i] = {0xC003};
        break;
      case 5:
        bytesHex[i] = {0x16003};
        break;
      case 6:
        bytesHex[i] = {0x16007};
        break;
      case 7:
        bytesHex[i] = {0x1C000};
        break;
      case 8:
        bytesHex[i] = {0x1E007};
        break;
      case 9:
        bytesHex[i] = {0x1E003};
        break;

    }
    Serial.println(bytesHex[i], HEX);
    Serial.println (i);
  }
  Serial.print ("amount") ;
  Serial.println (amount);
  // присваиваем код разряда для вывода на индикатор
  for (int8_t i = amount; i >= 0; i--) {
    switch (i)  // массив с кодами числа digital
    {
      case 0:                        //на выходе получаем всем цифрам присвоен код в HEX
        bytesOut[i] = bytesHex [i] + 0x1000;  // 1 разряд
        break;
      case 1:
        bytesOut[i] = bytesHex [i] + 0x800; // 2 разряд
        break;
      case 2:
        bytesOut[i] = bytesHex [i] + 0x400; // 3 разряд
        break;
      case 3:
        bytesOut[i] = bytesHex [i] + 0x200; // 4 разряд
        break;
      case 4:
        bytesOut[i] = bytesHex [i] + 0x100; // 5 разряд
        break;
      case 5:
        bytesOut[i] = bytesHex [i] + 0x80; // 6 разряд
        break;
      case 6:
        bytesOut[i] = bytesHex [i] + 0x40; // 7 разряд
        break;
      case 7:
        bytesOut[i] = bytesHex [i] + 0x20; // 8 разряд
        break;
      case 8:
        bytesOut[i] = bytesHex [i] + 0x10; // 9 разряд
        break;
      case 9:
        bytesOut[i] = bytesHex [i] + 0x40000; // 10 разряд
        break;

    }
    Serial.println(bytesOut[i], HEX);

  }
}

void loop() {
  // вывод на индикатор
  for (int8_t i = amount; i >= 0; i--) {
    digitalWrite(LATCH_PIN, LOW); // для записи притягиваем пин строба к земле
    shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, (bytesOut[i] >> 16));
    shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, (bytesOut[i] >> 8));
    shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, bytesOut[i]);
    digitalWrite(LATCH_PIN, HIGH); //чтобы переданое число отразилось на выходе регистра подаём высокий сигнал на пин строба

  }
}
Дальше хочу написать скетч для часов, пока планируется чтобы было типа два экрана, первый время "ЧЧ-ММ-СС" и второй дата "ДД-ММ-ГГГГ". Помогите организовать отображение "-" и пробелов в числе.