Зсувний регістр 74HC595: 8 світлодіодів від трьох виводів
Бракує виводів? Мікросхема за кілька гривень перетворює три GPIO на вісім виходів, а два чипи в ланцюжку — на шістнадцять. Розбираємося, як працюють shiftOut(), SHCP і STCP, навіщо MR і OE і чому вісім світлодіодів по 20 мА спалять регістр.
Про проєкт
74HC595 — «послідовно-паралельний» регістр: мікроконтролер передає байт по одному біту, а чип виставляє всі вісім бітів одночасно на виводи Q0–Q7. Так керують світлодіодними шкалами, семисегментними індикаторами і реле, коли вільних GPIO мало — особливо на Arduino Uno чи ESP32-C3.
Що потрібно
- ESP32 DevKit (або Arduino)
- Мікросхема 74HC595 (DIP-16)
- Світлодіодна шкала на 10 сегментів або 8 світлодіодів
- 8 резисторів 330–470 Ом
- Макетна плата
Виводи
Ключ (виїмка) на корпусі — зліва. Нижній ряд, виводи 1–8: Q1–Q7, GND. Верхній ряд справа наліво, 9–16: Q7', MR, SHCP, STCP, OE, DS, Q0, VCC.
| 74HC595 | Призначення | ESP32 |
|---|---|---|
| VCC (16) | живлення 2–6 В | 3V3 |
| GND (8) | земля | GND |
| DS (14) | дані | GPIO23 |
| SHCP (11) | тактування зсуву | GPIO18 |
| STCP (12) | «засувка» (latch) | GPIO5 |
| MR (10) | скидання, активний LOW | 3V3 |
| OE (13) | дозвіл виходів, активний LOW | GND |
| Q0–Q7 | виходи | через резистори на світлодіоди |
Як це працює
Усередині два 8-бітні регістри:
- Зсувний. На кожен фронт SHCP (LOW→HIGH) біти зсуваються на одну позицію, а в перший записується рівень DS.
- Вихідний (засувка). На фронт STCP увесь зсувний регістр копіюється на виходи Q0–Q7 одночасно.
Тому поки ви «проштовхуєте» 8 бітів, світлодіоди не блимають проміжними станами — все змінюється в момент імпульсу на STCP. Функція shiftOut(data, clock, MSBFIRST, value) робить 8 циклів «виставити DS → імпульс SHCP».
MR і OE не можна залишати в повітрі: «плаваючий» MR випадково скидає регістр, а OE вимикає виходи. Симулятор попередить про обидва. Замість GND на OE можна подати ШІМ — тоді яскравість усіх світлодіодів регулюється одним виводом (пам'ятайте, що OE інвертований).
Струм — головна пастка
Вихід 74HC595 — не GPIO потужного драйвера: до 35 мА на вивід і лише 70 мА на весь чип через VCC і GND. Вісім світлодіодів по 20 мА — це 160 мА, і регістр перегрівається. Беріть резистори 330–470 Ом (3–8 мА на світлодіод цілком достатньо для індикації), а для потужного навантаження — ULN2803 або TPIC6B595.
Код
// 8 світлодіодів від трьох виводів: зсувний регістр 74HC595
const int DATA_PIN = 23; // DS (14)
const int CLOCK_PIN = 18; // SHCP (11)
const int LATCH_PIN = 5; // STCP (12)
void writeLeds(byte pattern) {
digitalWrite(LATCH_PIN, LOW);
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, pattern);
digitalWrite(LATCH_PIN, HIGH); // виходи змінюються тут, усі разом
}
void setup() {
pinMode(DATA_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
pinMode(LATCH_PIN, OUTPUT);
}
void loop() {
// вогник біжить туди й назад
for (int i = 0; i < 8; i++) { writeLeds(1 << i); delay(80); }
for (int i = 6; i > 0; i--) { writeLeds(1 << i); delay(80); }
}
Ланцюжок регістрів
Вихід Q7' (вивід 9) — це біт, що «випадає» зі зсувного регістра. З'єднайте його з DS другого 74HC595, а SHCP і STCP обох чипів — разом. Тепер два виклики shiftOut() підряд передають 16 бітів: перший байт «проходить» у другий чип, другий залишається в першому. Так само можна зібрати ланцюжок із 3, 4 і більше регістрів — виводів мікроконтролера однаково три.
Ідеї
- Двійковий лічильник:
writeLeds(counter++)— наочний спосіб показати, як число виглядає в бітах. - Шкала рівня:
writeLeds((1 << n) - 1)запалює n сегментів — наприклад, для рівня з потенціометра. - Швидше за shiftOut(): на ESP32 можна під'єднати DS до MOSI, а SHCP — до SCK і передавати байт через
SPI.transfer().