Перейти к основному содержимому

Урок 4. Основы цифровой схемотехники

Введение

Цифровая схемотехника – один из основных разделов электроники, который лежит в основе работы современных микроконтроллеров, процессоров и других устройств обработки информации. Чтобы уверенно разрабатывать электронные устройства и понимать, как они работают, недостаточно уметь только программировать. Важно также разбираться в логических элементах и базовых цифровых узлах.

В этом уроке рассматриваются простейшие логические элементы (НЕ, И, ИЛИ и их комбинации) и триггеры, которые служат для запоминания двоичной информации. На основе триггеров строятся более сложные устройства, такие как сдвиговые регистры, позволяющие преобразовывать последовательный код в параллельный и тем самым эффективно использовать выводы микроконтроллера.

В конце рассматривается работа с микросхемой сдвигового регистра 74HC595, которую удобно применять как расширитель числа цифровых выводов. На практических примерах показывается, как, используя всего несколько линий связи с микроконтроллером, управлять сразу несколькими светодиодами и отображать двоичное представление чисел.

Логические элементы

Современная цифровая вычислительная техника состоит из следующих базовых логических элементов:

  1. НЕ – инвертирование;
  2. И – логическое умножение;
  3. ИЛИ – логическое суммирование.

Разберемся подробнее с каждым из них.

Логическая функция НЕ

Функция НЕ является простейшей логической функцией. Она изменяет значение входного сигнала на противоположный. Т.е. если на её вход подать 1, то на выходе будет 0. А если подать 0, то на выходе получим 1. Математически это записывается как:

F(x)=xˉ,F(x) = \=x,

где черта над выходным значением обозначает инверсию (изменение на противоположное).

Часто поведение логических схем записывают с помощью таблицы истинности. Таблица истинности – это совокупность всех возможных комбинаций логических сигналов на входе цифрового устройства и значений выходных сигналов для каждой комбинации. Для элемента НЕ таблица истинности выглядит следующим образом:

ВходВыход
10
01

Вы конечно же слышали, что фирмы-разработчики процессоров часто рассказывают о том, какое число транзисторов задействовано в их модели процессора. Хоть процессоры (как и другие логические схемы) и состоят из простейших логических элементов, каждый из этих логических элементов состоит из транзисторов. Давайте рассмотрим электрическую схему логического элемента НЕ. В самом базовом варианте он состоит из одного транзистора.

sch

Рис. 1. Электрическая схема логического элемента НЕ.

Если вход A потянуть к земле (или тоже самое что подать логический 0), то транзистор будет закрыт и через него не будет протекать ток. Следовательно, на выходе Q мы увидим напряжение Vdd (вспоминаем тему подтягивающие резисторы). Резистор, стоящий между Vdd и транзистором в данном случае выполняет роль подтягивающего резистора. Если на A подать питание, то транзистор откроется и выход Q окажется напрямую связан с GND и, следовательно, мы увидим на нём 0В.

Чтобы не загромождать логическую схему обилием транзисторов, резисторов и других пассивным электронных компонентов, существует специальное условно-графическое обозначение (УГО). Оно имеет два варианта. Оба показаны на рисунке ниже. Первый вариант принят в англоязычной литературе, а второй чаще всего используется в русскоязычной.

sch

Рис. 2. УГО логического элемента НЕ.

Логическая функция И

Следующая простейшая функция – это И. Математически она записывается так:

F(x1,x2)=x1x2,F(x_1,x_2) = x_1 ∧ x_2,

где символ обозначает функцию логического умножения. Вместо него иногда используют символ &\& или вовсе записывают как умножение, т.е.:

F(x1,x2)=x1&x2=x1x2.F(x_1,x_2) = x_1 \& x_2 = x_1 x_2.

Часто логическое умножение называют конъюнкцией. Таблица истинности для этого действия представлена ниже. Она имеет четыре строки (22=42^2=4).

Вход 1Вход 2Выход
000
010
100
111

В формуле конъюнкции присутствует два аргумента, поэтому таблица истинности имеет два входа. В общем случае входов может быть гораздо больше, поэтому соответствующий ей логический элемент называют «2И».

Рассмотрим электрическую схему элемента «2И». В этой схеме ток между VDD и GND будет протекать только тогда, когда оба транзистора открыты. Следовательно, единичный уровень напряжения на выходе схемы появится только при двух логических единицах на базах транзисторов.

sch

Рис. 3. Электрическая схема логического элемента И.

УГО элемента «2И» приведено на рисунке ниже. Снова, как и с предыдущим элементом, первый принят в англоязычной литературе, а второй – в русскоязычной.

sch

УГО логического элемента 2И.

Для закрепления материала постройте таблицу истинности элемента «3И». Она уже будет состоять из 8 строк (23=82^3=8).

Логическая функция ИЛИ

Следующая логическая функция – это ИЛИ. Еще её называют дизъюнкцией или логическим сложением. Она записывается как:

F(x1,x2)=x1x2=x1x2=x1+x2,F(x_1,x_2) = x_1 ∨ x_2 = x_1 | x_2 = x_1 + x_2,

где символы и | - обозначают логическое сложение.

То же самое действие можно представить в виде таблицы истинности. Аналогично с функцией «И» дизъюнкция может обладать разным количеством выходов. Мы рассмотрим таблицу истинности для элемента «2ИЛИ».

Вход 1Вход 2Выход
000
011
101
111

Электрическая схема элемента «2ИЛИ» аналогична предыдущей, но транзисторы уже соединены параллельно. Таким образом, логическая единица на выходе появится, как только будет открыт один из транзисторов.

sch

Рис. 4. Электрическая схема логического элемента 2ИЛИ.

УГО элемента точно так же имеет два варианта обозначения:

sch

Рис. 5. УГО логического элемента 2ИЛИ.

Комбинированные логические функции

Рассмотренные выше логические элементы часто комбинируются друг с другом. Самые популярные из них показаны в таблице ниже.

НазваниеСимвол ANSIСимвол ГОСТМатематическая запись
И-НЕQ=ABQ = \overline{A \land B}
ИЛИ-НЕQ=ABQ = \overline{A \lor B}
Исключающее ИЛИ (XOR)Q=ABQ = A \oplus B

С элементами И-НЕ и ИЛИ-НЕ вроде всё должно быть понятно – это просто те же элементы, к которым в конце добавили НЕ. Но вот исключающее ИЛИ давайте рассмотрим чуть подробнее. Логика работы исключающего ИЛИ такая: высокий логический уровень на выходе появляется только тогда, когда входы имеют разные значения. И наоборот, если значения на входах будет одинаковыми, то на выходе будет 0. Математически операция выглядит так:

Q=AB=AB+AB.Q = A \oplus B = A \overline{B} + \overline{A} B.

Как можно заметить из формулы, этот элемент состоит из всех изученных выше простейших логических элементов. На рис. 6 показана его схема.

sch

Рис. 6. Схема, реализующая логическую функцию «Исключающее ИЛИ».

Триггеры

Триггеры — это цифровые электронные устройства с двумя состояниями. Они предназначены для запоминания двоичной информации. Использование триггеров в цифровой электронике позволяет реализовывать устройства оперативной памяти (то есть памяти, информация в которой хранится только на время вычислений). Однако это не единственная их область применения. Триггеры широко используются для построения цифровых устройств с памятью, таких как цифровой счётчики, преобразователи последовательного кода в параллельный, последовательные порты или цифровые линии задержки, применяемые в составе цифровых фильтров.

RS-триггер

RS-триггер получил название по наименованию своих входов. Вход S (Set — установить англ.) позволяет устанавливать выход Q в единичное состояние (устанавливать означает записывать логическую единицу). Вход R (Reset — от англ. "сбросить") позволяет сбрасывать выход Q (Quit — от англ. "выход") в нулевое состояние. Для реализации RS-триггера можно использовать два логических элемента "2И-НЕ". Его принципиальная схема приведена на рисунке 7.

sch

Рис. 7. Принципиальная схема RS-триггера.

Рассмотрим принцип работы RS триггера. Пусть на входы RR и SS подаются единичные потенциалы. Если на выходе верхнего логического элемента "2И-НЕ" QQ присутствует логический ноль, то на выходе нижнего логического элемента "2И-НЕ" появится логическая единица. Эта единица подтвердит логический ноль на выходе QQ. Если на выходе верхнего логического элемента "2И-НЕ" QQ первоначально присутствует логическая единица, то на выходе нижнего логического элемента "2И-НЕ" появится логический ноль. Этот ноль подтвердит логическую единицу на выходе QQ. То есть при единичных входных уровнях схема RS-триггера работает точно так же как и схема на инверторах.

Подадим на вход SS триггера нулевой потенциал. Согласно таблице истинности логического элемента "2И-НЕ" на выходе Q\overline{Q} появится единичный потенциал. Это приведёт к появлению на выходе QQ нулевого потенциала. Теперь, даже если снять нулевой потенциал с входа S, на выходе триггера останется нулевой потенциал. То есть мы записали в триггер логический ноль.

Точно так же можно записать в триггер и логическую единицу. Для этого следует воспользоваться входом RR, и подать на него ноль, а на SS - подать единицу.

Составим таблицу истинности RS-триггера.

SRQtQ_tQt\overline{Q}_tРежим
00Qt1Q_{t-1}Qt1\overline{Q}_{t-1}Хранение
0101Сброс
1010Установка 1
1100Запрещен

Собрать RS-триггер можно и на элементах ИЛИ-НЕ. Единственным отличием в работе будет только то, что его входы будут инвертированы.

sch

Рис. 8. УГО RS-триггера.

Основной недостаток такого триггера – это его асинхронность. При наличии шумов в цепях или дребезга контактов, во время переходных процессов, на входах могут происходить непредсказуемые вещи. В сложных цифровых схемах лучше всего синхронизировать работу компонентов с помощью общих тактовых импульсов, которые вырабатываются тактовым генератором. Подразумевается, что все переходные процессы в логической схеме должны закончиться во время прихода синхросигнала.

RS-триггер может быть и синхронным, но двух логических элементов для этого мало. На рисунке изображена схема синхронного RS-триггера. В предлагаемой схеме переключение триггера из одного состояния в другое может быть осуществлено только в момент прихода синхроимпульса на вход CC.

sch

Рис. 9. Принципиальная схема синхронного RS-триггера.

Таблица истинности показана ниже:

SRCQtQ_tРежим
xx0Qt1Q_{t-1}Хранение
001Qt1Q_{t-1}Хранение
1011Установка 1
0110Установка 0
111xЗапрещен
sch

Рис. 10. УГО синхронного RS-триггера.

Статический D-триггер

В RS-триггерах для записи логического нуля и логической единицы требуются разные входы, что не всегда удобно. Как мы видели ранее, установка значений триггера производится путём переключения сигналов R и S на противоположные, а одинаковые значения сигналов R и S либо недопустимы, либо ничего не меняют. Поэтому можно объединить эти входы при помощи инвертора, как показано на рисунке ниже. В таком случае, это устройство будет называться D-триггером.

sch

Рис. 11. Схема D-триггера (синхронный RS-триггер с инвертором).

sch

Рис. 12. УГО D-триггера.

Таблица истинности D-триггера достаточно проста, она приведена ниже. Как видно из этой таблицы, D-триггер способен запоминать двоичный сигнал по синхросигналу и хранить один бит двоичной информации.

CDQtQ_tРежим
0xQt1Q_{t-1}Хранение
100Установка 0
111Установка 1

Нужно отметить, что отдельный инвертор при реализации триггера на ТТЛ элементах не нужен, так как самый распространённый логический элемент ТТЛ микросхем — это "2И-НЕ". Принципиальная схема D-триггера на элементах 2И-НЕ приведена на рисунке 13.

sch

Рис. 13. Принципиальная схема статического D-триггера.

Во всех рассмотренных триггерах синхросигнал работает по уровню, поэтому триггеры называются триггерами, работающими по уровню, или статическими триггерами. Ещё одно название таких триггеров, пришедшее из иностранной литературы — триггеры-защёлки. Легче всего объяснить происхождение этого названия по временной диаграмме сигналов, приведенной на рисунке 14.

sch

Рис. 14. Временная диаграмма работы статического D-триггера.

По этой временной диаграмме видно, что триггер-защелка хранит данные на выходе только при нулевом уровне на входе синхронизации CC. Если же на вход синхронизации подать активный высокий уровень, то напряжение на выходе триггера будет повторять напряжение, подаваемое на его вход.

Входное напряжение запоминается только в момент изменения уровня напряжения на входе синхронизации CC с высокого уровня на низкий уровень. Входные данные как бы "защелкиваются" в этот момент, отсюда и название — триггер-защелка.

Динамический D-триггер

Нужно отметить, что в схеме на рис. 14 входной переходной процесс может беспрепятственно проходить на выход триггера. Поэтому там, где это важно, необходимо сокращать длительность импульса синхронизации до минимума, что не всегда удобно. Чтобы преодолеть такое ограничение были разработаны триггеры, работающие по фронту.

Фронт сигнала синхронизации, в отличие от высокого (или низкого) потенциала, не может длиться продолжительное время. В идеале длительность фронта равна нулю. Поэтому в триггере, запоминающем входную информацию по фронту, не нужно предъявлять требования к длительности тактового сигнала.

Триггер, запоминающий входную информацию по фронту, может быть построен из двух триггеров, работающих по потенциалу. Сигнал синхронизации будем подавать на эти триггеры в противофазе. Схема такого триггера приведена на рисунке 15.

sch

Рис. 15. Схема динамического D-триггера.

Рассмотрим схему такого триггера подробнее с помощью временной диаграммы. Так как на вход синхронизации второго триггера тактовый сигнал поступает через инвертор, то, когда первый триггер находится в режиме хранения, второй триггер пропускает сигнал на выход схемы. И наоборот, когда первый триггер пропускает сигнал с входа схемы на свой выход, второй триггер находится в режиме хранения.

sch

Рис. 16. Временная диаграмма работы динамического D-триггера.

Обратите внимание, что сигнал на выходе всей схемы в целом не зависит от сигнала на входе D. Если первый триггер пропускает сигнал данных со своего входа на выход, то второй триггер в это время находится в режиме хранения и поддерживает на выходе предыдущее значение сигнала. И только в момент переключения синхросигнала с 1 на 0, сигнал на выходе Q’ запоминается вторым триггером.

УГО D-триггера, запоминающего информацию по фронту тактового сигнала, приведено на рисунке ниже:

sch

Рис. 17. УГО динамического D-триггера.

То, что триггер запоминает входной сигнал по фронту, отображается на условно-графическом обозначении треугольником, изображённым на выводе входа синхронизации.

Иногда при изображении динамического входа указывают, по какому фронту триггер (или триггеры) изменяет своё состояние. В этом случае используется обозначение входа, как это показано на рисунке 18.

sch

Рис. 18. УГО динамического D-триггера.

На рисунке 18 а обозначен динамический вход, работающий по переднему (нарастающему) фронту сигнала. На рисунке 18 б обозначен динамический вход, работающий по заднему (спадающему) фронту сигнала.

Динамические D-триггеры выпускаются в виде готовых микросхем или входят в виде блоков в составе больших интегральных схем, таких как микропроцессоры, ОЗУ, базовый матричный кристалл (БМК) или программируемых логических интегральных схем (ПЛИС).

В качестве примера готовой микросхемы можно назвать 1533ТМ2. В этой микросхеме содержится сразу два динамических триггера. Они изменяют своё состояние по переднему фронту сигнала синхронизации.

Сдвиговый регистр

Представим ситуацию, что нам нужно управлять гораздо большим количеством светодиодов, чем ножек у микроконтроллера. В такой ситуации на помощь нам может прийти устройство под названием сдвиговый регистр. Он служит для преобразования последовательного кода в параллельный. Если двоичные разряды последовательно бит за битом передавать по одному проводнику, то можно не только уменьшить количество используемых ножек МК, но и значительно сократить размеры печатной платы.

Принципиальная схема сдвигового регистра, собранного на основе динамических D-триггеров и позволяющего осуществить преобразование последовательного кода в параллельный, приведена на рисунке 19.

sch

Рис. 19. Принципиальная схема сдвигового регистра.

Как можно видеть из схемы, триггеры соединены последовательно, т.е. выход первого триггера соединен со входом второго и т.д. Входы синхронизации при этом объединены. Это обеспечивает одновременность смены состояния всех триггеров, входящих в состав регистра.

Преобразование последовательного кода в параллельный в последовательном (сдвиговом) регистре производится следующим образом. Отдельные биты двоичной информации последовательно подаются на вход сдвигового регистра D0. Каждый бит сопровождается отдельным тактовым импульсом синхронизации, который поступает на вход синхронизации последовательного регистра C.

После поступления первого тактового импульса логический уровень, присутствующий на входе D0, запоминается в первом триггере последовательного (сдвигового) регистра и поступает на его выход, а так как он соединён с входом второго триггера, то и на его вход. Если бы последовательный (сдвиговый) регистр был собран на D триггерах, работающих по потенциалу, то этот бит тут же записался во второй D триггер. В нашем случае этого не происходит, так как к этому моменту фронт на входе синхронизации C уже закончился.

После поступления второго тактового импульса логический уровень, присутствующий на входе второго триггера последовательного (сдвигового) регистра, запоминается в нем и поступает на его выход, а так как он соединён с входом третьего триггера, то и на его вход. Одновременно следующий бит входного последовательного кода запоминается в первом триггере последовательного (сдвигового) регистра.

После поступления четвертого тактового импульса в триггерах последовательного (сдвигового) регистра будут записаны логические уровни бит, которые последовательно присутствовали на его входе D0. Теперь этими битами можно воспользоваться, например, для отображения на индикаторах.

Пусть на вход последовательного (сдвигового) регистра поступает сигнал, временная диаграмма которого изображена на рисунке 20, тогда состояние выходов этого регистра будет последовательно принимать значения, записанные в таблице ниже.

sch

Рис. 20. Временная диаграмма с примером работы сдвигового регистра

Номер такта1234
Q01011
Q1x101
Q2xx10
Q3xxx1

Условно-графическое изображение рассмотренного последовательного регистра приведено на рисунке 21.

sch

Рис. 21. УГО сдвигового регистра

Микросхема сдвигового регистра 74HC595

Описание микросхемы

В качестве пример сдвигового регистра можно назвать микросхему 74HC595. Её хорошо использовать в качестве расширителя пинов для МК. Она подключается к трем пинам МК и образует 8 цифровых выводов. Причем эти микросхемы можно подключать друг к другу последовательно, что дает возможность получить практически неограниченное количество цифровых выходов, управляемых по трём проводам. На рис. 22 изображена фотография этой микросхемы.

sch

Рис. 22. Фотография микросхемы сдвигового регистра 74HC595 производства фирмы NXP

Если взять в руки микросхему, то совершенно не понятно, как она работает, и что делает каждый её вывод. Поэтому всегда прежде чем начать работать с новой микросхемой необходимо изучить её документацию. Обычно на сленге инженеров такой документ называют "даташит", от англ. datasheet (дословно «лист с данными»).

Давайте откроем документацию на нашу микросхему и изучим её. В первых разделах документации обычно описывают общее назначение микросхемы и её особенности. Так как мы уже знаем, что это сдвиговый регистр, то давайте сразу разберем назначение ножек. На стр. 1 показан общий вид микросхемы на виде сверху, а на стр. 2 - таблица с их описанием. Чтобы понять, с какого угла микросхемы начинается нумерация ножек, используется ключ. Обычно это или окружность, или прямоугольный вырез, как на рисунке 23. Там, где ключ, там и верхняя часть микросхемы на виде сверху. Ниже приведена краткая выжимка этой информации:

sch

Рис. 23. Схемотичное изображение сдвигового регистра 74HC595.

Номер пинаОбозначение пинаОписание
1-7, 15Q0-Q7Параллельные выходы
8GNDЗемля
9Q7SВыход для последовательного соединения регистров
10MRСброс значений регистра (активный 0)
11SHCPВход для тактовых импульсов
12STCPЗащелкивание выходов
13OEРазрешение работы выходов (активный 0)
14DSВход для последовательных данных
16VccПитание

Теперь рассмотрим временную диаграмму со стр. 3.

sch

Рис. 24. Временная диаграмма, описывающая работу микросхемы.

Диаграмма иллюстрирует цикл работы микросхемы:

  • По SHCP последовательно подаются биты через DS;
  • Они сдвигаются внутри регистра;
  • По STCP все 8 бит одновременно появляются на Q0–Q7;
  • OE управляет тем, видны ли эти данные на выводах;
  • MR при необходимости очищает регистр;
  • Q7S показывает «вылетающие» биты для подключения следующей микросхемы.

Практические примеры

Рассмотрим теперь пару практических примеров работы со сдвиговым регистром:

  1. Вывод значения произвольного числа от 0 до 255 в двоичной системе счисления;
  2. Реализация счетчика.

Пример 1

В первом примере мы будем управлять регистром, задавая определенное число от 0 до 255 в двоичной системе счисления, а регистр на выходе будет подсвечивать светодиоды, соответствующие этому же числу.

Электрическая схема проекта выглядит так:

sch

Рис. 24. Электрическая схема проекта со сдвиговым регистром 74HC595.

На этой схеме видно, что светодиоды подключены к сдвиговому регистру через резисторы 330 Ом к ножкам Q0-Q7. Сама микросхема регистра подключена к питанию +3.3V и земле через GND. Выводы OE и MR также подключены к земле и +3.3В соответственно. Их можно контролировать нажатием нужных кнопок или непосредственно с МК, чтобы обнулить входы и/или подключить выходы в нужный момент. Но для упрощения схемы и минимизации количества задействованных выходов МК мы будем использовать более простую схему, так как значения регистров и выводов будут перезаписаны, как только программа начнет работать. Выводы DS, STCP и SHCP подключены к микроконтроллеру. Именно через них будет происходить управление сдвиговым регистром. Обратите внимание на конденсатор 1 мкФ на SHCP, он минимизирует шум при подаче защелкивающего импульса.

Сборочная схема показана на рис. 25. В этом проекте вам придется задействовать немало перемычек, и в собранном виде всё может смотреться достаточно громоздко. Не пугайтесь, так и должно быть. На рис. 26 показана фотография собранной схемы.

sch

Рис. 25. Сборочная схема проекта со сдвиговым регистром 74HC595.

sch

Рис. 26. Фотография собранного проекта.

Теперь разберемся с алгоритмом взаимодействия с 74HC595. Допустим, мы хотим вывести число 15010=100101102. Наша программа должна будет формировать следующую временную диаграмму:

sch

Рис. 27. Временная диаграмма, описывающая работу примера 1.

Сначала защелкивается регистр, переводом STCP к LOW. Затем подаются синхроимпульсы SHCP. По фронту каждого синхроимпульса происходит запись сигналов на выводе DS. Данные на DS поступают от младшего бита к старшему. По прошествии восьми синхроимпульсов защелка STCP переводится в состояние HIGH.

Ниже показан код программы:

#include <VBCoreG4_arduino_system.h>

#define dataPin PA0 //Пин подключен к DS входу 74HC595
#define clockPin PA1 //Пин подключен к SH_CP входу 74HC595
#define latchPin PA4 //Пин подключен к ST_CP входу 74HC595

// данные для отправки
bool data[] = {1, 0, 0, 1, 0, 1, 1, 0};

void setup() {
//устанавливаем режим OUTPUT
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);

digitalWrite(latchPin, LOW);

for (int i = 0; i < sizeof(data); i++) {
digitalWrite(dataPin, data[i]);
delayMicroseconds(5);
digitalWrite(clockPin, HIGH);
delayMicroseconds(5);
digitalWrite(clockPin, LOW);
}

digitalWrite(latchPin, HIGH);

}

void loop() {

}

Загрузите код на микроконтроллер и убедитесь в работоспособности проекта. Как всегда, если что-то не работает, то убедитесь, что схема собрана верно, Arduino IDE настроена, а в коде нет ошибок.

Пример 2

В первом примере регистр выводил только то значение, которое было заранее задано, причем в виде bool-массива. Во втором примере мы реализуем возможность постоянно менять выход сдвигового регистра, причем число будет задаваться в целочисленной переменной. Во время выполнения программы будет производиться инкремент переменной data, а затем передача нового значения на сдвиговый регистр для отображения эквивалента этого числа в двоичной системе.

Код программы представлен ниже:

#include <VBCoreG4_arduino_system.h>

#define dataPin PA0 //Пин подключен к DS входу 74HC595
#define clockPin PA1 //Пин подключен к SH_CP входу 74HC595
#define latchPin PA4 //Пин подключен к ST_CP входу 74HC595

uint8_t data = 0;

void set_reg(uint8_t data)
{
digitalWrite(latchPin, LOW);

for (int i = 0; i < 8; i++) {
bool bits = (data >> i) & 1;
digitalWrite(dataPin, bits);
delayMicroseconds(5);
digitalWrite(clockPin, HIGH);
delayMicroseconds(5);
digitalWrite(clockPin, LOW);
}

digitalWrite(latchPin, HIGH);
}

void setup() {
//устанавливаем режим OUTPUT
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}

void loop() {
data++;
set_reg(data);
delay(500);
}

В этом коде мы перевели в отдельную функцию set_reg всё взаимодействие с микросхемой сдвигового регистра. В этой функции производится последовательная передача байта данных. Строка

bool bits = (data >> i) & 1;

нужна, чтобы взять один конкретный бит из числа data. Представьте, что число data записано в двоичной системе счисления. Например, data = 10101100.

Когда программа делает data >> i, она сдвигает все биты вправо на i позиций. То есть если i = 3, то после сдвига получится: 00010101. Теперь самый правый бит – это тот, который был на месте №3. Затем программа делает операцию И (& 1) – это как фильтр, который оставляет только последний бит (0 или 1).

Теперь, когда вы знаете, как работает программа, скомпилируйте её и загрузите на МК. Понаблюдайте за результатом.

к сведению

Существуют сдвиговые регистры, которые работают не только на вывод информации, но и на ввод. Они применяются там, где содержится много элементов управления, например в клавиатурах или геймпадах.

Заключение

В ходе работы вы познакомились с тем, как абстрактные логические операции превращаются в реальные электронные устройства на основе транзисторов, способные хранить и передавать двоичную информацию. На примере триггеров и сдвиговых регистров стало видно, как из простых функциональных блоков строятся более сложные узлы цифровой техники. И если пойти дальше, то можно сказать, что все устройства вашего микроконтроллера состоят из таких же простейших элементов.

Особое место в уроке заняла микросхема 74HC595, показавшая, как с помощью последовательной передачи данных можно управлять сразу большим количеством выходов, используя ограниченное число линий микроконтроллера. Практические примеры с подсветкой светодиодов показали связь между двоичным представлением чисел, электрическими сигналами и работой программы.

Освоив эти примеры, можно переходить к собственным вариантам алгоритмов и световых эффектов, усложняя логику работы регистра и добавляя новые элементы схемы. Такой подход поможет не только лучше усвоить теорию, но и даст уверенность в проектировании ваших собственных цифровых устройств.

Задачи

  1. Реализуйте иное поведение светодиодов, как например в этом видео: https://youtu.be/louwyHT3WV8?si=F2VHlCi-Z_iH1YxK