Иногда в своих проектах на Ардуино нам не хватает свободных линий ввода/вывода. Примером этому может служить управление большим количеством светодиодов, подключение многоразрядного 7-сегментного светодиодного дисплея, LCD дисплея 16х2 и так далее.
Для решения этой проблемы мы можем использовать микросхему сдвиговый регистр 74HC595. Используя всего 3 вывода микроконтроллера, мы можем управлять 8 светодиодами, что позволяет сэкономить 5 выводов, которые можно использовать длz других целей.
Мы можете использовать 74HC595 для управления 8 выходами одновременно, используя только несколько контактов вашего микроконтроллера. Также есть возможность связать несколько подобных регистров вместе, тем самым увеличив управляемые выводы.
74HC595 имеет 8-битный регистр хранения и 8-битный регистр сдвига. Данные последовательно записываются в регистр сдвига, а затем фиксируются в регистре хранения. Регистр хранения затем управляет 8 выходными линиями.
Распиновка 74HC595
Ниже представлена распиновка 74HC595
- Выводы 1-7, 15 (Q0…Q7) — выходные контакты
- Вывод 8 (GND) — земля
- Вывод 9 (Q7 ″) — последовательный выход
- Вывод 10 (MR) Master Reclear, активный — LOW
- Вывод 11 (SH_CP) вывод регистра сдвига
- Вывод 12 (ST_CP) вывод регистра памяти (вывод защелки)
- Вывод 13 (OE) разрешение выхода, активный — LOW Вывод 14 (DS) последовательный ввод данных
- Вывод 16 (Vcc) напряжение питания, обычно 5 В
Схема подключения 74HC595 к Ардуино
Это схема является примером того, как можно управлять регистром сдвига 74HC595 при помощью Ардуино. В этом примере мы будем управлять группой состоящей из 8 светодиодов.
- DS (контакт 14) — Ардуино DigitalPin 4
- SH_CP (контакт 11) — Ардуино DigitalPin 6
- ST_CP (контакт 12) — Ардуино DigitalPin 5
Скетч
В этом примере мы просто отобразим случайное значение на светодиодах, и заодно рассмотрим, как сгенерировать случайное число.
int latchPin = 5; int clockPin = 6; int dataPin = 4; long randNumber; void setup() { // устанавливаем контакты для вывода, чтобы мы могли управлять регистром сдвига pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); randomSeed(analogRead(0)); } void loop() { // получаем случайное число между 1 и 255 randNumber = random(1, 255); // низкий уровень latchPin, поэтому // светодиоды не меняются, пока мы отправляем биты: digitalWrite(latchPin, LOW); // сдвигаем биты: shiftOut(dataPin, clockPin, MSBFIRST, randNumber); // подаем на latchPin высокий уровень, чтобы светодиоды загорелись: digitalWrite(latchPin, HIGH); // пауза перед следующим значением: delay(500); }