пятница, 1 августа 2025 г.

Дисплей на четырёх последовательно соединённых индикаторах с 74HC595 с AliExpress

      В этой статье рассмотрим принцип работы модуля на четырёх последовательно соединённых индикаторах с 74HC595, как его подключить и как выводить произвольные числа или текст с помощью Arduino или микроконтроллера Attiny13.



Что такое 74HC595?

74HC595 — это 8-битный сдвиговый регистр с защёлкой (фиксатором), который позволяет управлять 8 выходами (Q0–Q7), используя всего 3 линии от микроконтроллера: DATA (DS), CLOCK (SHCP) и LATCH (STCP).


⚙️ Назначение выводов:

Вывод Название Назначение
DS Data Serial Input Вход последовательных данных
SHCP Shift Clock (SCK) Тактовый импульс для сдвига
STCP Storage Clock (Latch) Импульс защёлки (фиксирует данные на выходах)
Q0–Q7 Параллельные выходы Управляют светодиодами, дисплеем и т. п.
Q7′ Последовательный выход Для подключения следующего 74HC595

Принцип работы:

  1. Передача битов в регистр:

    • Когда STCP = 0 (LOW), начинаем сдвиг.

    • Каждый импульс на SHCP (вверх) считывает один бит из DS и сдвигает его в регистр.

    • Данные сдвигаются вправо (к старшим битам).

  2. Фиксация данных:

    • После передачи 8 бит подаётся импульс на STCP (вверх) — и все биты из регистра одновременно передаются на выходы Q0–Q7


Как устроен модуль

Типичный модуль выглядит так:
4 семисегментных индикатора, в которых 4 микросхемы 74HC595 соединены цепочкой (вывод Q7′ одной — к DS следующей).



Схематически это выглядит так:


Для управления дисплеем используется контактная колодка с 5 выводами:

Контакт Назначение
VCC Питание (обычно +5В)
GND Земля
DS Данные
SHCP Тактовая частота (Shift Clock)
STCP Защёлка (Latch Clock)

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



📦 Как ищут на AliExpress:
“4 Bit 7 Segment LED Display Module With 74HC595”, “Digital Tube Display Board 4-Digit x 74HC595” и т. п.


Пример кода для Arduino без использования сторонних библиотек

Подключение:

Дисплей Arduino
VCC 5V
SDI 8
LOAD 11
SCLK 12
GND GND
const int dataPin  = 8;   // DS
const int latchPin = 11;  // STCP
const int clockPin = 12;  // SHCP

// Таблиця сегментів для цифр 0–9 (загальний катод)
const byte digits[10] = {
  0b00111111, // 0
  0b00000110, // 1
  0b01011011, // 2
  0b01001111, // 3
  0b01100110, // 4
  0b01101101, // 5
  0b01111101, // 6
  0b00000111, // 7
  0b01111111, // 8
  0b01101111  // 9
};

// Масив для відображення 4 цифр
byte displayBuffer[4] = {0, 0, 0, 0};

void setup() {
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(latchPin, OUTPUT);
}

void loop() {
  // Проганяємо лічильник від 0 до 9999
  for (int num = 0; num <= 9999; num++) {
    setNumberToDisplay(num);
    updateDisplay();
    delay(500);
  }
}

// Розкладаємо число на цифри та заповнюємо буфер
void setNumberToDisplay(int number) {
  for (int i = 0; i < 4; i++) {
    int digit = number % 10;
    displayBuffer[3-i] = ~digits[digit];
    number /= 10;
  }
}

// Виводимо 4 байти через shiftOut
void updateDisplay() {
  digitalWrite(latchPin, LOW);
  // Починаємо з останнього розряду (ліворуч) — останнім переданим байтом
  for (int i = 3; i >= 0; i--) {
    shiftOut(dataPin, clockPin, MSBFIRST, displayBuffer[i]);
  }
  digitalWrite(latchPin, HIGH);
}



Пример кода на Си для Attiny13 и среды Microchip Studio без сторонних библиотек

Подключение:

Дисплей Attiny13
VCC VCC
SDI PB0
LOAD PB2
SCLK PB1
GND GND


/*
 * attiny13_HC595_4-digit_counter.c
 *
 * Created: 03.06.2025 8:40:31
 * Author : Vyaceslav
 */ 

#define F_CPU 9600000UL
#include <avr/io.h>
#include <util/delay.h>

// Піни підключення
#define DATA_PIN   PB0
#define CLOCK_PIN  PB1
#define LATCH_PIN  PB2

// Маска сегментів для цифр 0–9 
const uint8_t digits[10] = {
	0b00111111, // 0
	0b00000110, // 1
	0b01011011, // 2
	0b01001111, // 3
	0b01100110, // 4
	0b01101101, // 5
	0b01111101, // 6
	0b00000111, // 7
	0b01111111, // 8
	0b01101111  // 9
};

uint8_t displayBuffer[4] = {0, 0, 0, 0};

// Встановлення стану виводу
void setPin(uint8_t pin, uint8_t value) {
	if (value)
	PORTB |= (1 << pin);
	else
	PORTB &= ~(1 << pin);
}

// Передача одного байта через shiftOut (MSB first)
void shiftOut(uint8_t data) {
	for (int8_t i = 7; i >= 0; i--) {
		setPin(DATA_PIN, (data >> i) & 0x01);
		setPin(CLOCK_PIN, 1);
		setPin(CLOCK_PIN, 0);
	}
}

// Оновлення дисплею — передача 4 байтів
void updateDisplay() {
	setPin(LATCH_PIN, 0);
	for (int8_t i = 3; i >= 0; i--) {
		shiftOut(displayBuffer[i]);
	}
	setPin(LATCH_PIN, 1);
}

// Розкласти число на 4 цифри
void setNumberToDisplay(uint16_t number) {
	for (uint8_t i = 0; i < 4; i++) {
		displayBuffer[3-i] = ~digits[number % 10];
		number /= 10;
	}
}

int main(void) {
	// Встановлюємо напрямок пінів — як виходи
	DDRB |= (1 << DATA_PIN) | (1 << CLOCK_PIN) | (1 << LATCH_PIN);

	uint16_t counter = 0;

	while (1) {
		setNumberToDisplay(counter);
		updateDisplay();

		counter++;
		if (counter > 9999) counter = 0;

		_delay_ms(500);
	}
}




Если индикаторы имеют общий катод — замените:
displayBuffer[3-i] = ~digits[number % 10]; 
на
displayBuffer[i] = digits[number % 10];




Если у вас младший разряд отображается слева, и нужно поменять на правый — замените в программе:
displayBuffer[3-i] = ~digits[number % 10];
на
displayBuffer[i] = digits[number % 10];

Комментариев нет:

Отправить комментарий