Сдвиговый регистр - это набор последовательно соединённых триггеров (обычно их 8 штук). В отличии от стандартных регистров, сдвиговые поддерживают функцию сдвига вправо и влево. (т. е. переписывание данных с каждого предыдущего триггера на следующий по счёту).
Функционал и назначение у сдвиговых регистров довольно велик. Сегодня мы познакомим одного из них с Arduino (Отличный способ множить выходы у Arduino: занимаем 3, получаем 8).
Наверное самая популярная микросхема, представляющая собой такой регистр - это 74HC595.
- Работает на интерфейсе SPI: ноги DS, ST_CP, SH_CP - это шины управления. Соответственно: шина данных(MOSI), защёлка(SS) и тактовая линия(SCK). Подключаем на любые 3 контакта Arduino (библиотека SPI в коде не будет задействована). У меня это 12, 10, 13 выходы Arduino (стандарт).
- Ноги Q0, Q1, ..., Q7 - это выходы регистра (разряды). Для того, чтобы следить за состоянием каждого из них, повесим на каждый вывод по светодиоду (с последовательно соединённым резистором. Номинал от 150 до 330 Ом)
- VCC и GND - это питание. Подключаем к +5v и GND.
- выход Q7` не трогаем (предназначен для последовательного соединения таких регистров)
- MR - это сброс. Подключаем к +5v (сброс не активен).
- ну и OE притягиваем к земле (подключаем к контакту GND).
Получается вот, такая схема:
На макетной плате можно разместить вот, так:
Теперь к коду:
- как говорилось ранее, библиотека SPI использоваться не будет. Есть удобная функция shiftOut().
для начала именуем наши пины (тактовая линия - clock, данные - data, защёлка - latch):
#define clock 13
#define data 12
#define latch 10
потом в void setup() обозначаем их как выходы и сразу ставим защёлке высокий уровень, чтобы регистр не принимал сигналов:
void setup(){
pinMode(clock, OUTPUT);
pinMode(data, OUTPUT);
pinMode(latch, OUTPUT);
digitalWrite(latch, HIGH);
}
теперь давайте попробуем что-нибудь отправить на регистр:
- для начала ставим LOW на защёлку (начинаем передачу данных. Теперь регистр принимает сигналы с Arduino).
digitalWrite(latch, LOW);
- потом отправляем данные (т. е. отправляем байт в цифровом или двоичном виде. В двоичном проще, т. к. каждый из 8 битов отвечает за свой разряд в регистре. Проще сориентироваться глазами):
Для начала отправим байт 0b10000000; (должен будет загореться первый светодиод):
shiftOut(data, clock, LSBFIRST,0b10000000);
- и в конце выставляем HIGH на защёлку (заканчиваем передавать данные).
digitalWrite(latch, HIGH);
В итоге весь наш код:
#define clock 13
#define data 12
#define latch 10
void setup() {
pinMode(clock, OUTPUT);
pinMode(data, OUTPUT);
pinMode(latch, OUTPUT);
digitalWrite(latch, HIGH);
}
void loop() {
digitalWrite(latch, LOW);
shiftOut(data, clock, LSBFIRST, 0b10000000);
digitalWrite(latch, HIGH);
}
Теперь вгружаем в ардуину. Результат должен быть таким (зажёгся первый светодиод):