Чтение цифр времени от DS1307 и запуск кода на основе возврата

В настоящее время я читаю раздачу adafruit DS1307, и мне нужно управлять двумя трубами nixie из регистра сдвига. Сдвиговый регистр работает с двумя 64141 микросхемами. У меня есть код, который проходит по всем цифрам nixie по одному с задержкой в ​​1 секунду между ними. Теперь мне нужно написать какой-то код, чтобы вывести мин, час и секунду и изменить низкие /высокие выходы регистра сдвига, чтобы отобразить правильную цифру nixie. У меня есть DS1307, возвращающий правильное время на моем ком, используя

 Serial.print(now.hour(), DEC);
 Serial.print(now.minute(), DEC);
 Serial.print(now.second(), DEC);

Однако я не уверен, как измерить строку, установите эту строку, равную двум цифрам в час, минуту или время, а затем разделите две цифры и напишите, если операторы правильно отображают трубки. Я привык к VB.NET и теперь кодированию C.

======================= UPDATE =======================

Я использую этот код для установки любой отдельной цифры трубки nixie.

       //Turn on 0
 sr.set(4, LOW);
 sr.set(5, LOW);
 sr.set(6, LOW);
 sr.set(7, LOW);

sr - регистр сдвига, и каждое число - это какая-то нога сдвигового регистра, который я поворачиваю низко или высоко. Эта конкретная деталь включает цифру 0.

3 голоса | спросил Cheddar 14 12016vEurope/Moscow11bEurope/MoscowMon, 14 Nov 2016 02:16:30 +0300 2016, 02:16:30

1 ответ


0

Вы можете настроить массив, содержащий шаблоны бит, чтобы включить разные цифры, а затем использовать код, который отправляет биты для высокой цифры now.hour()/12 и биты для младшей цифры now.hour()%12. Например:

const byte digiBits[] = { B0000, B0001, 
// and so forth for all the digits ...
};

void send1Digit(byte digiVal, byte whichDigit) {
  // somehow use whichDigit to direct the bits someplace...

  // To send the bits:
  byte bits = digiBits[digiVal];
  for (byte i=4; i<8; ++i) {
    sr.set(i, bits & 1);  // Set a bit in SR to 0 or 1
    bits >>= 1; // shift out the used bit
  }
}

void send2Digits(byte numVal, byte whichDigit) {
  send1Digit(numVal/10, whichDigit);
  send1Digit(numVal%10, whichDigit+1);
}

void loop() {
  // other stuff, then:
  send2Digits(now.hour(), HourSpot);
  send2Digits(now.minute(), MinuteSpot);
  send2Digits(now.second(), SecondSpot);
  // other stuff ...
}

Примечание 1: Если ваша подпрограмма sr.set() выполняет сложную маскировку или перенос, вы можете избежать некоторых из них с помощью ORing digiBits[digiVal] с любым номером sr.set() может строиться до смещения.

Примечание 2: Если числовое значение digiBits[digiVal] равно digiVal, то не беспокойтесь, определяя digiBits[], но вместо этого в send1Digit() просто скажите byte bits = digiVal или используйте digiVal непосредственно вместо bits.

ответил James Waldby - jwpat7 14 12016vEurope/Moscow11bEurope/MoscowMon, 14 Nov 2016 04:46:07 +0300 2016, 04:46:07

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132