Найти тему
GameDevCentre

Управление сдвиговым регистром с Arduino

Эта моя статья есть на Хабре, но пока она там не опубликована. Как только она пройдёт модерацию, здесь появится на неё ссылка.


Я использовал микросхему 74HC595, но
другие на неё похожи, так что вы можете продолжать читать. Для начала приведу распиновку.

https://cxem.net/arduino/arduino166.php, модифицировано
https://cxem.net/arduino/arduino166.php, модифицировано

Q1...Q7 — параллельные выходы регистра. Предназначены для подключения управляемых элементов, например, светодиодов.
GND — земля ("минус").
VCC — питание ("плюс"). Сюда подаются 5 В.
DS — вход данных. На этот вход передаются восемь последовательных бит данных для установки значений на параллельных выходах.
OE — вход для вывода последовательных данных на параллельные выходы. Черта сверху означает, что активный уровень для этого входа низкий. Если на него подаётся напряжение низкого уровня, параллельные выходы будут включены, а при подаче напряжения высокого уровня — выключены.
ST_CP — синхронизация выходов.
SH_CP — вход тактовых импульсов. При подаче на него импульса высокого напряжения в сдвиговый регистр считывается один бит данных со входа DS. Для считывания всех восьми бит данных необходимо подать на этот вход восемь импульсов.
MR — сброс значений регистра при подаче на него напряжения низкого уровня.
Q7` — выход, предназначенный для соединения регистров друг с другом (это называется "делать каскады").

Теперь попробуем подключить эту штуку к Arduino. Вот схема.

Извиняюсь за надписи "Часть1". Я не знаю, как их убрать.
Извиняюсь за надписи "Часть1". Я не знаю, как их убрать.

К выводам Q1...Q7 подключите управляемые элементы, например, светодиоды.

Осталось написать код. Я уже дал распиновку, схему подключения и объяснил, какой вывод за что отвечает. Теперь вы можете написать код сами. Но если не можете (или вам лень), то вам понадобится готовый код, который я привожу ниже. Тут на управляемые элементы последовательно, с интервалом в 1 секунду, подаётся высокое напряжение, после чего они все выключаются и всё начинается сначала.

#define data 2 //Вывод данных
#define clock 3 //Тактовый вывод
#define latch 4 //Вывод синхронизации

byte elementsStates[8] = {0b10000000, 0b11000000, 0b11100000,
0b11110000, 0b11111000, 0b11111100, 0b11111110, 0b11111111,
0b00000000}; //Данные для подачи на вход данных

void setup() {
//Назначение выводов выходами
pinMode(data, OUTPUT);
pinMode(clock, OUTPUT);
pinMode(latch, OUTPUT);
}

void loop() {
//Цикл, ежесекундно отправляющий в регистр новые данные
for (int i = 0; i < 8; i++) {
digitalWrite(latch, LOW); //Закрыть вывод данных на параллельные выходы
shiftOut(data, clock, MSBFIRST, elementsStates[i]) //Отправить данные в регистр
digitalWrite(latch, HIGH); //Вывести данные на параллельные выходы
delay(1000); //Задержка на секунду
}
}

Ну вот и всё. Только не забудьте загрузить код в Arduino.

Хорошего дня!