# Проект 19: Чип 74HC595 ![](../media/5960e5b0003f4e3f635dbaac910b895b.png) #### Описание 74HC595 — это распространённый IO-чип, который управляет несколькими выходами с помощью небольшого количества управляющих пинов, что делает его идеальным для сценариев, где нужно управлять множеством светодиодов или других выходных устройств. В этом проекте мы управляем включением и выключением 7 светодиодов через чип 74HC595, чтобы добиться эффекта бегущих огней. #### Аппаратное обеспечение 1\. Плата разработки UNO R3 (ch340) x1 2\. Чип 74HC595 x1 3\. Светодиод x7 4\. Резистор 220 Ом x7 5\. Макетная плата x1 6\. Соединительные провода #### Принцип работы 74HC595 имеет два 8-битных регистра (которые можно считать «контейнерами памяти»). Первый называется сдвиговым регистром, а второй — регистром хранения/захвата. Каждый раз, когда 74HC595 получает тактовый импульс, происходят две вещи: Биты, содержащиеся в сдвиговом регистре, сдвигаются влево на одну позицию. Значение бита 0 перемещается в бит 1, значение бита 1 — в бит 2 и так далее. Бит 0 в сдвиговом регистре принимает текущее значение на пине DATA. На фронте тактового импульса, если пин DATA высокий, в сдвиговый регистр записывается 1, иначе 0. Этот процесс продолжается, пока 74HC595 получает тактовые импульсы. Когда пин захвата (latch) активируется, содержимое сдвигового регистра копируется в регистр хранения/захвата. Каждый бит регистра хранения связан с одним из выходных пинов IC QA-QH. В результате, при изменении значения в регистре хранения изменяется и выход. Анимация ниже поможет лучше понять это. ![/data/weboffice/tmp/webword_1554412927/upload_post_object_v2_980920564](../media/e1edfe0e123713ef3590003a647f9999.GIF) #### Технические характеристики 8-битный последовательный ввод 8-битный последовательный или параллельный вывод Регистр хранения с трёхсостоянием на выходах Сдвиговый регистр с прямой очисткой Частота сдвига до 100 МГц (типичная) #### Распиновка ![](../media/8cf953d67206bcd25ddb2abb9aab5ced.png) GND — это пин земли. VCC — питание для сдвигового регистра 74HC595, должен быть подключён к 5В. SER (Serial Input) — последовательный вход, используется для передачи данных в сдвиговый регистр по одному биту. SRCLK (Shift Register Clock) — тактовый вход для сдвигового регистра, срабатывает по фронту сигнала. Это означает, что биты записываются при нарастающем фронте тактового сигнала. RCLK (Register Clock / Latch) — очень важный пин. Когда он подтянут к HIGH, содержимое сдвигового регистра копируется в регистр хранения/захвата, который затем появляется на выходах. Таким образом, пин захвата можно рассматривать как последний шаг перед отображением результата на выходах. SRCLR (Shift Register Clear) — пин сброса сдвигового регистра, который устанавливает все биты в ноль. Поскольку это активный LOW пин, для сброса его нужно подтянуть к LOW. OE (Output Enable) — также активный LOW пин: при подтягивании к HIGH выходы отключаются (становятся в состояние высокого импеданса). При подтягивании к LOW выходы работают нормально. QA–QH — выходные пины. QH’ — выводит бит 7 сдвигового регистра. Это позволяет объединять несколько 74HC595 последовательно. Если подключить этот пин к пину SER другого 74HC595 и подать на оба одинаковый тактовый сигнал, они будут работать как один чип с 16 выходами. С помощью этой техники можно объединять сколько угодно чипов. #### Схема подключения 1\. Подключите пин VCC чипа 74HC595 к 5В на плате, а пин GND к земле на плате. 2\. Подключите DS (пин 14) чипа 74HC595 к D11 на плате, SHCP (пин 11) к D12, а STCP (пин 12) к D13. 3\. Подключите Q0-Q7 (пины 15, 1-6) чипа 74HC595 к анодам 7 светодиодов через резисторы 220 Ом, катоды светодиодов подключите к земле. ![Img](../media/img-20260401195549.png) #### Пример кода ```cpp /* Electronics Learning Starter Kit for Arduino Project 19 74HC595 Chip Edit By Keyes */ const int DS = 11; // serial data input const int SHCP = 12; // Shift register clock input const int STCP = 13; // Latch clock input void setup() { pinMode(DS, OUTPUT); pinMode(SHCP, OUTPUT); pinMode(STCP, OUTPUT); } void loop() { for (int i = 0; i < 7; i++) { digitalWrite(STCP, LOW); shiftOut(DS, SHCP, MSBFIRST, 1 << i); // Move data into the shift register by serial digitalWrite(STCP, HIGH); // Output shift register data to the latch in parallel delay(200); } } ``` #### Объяснение кода Сначала в коде определяются три переменные пинов: DS, SHCP и STCP, которые используются для последовательного ввода данных, тактового сигнала сдвигового регистра и тактового сигнала регистра захвата соответственно. Эти пины сопоставлены с конкретными пинами на плате Arduino через цифровые определения. ```cpp const int DS = 11; // Serial data input const int SHCP = 12; // Shift register clock input const int STCP = 13; // Latch register clock input ``` Далее, в функции `setup()` все три пина устанавливаются в режим вывода, так как они будут использоваться для отправки сигналов в сдвиговый регистр. ```cpp void setup() { pinMode(DS, OUTPUT); pinMode(SHCP, OUTPUT); pinMode(STCP, OUTPUT); } ``` Основная логика цикла В функции `loop()` код управляет последовательным включением светодиодов через цикл. Цикл выполняется семь раз, и каждый проход управляет состоянием одного светодиода через сдвиговый и захватный регистры. ```cpp void loop() { for (int i = 0; i < 7; i++) { digitalWrite(STCP, LOW); shiftOut(DS, SHCP, MSBFIRST, 1 << i); digitalWrite(STCP, HIGH); delay(200); } } ``` **Установка STCP в низкий уровень**: Перед отправкой данных пин STCP устанавливается в низкий уровень, чтобы подготовить сдвиговый регистр к приёму данных. ```cpp digitalWrite(STCP, LOW); ``` **Сдвиг данных**: Функция `shiftOut()` используется для передачи данных бит за битом с пина DS в сдвиговый регистр. Параметр `MSBFIRST` указывает, что данные отправляются начиная с самого старшего бита. Операция `1 << i` — это побитовый сдвиг, который задаёт только один бит в высокий уровень (1), остальные биты — в низкий (0). Эта операция эффективно управляет тем, какой светодиод загорается. ```cpp shiftOut(DS, SHCP, MSBFIRST, 1 << i); ``` **Установка STCP в высокий уровень**: После отправки данных пин STCP устанавливается в высокий уровень. Это действие вызывает копирование содержимого сдвигового регистра в регистр захвата, обновляя состояние светодиодов. ```cpp digitalWrite(STCP, HIGH); ``` **Задержка**: Вызов функции `delay(200)` удерживает каждый включённый светодиод включённым в течение 200 миллисекунд, позволяя пользователю чётко видеть последовательность включения светодиодов. #### Результат проекта После загрузки кода 7 светодиодов будут загораться последовательно, создавая эффект бегущей воды. С помощью чипа 74HC595 мы управляем 7 выходами всего через три пина Arduino, что значительно экономит пины. ![P19](../media/P19.gif)