Что такое 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 |
Принцип работы:
-
Передача битов в регистр:
-
Когда STCP = 0 (LOW), начинаем сдвиг.
-
Каждый импульс на SHCP (вверх) считывает один бит из DS и сдвигает его в регистр.
-
Данные сдвигаются вправо (к старшим битам).
-
-
Фиксация данных:
-
После передачи 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 без использования сторонних библиотек
Подключение:
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];
Комментариев нет:
Отправить комментарий