Arduino uno - 4-значный 7-сегментный дисплей через 74HC595 продолжает мигать

Я пытаюсь перевести свой 4-разрядный дисплей (SH5461AS) в диапазон от 0 до 9 с помощью функции millis().

Проблема в том, что он продолжает мигать. Даже если я показываю только одно число, оно отображается, затем становится черным, а затем снова отображается вместо того, чтобы оставаться включенным. Также верхний сегмент (A) несколько задерживается. Иногда показывает, иногда нет. Я действительно не уверен, что происходит. Лучше всего это показано на видео: https://youtube.com/shorts/gmbNnvEYq2I

Я подключил Arduino UNO R3 к 8-битному регистру 74HC595, а оттуда к соответствующим контактам «данных» на дисплее. Это обычный катод, поэтому все они подключены к земле через резистор.

Приношу извинения за беспорядочную проводку:

От дисплея в основном все резисторы подключаются к земле, а все кабели данных к регистру (Q0-DP опущены, сегменты A-Q7, B-Q6, .., G-Q1 [десятичное число 1=A, 2=B , 3=АВ,..]).

В реестре я получил VCC, заземление, кабели данных, заземление EO, последовательные данные->arduino D4, часы хранения-> D5, сдвиг часов -> D6

 #include <LiquidCrystal.h>

// ЖК-дисплей
const int rs = 7, en = 8, d4 = 9, d5 = 10, d6 = 11, d7 = 12;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

//7SEG ДИСПЛЕЙ
int LATCH = 5;
int CLOCK = 6;
int SERIALPIN = 4;

const byte numbers[] = {
  0b111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1101111
};

//ДРУГОЙ

void setup() {
  // ЖК-дисплей
  lcd.begin(16, 2);
  lcd.print("Test!");

  //7СЕГ
  pinMode(SERIALPIN, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  pinMode(LATCH, OUTPUT);

  //ДРУГОЙ
  pinMode(13, OUTPUT); // выключаем бортовой диод
  Serial.begin(9600);
}

void loop() {
  countSeconds();
  delay(1000);
}

void countSeconds(){
    digitalWrite(LATCH, LOW);
    // целое число = (millis()/1000%10);
    // Serial.println(номер);
    shiftOut(SERIALPIN, CLOCK, LSBFIRST, numbers[0]); //для демонстрации отображаем 0
    digitalWrite(LATCH, HIGH);
}

Есть идеи, что не так?

, 👍1

Обсуждение

что произойдет, если вы поменяете местами две строки программы digitalWrite()?, @jsotola

Трудно сказать, но похоже, что контакт сброса плавает. Убедитесь, что он привязан высоко (или контролируется вашим MCU)., @Mat


1 ответ


Лучший ответ:

1

Как указал @Mat, контакт сброса на сдвиговом регистре не был подключен. Я не понимал, что мне нужно закрепить его высоко. Решил все проблемы, я предполагаю, что это был непредсказуемый сброс..

,