Проект 8: Мікросхема зсувного регістру 74НС595. Управляємо матрицею з 4 розрядів, економимо виходи Arduino
В цьому експерименті ми розглянемо роботу Arduino з мікросхемою 74HC595 - розширником виходів, що дозволяє зменшити кількість виводів Arduino для управління 4-розрядною семисегментною матрицею.
Необхідні компоненти:
- контролер Arduino UNO R3;
- плата для прототипування;
- 4-розрядна семисегментного матриця;
- мікросхема 74HC595;
- резистор 510 Ом - 7 штук;
- дроти тато-тато.

Цифрових виводів Arduino Nano і UNO, а іноді навіть і Arduino Mega може не вистачити, якщо потрібно керувати великою кількістю виводів. В цьому випадку можна використовувати мікросхему 74HC595. Мікросхема 74HC595 - восьмирозрядний зсувний регістр з послідовним введенням, послідовним або паралельним виведенням інформації, з тригером-клямкою і трьома станами на виході. Призначення контактів мікросхеми 74HC595 показано на рис. 8.1.Для управління нам цілком достатньо всього лише трьох виводів: SH_CP, ST_CP і DS. Коли на тактовому вході SH_CP з'являється логічна одиниця, регістр зчитує біт зі входу даних DS і записує його в наймолодший розряд. При надходженні на тактовий вхід наступного імпульсу все повторюється, тільки біт, записаний раніше, зсувається на один розряд, а його місце займає знову прийшовший біт. Коли всі вісім бітів заповнилися, і приходить дев'ятий тактовий імпульс, регістр знову починає заповнюватися з молодшого розряду, і все повторюється знову. Щоб дані з'явилися на виходах Q0 ... Q7, потрібно їх «замкнути». Для цього необхідно подати логічну одиницю на вхід ST_CP. Щоб ми не робили з регістром, дані на виходах не зміняться, поки ми знов не «замкнемо» іх. Вивід Q7 призначений для послідовного (каскадного) з'єднання зсувних регістрів. При такому підключенні біти з першого регістра будуть прориватися в наступний в каскаді регістр, з нього - в наступний і т. д. Таким чином, каскад з двох 8-бітних регістрів буде працювати як один 16-бітний. Можна з'єднати скільки завгодно мікросхем. В наступному експерименті зі світлодіодною матрицею ми розглянемо каскадне підключення мікросхем 74HC595, в даному експерименті ми використовуємо тільки одну мікросхему - вісім виводів мікросхеми 74HC595 підключені до восьми сегментів матриці, чотири виводу матриці для вибору розряду підключені до чотирьох виводів плати Arduino. Схема підключення представлена на рис. 8.2.

Рис. 8.2. Схема підключення 4-розрядного семисегментного індикатор з використанням зсувних регістрів 74HC595
Приступаємо до написання скетчу запуску і зупинки секундоміра 0-999 сек з точністю 0.1 сек. Використовуємо бібліотеку Arduino SPI. Оскільки при використанні бібліотеки SPI застосовуються Arduino виводи 11 і 13, для вибору регістрів матриці використовуємо виводи Arduino 4, 5, 6, 7. Вміст скетчу показано в лістингу 8.1.
// Підключення бібліотеки SPI
#include <SPI.h>
// пін SS
int pin_spi_ss = 8;
// значення для виведення цифр 0-9
byte numbers [10] = {B11111100, B01100000, B11011010,
B11110010, B01100110, B10110110, B10111110, B11100000, B11111110, B11110110};
// змінна для зберігання значення поточної цифри
int number = 0;
int number1 = 0;
int number2 = 0;
// семисегментний індикатор
int pindigits [4] = {4,5,6,7};
// змінна для зберігання поточного розряду
int digit = 0;
//
unsigned long millis1 = 0;
void setup ()
{
SPI.begin ();
// Конфігурувати контакти як виходи
pinMode (pin_spi_ss, OUTPUT);
for (int i = 0; i <4; i ++)
{PinMode (pindigits [i], OUTPUT);
digitalWrite (pindigits [i], HIGH);
}
}
void loop ()
{
if (millis () - millis1> = 100)
{Millis1 = millis1 + 100;
number = number + 1;
if (number == 10000)
number = 0;
}
number1 = number;
for (int i = 0; i <4; i ++)
{
number2 = number1% 10;
number1 = number1 / 10;
showNumber (number2, i);
for (int j = 0; j <4; j ++)
digitalWrite (pindigits [j], HIGH);
digitalWrite (pindigits [i], LOW);
delay (1);
}
}
// функція виведення цифри на семисегментний індикатор
void showNumber (int num, int dig)
{
byte maska;
digitalWrite (pin_spi_ss, LOW);
if (dig == 1) maska = 1;
else maska = 0;
SPI.transfer (numbers [num] + maska);
digitalWrite (pin_spi_ss, HIGH);
}
}
Порядок підключення:
- Підключаємо семисегментний індикатор за схемою на рис. 8.2.
- Завантажуємо в плату Arduino скетч з лістингу 8.1.
- Натисканням кнопки запускаємо або зупиняємо секундомір.