Пост от 21.05.2023, 05:06:00

Отредактирован 30.01.2026, 22:34:02

Категории: programming

Время чтения: 3мин.

74hc595 7 сегментный дисплей с 8-ю цифрами и Ардуино

Так как нормального туториала для данного дисплея нет, я прикладываю хотя бы бекап поста с arduino.on.kg. Там есть код для 4-х цифрового дисплея, но не для 8. Сначала прочитайте его, потом вернитесь сюда, там хорошие объяснения.

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

Но давайте по порядку, дисплей выглядит вот так:

Сверху

И снизу

Снизу

Код-драйвер для дисплея ниже, поставьте в Digits количество цифр.

display-example.ino
/*
* Пины для подсоединения индикатора на 7-сегментных дисплеях на 74НС595
* Display[+5V]
* Display[SCLK] to PIN6
* Display[DIO] to PIN5
* Display[RCLK] to PIN4
* Display[GND]
*/
const int Latch = 4; //RCK
const int Clock = 6; //SCK
const int Digits = 8; // Количество цифр
const int Start = 1 << (Digits - 1);
/*
* Формируем из сегментов цифру
*/
// Цифры 0 1 2 3 4 5 6 7 8 9
byte symbolsEncoded[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
/*
* Точка для разряда
*/
byte pointDigit = 0x80;
// Буфер экрана, слева направо
byte screenBuffer[8] = {1,2,3,4,5,6,7,9};
void setup()
{
//Определяем все назначенные пины как выходы
pinMode(Latch, OUTPUT);
pinMode(Clock, OUTPUT);
pinMode(Data, OUTPUT);
Serial.begin(9600);
}
void loop()
{
for(int i = 0; i < Digits; i++){
//Чтобы начать работу с дисплеем нужно установить пин "защелку"
//в низкий уровень, пока есть низкий уровень можно записывать
//в регистр значения, кодирующие включение нужных сегментов
//в нужном разряде
digitalWrite(Latch, LOW);
//Сначала отправляется байт кодирующий цифру в нашем буфере
shiftOut(Data, Clock, MSBFIRST, symbolsEncoded[screenBuffer[i]]);
//Затем мы отправляем байт её позиции
shiftOut(Data, Clock, MSBFIRST, Start >> i);
//Затем нужно "защелкнуть данные", установить пин Latch
//в высокий уровень, если этого не сделать то на дисплее будет
//видна непонятная "каша" из разных зажженых сегментов
digitalWrite(Latch, HIGH);
}
}

В оригинальном посте был массив позиций числа, что не работало на моей ардуинах вообще, а я пробовал аж 3, так что здесь я рассчитываю логически позицию. В строке 15 я нахожу самую левую цифру, т.е. цифр 4, значит там будет число 0b1000, 8 —> 0b1000 0000

И затем смещаю на позицию правее, при помощи побитовых сдвигов, получается, 0b0100, что процессор может выполнить быстрее обращения к массиву.

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

Также можно по терминалу отправлять на экран цифры. и некоторые буквы, надеюсь вы сможете это реализовать это сами!


Улучшенная версия с поддержкой 8 цифр