матеріали взято з ресурсу http://cxem.net
Здвиговий регістр - це набір послідовно з'єднаних тригерів (зазвичай їх 8 штук). На відміну від стандартних регістрів, здвигові підтримують функцію здвигу вправо і вліво. (тобто переписування даних з кожного попереднього тригера на наступний за рахунком).
Функціонал і призначення у здвигових регістрів досить великий. Одне з них відмінний спосіб множити виходи у Arduino: займаємо 3, отримуємо 8.
Напевно найпопулярніша мікросхема, що представляє собою такий регістр - це 74HC595.
Працює на інтерфейсі SPI: ноги DS, ST_CP, SH_CP - це шини керування. Відповідно: шина даних (MOSI), засувка (SS) і тактова лінія (SCK). Підключаємо на будь-які 3 контакти Arduino (бібліотека SPI в коді не буде задіяно).
Контакти Q0, Q1, ..., Q7 - це виходи регістра (розряди). Для того, щоб стежити за станом кожного з них, під'єднаємо на кожен контакт по світлодіоду (з послідовно з'єднаним резистором. Номінал від 150 до 330 Ом)
VCC і GND - це живлення. Підключаємо до + 5v і GND.
вихід Q7 не чіпаємо (призначений для послідовного з'єднання таких регістрів)
MR - це скидання. Підключаємо до + 5v (скидання не активне).
OE приєднуємо до землі (підключаємо до контакту GND).
Обладнання:
74HC595;
світлодіоди;
резистори 220 Ом;
bredboard;
Arduino uno;
конектори
Схема з'єднання:
Скетч Arduino:
// Пін підключений до SH_CP входу 74HC595
int clockPin = 13;
// Пін підключений до ST_CP входу 74HC595
int latchPin = 10;
// Пін підключений до DS входу 74HC595
int dataPin = 12;
void setup () {
// встановлюємо режим OUTPUT
pinMode (latchPin, OUTPUT);
pinMode (clockPin, OUTPUT);
pinMode (dataPin, OUTPUT);
}
void loop () {
// запалюємо по одному світлодіоди по порядку
for (int numberPin = 0; numberPin <8; numberPin ++) {
setShiftPin (numberPin);
delay (500);
}
// запалюємо всі світлодіоди
digitalWrite (latchPin, LOW);
shiftOut (dataPin, clockPin, MSBFIRST, 255);
digitalWrite (latchPin, HIGH);
delay (1000);
// запалюємо світлодіоди через один
digitalWrite (latchPin, LOW);
shiftOut (dataPin, clockPin, MSBFIRST, B10101010);
digitalWrite (latchPin, HIGH);
delay (1000);
// вимикаємо все світлодіоди
digitalWrite (latchPin, LOW);
shiftOut (dataPin, clockPin, MSBFIRST, 0);
digitalWrite (latchPin, HIGH);
delay (1000);
}
void setShiftPin (int numPin) {
int arrayPins [] = {1, 2, 4, 8, 16, 32, 64, 128};
digitalWrite (latchPin, LOW);
shiftOut (dataPin, clockPin, MSBFIRST, arrayPins [numPin]);
digitalWrite (latchPin, HIGH);
}