Не могу заставить 4 значный 7 сегментный дисплей показывать разные значения

У меня, новичка в Arduino, возникли проблемы с тем, чтобы заставить работать 4-значный 7-сегментный дисплей. Дисплей подключен к 74HC595, а настройка взята из учебника elegoo tutorial 28 (я думаю, что это только для скачивания).

Я понял, как управлять тем, какое число отображать, но все 4 цифры всегда имеют одно и то же число, так что оно всегда похоже на 1111, 5555, 9999 и т. Д.

Я слышал о чем-то, называемом мультиплексированием, которое может помочь, но пока не могу адаптировать его к своему проекту, так как не хватает слишком большого опыта.

Это код, который переключается между 2222 и 8888. Я хочу иметь возможность отображать любое число, например 1234.

Любая помощь очень ценится.

int latch=9;  //74HC595  pin 9 STCP
int clock=10; //74HC595  pin 10 SHCP
int data=8;   //74HC595  pin 8 DS

void setup()
{
  pinMode(latch,OUTPUT);
  pinMode(clock,OUTPUT);
  pinMode(data,OUTPUT);
}

void Display(unsigned int num)
{  
  digitalWrite(latch,LOW);
  shiftOut(data,clock,MSBFIRST,num);
  digitalWrite(latch,HIGH); 
}

void loop()
{
    Display(91);
    delay(1000);
    Display(127);
    delay(1000);
}

image taken from the tutorial

, 👍2

Обсуждение

Мы понятия не имеем, что такое элегу. Покажите нам вашу схему., @Majenko

Либо вам нужно мультиплексирование, либо вам понадобится последовательная передача 4 74HC595, по одному на цифру. В противном случае вы не получите ничего другого, чем сейчас. Для мультиплексирования, я думаю, уже было много вопросов по этой теме. И поиск в Google покажет вам, что вам нужно., @jfpoilpret

Здравствуйте, у моего семисегмента есть 14-контактный код, можете ли вы отправить схематическую карту????, @hdihd9162


4 ответа


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

5

У вас есть общий катодный дисплей, и все ваши катоды подключены к земле через резисторы. У вас вообще нет возможности разделить разные цифры.

Вы не можете напрямую управлять таким дисплеем с помощью такого сдвигового регистра - вам нужно более прямое подключение к Arduino (оно должно быть высокоскоростным) и быстро последовательно включать и выключать каждый катод, чтобы отображать каждое из четырех чисел одно за другим.

Кроме того, резисторы должны находиться в 8 анодах, а не в 4 катодах.

,

Спасибо вам, Майенко, за то, что нашли время. Я предполагаю, что это означает, что эта учебная настройка не рекомендуется и нецелесообразна для использования для раздельного ввода всех цифр. Тогда мне придется искать другую настройку, которую я мог бы взять за основу., @Esshahn

Можно использовать регистр сдвига, если вы также подключите катоды к Arduino и выберите каждый из них по очереди. С регистром сдвига, хотя он может быть мерцающим. Код также намного сложнее, чем просто перенос числа., @Majenko

https://playground.arduino.cc/Main/SevenSegmentLibrary, @Majenko


1

но все 4 цифры всегда имеют один и тот же номер, так что это всегда похоже на 1111, 5555, 9999 и т. Д.

потому что именно для этого и предназначена эта конкретная схема.

Я слышал о чем-то под названием мультиплексирование, которое может помочь, но я пока не могу адаптировать его к своему проекту, так как не хватает слишком большого опыта.

мультиплексирование ничем не отличается от быстрого отображения каждой цифры (как вы делаете сейчас), а затем быстрого отображения следующей цифры ....

то, что вы делаете сейчас, будет способствовать вашему мультиплексированию обучения.

,

1

Проблема с этой настройкой заключается в схеме.

Вывод 10 главного сброса на 595 является плавающим.

Используйте резистор 10 К, чтобы поднять его до VCC (+5 В), и он будет работать.

Я получал всевозможные странные символы, пока не проверил технический паспорт на 595.

,

-1

Для последовательной работы этой цепи требуется колпачок на 0,1 мкФ от 595 VCC до Gnd. В идеале резистор между каждым выходом 595 и анодным выводом, а также транзистор или другое устройство с более высоким током, способное пропускать ток от 8 анодов, приводимых в действие одновременно (т. е. ULN2003). Как только катоды могут управляться отдельно, чтобы можно было выбирать каждую цифру индивидуально, можно использовать массив для сопоставления отображаемой цифры с сегментами на дисплее:

// добавить перед setup()
byte fontArray[] = {
0b00111111, // 0  где биты представляют dp-g-f-e-d-c-b-a
0b00000110, // 1  и 1 = сегмент включен
0b01011011, // 2 
// и т.д.
};

// и измените эту строку в функции display() для отображения числа

shiftOut(data,clock,MSBFIRST,fontArray[num); // ищет отображение сверху

// затем включите катод, чтобы отобразить его на 2-3 мс, затем выключите и отправьте 
// выведите информацию для следующей цифры
,