Благодаря заметке Два способа мультиплексирования светодиодов на примере микроконтроллеров AVR мы с вами знаем, что можно управлять сотней светодиодов, используя всего лишь 11 пинов микроконтроллера. Но что делать, если нужно управлять двумястами или, скажем, тысячью светодиодами? Оказывается, что изученные способы мультиплексирования могут быть улучшены, да так, что используя всего лишь три пина микроконтроллера можно управлять абсолютно любым количеством светодиодов! И в этом нам помогут следующие микросхемы.
Примечание: Если вы пропустили предыдущий пост, посвященный микросхемам 74xx, вот он — Интегральные схемы: чипы стандартной логики 74xx. Впрочем, тот пост был посвящен логическим вентилям, и для понимания представленного далее материала читать его не требуется.
SIPO сдвиговый регистр 74HC595
Сдвиговые регистры — это микросхемы, позволяющие, очень грубо говоря, добавить пинов вашему микроконтроллеру. Для добавления пинов на запись, используются SIPO сдвиговые регистры. SIPO означает «последовательный вход, параллельный выход». Если же нужно больше пинов на чтение, используются сдвиговые регистры PISO, «параллельный вход, последовательный выход». В данном разделе мы познакомимся с типичным SIPO сдвиговым регистром, 74HC595.
Какой пин 74HC595 для чего предназначен, можно узнать из даташита [PDF]:
Если коротко, то:
- VCC, GND — это питание.
- OE — разрешение вывода. Чтобы вывод был всегда разрешен, можно подключить этот пин напрямую к минусу.
- SRCLR — сброс. Если не используется, то нужно подключить напрямую к плюсу.
- SER, SRCLK — используются для передачи данных. При подаче высокого напряжения на SRCLK происходит считывание одного бита данных с пина SER.
- RCLK — при подаче сюда высокого напряжения происходит одновременный вывод принятых данных на параллельные выходы.
- Qa-Qh — параллельные выходы. Сюда происходит вывод последних восьми полученных бит при подаче высокого напряжения на SRCLK.
- Qh’ — при получении очередного бита информации и смещении значений по параллельным выходам бит Qh на самом деле не отбрасывается, а поступает на этот пин. Подключив его к пину SER другого сдвигового регистра, а также соединив выходы RCLK и SRCLK обоих сдвиговых регистров, можно получить 16-разрядный сдвиговый регистр. Второй сдвиговый регистр в свою очередь можно соединить с третьим и так далее, получив сколь угодно разрядный регистр сдвига.
Надеюсь, идея ясна — мы последовательно передаем на сдвиговый регистр восемь бит информации по одному биту. Затем сдвиговый регистр параллельно выводит полученные биты на восемь пинов. Отсюда и «последовательный вход, параллельный выход».
const uint8_t hc595_data = 6 ; /* SER */
const uint8_t hc595_latch = 7 ; /* RCLK */
Как устроен сдвиговый регистр (shift register)
const uint8_t hc595_clock = 8 ; /* SRCLK */
void setup ( )
{
pinMode ( hc595_data, OUTPUT ) ;
pinMode ( hc595_latch, OUTPUT ) ;
pinMode ( hc595_clock, OUTPUT ) ;
void loop ( )
{
/* . */
digitalWrite ( hc595_latch, LOW ) ;
shiftOut ( hc595_data, hc595_clock, MSBFIRST, hc595_out ) ;
digitalWrite ( hc595_latch, HIGH ) ;
/* . */
delay ( 100 ) ;
}
Нам даже не нужно писать никаких циклов. В Arduino уже предусмотрена готовая процедура shiftOut , которая делает все за нас.
В итоге три пина микроконтроллера эффективно превратились в восемь пинов. Если соединить несколько сдвиговых регистров, как это было описано выше, то можно вместо восьми пинов получить сколько угодно. При этом в микроконтроллере все так же будет задействовано только три пина.
Существует похожий чип 74HC164, который имеет 14 пинов вместо 16-и. В нем отсутствует пин переноса (аналог Qh’). Даташит 74HC164 доступен здесь [PDF].
Регистры
Регистры сдвига или сдвиговые регистры (англ. shift register ) представляют собой, как уже отмечалось, последовательно соединенную цепочку триггеров. Основной режим их работы — это сдвиг разрядов кода, записанного в эти триггеры, То есть по тактовому сигналу содержимое каждого предыдущего триггера переписывается в следующий по порядку в цепочке триггер . Код, хранящийся в регистре, с каждым тактом сдвигается на один разряд в сторону старших разрядов или в сторону младших разрядов, что и дало название регистрам данного типа.
В связи с названием направления сдвига в сдвиговых регистрах часто возникает путаница. Сдвиг бывает двух видов: вправо (основной режим, который есть у всех сдвиговых регистров ) и влево (этот режим есть только у некоторых, реверсивных сдвиговых регистров ). Названия эти отражают внутреннюю структуру регистров сдвига (рис. 8.14) и перезапись сигналов последовательно по цепочке триггеров. При этом триггеры, вполне естественно, нумеруются слева направо, например, от 0 до 7 (или от 1 до 8) для 8-разрядных регистров. В результате сдвиг информации регистром вправо представляет собой сдвиг в сторону разрядов, имеющих большие номера, а сдвиг информации регистром влево — это сдвиг в сторону разрядов, имеющих меньшие номера.
Однако, как известно, в любом двоичном числе слева расположены старшие разряды, а справа — младшие разряды. Поэтому сдвиг двоичного числа вправо будет сдвигом в сторону младших разрядов, а сдвиг влево — сдвигом в сторону старших разрядов. Это противоречие, не чей-то злой умысел, просто так исторически сложилось, и об этом надо помнить разработчику цифровой аппаратуры.
Рис. 8.14. Направление сдвига в сдвиговых регистрах
В стандартные серии цифровых микросхем входит несколько типов сдвиговых регистров , отличающихся возможными режимами работы, режимами записи, чтения и сдвига, а также типом выходных каскадов (2С или 3С). Большинство регистров сдвига имеет восемь разрядов. На рис. 8.15 представлены для примера четыре типа микросхем регистров сдвига .
Регистр ИР8 — наиболее простой из регистров сдвига . Он представляет собой 8-разрядную линию задержки, то есть имеет только один информационный вход, на который подается последовательная сдвигаемая информация (точнее, два входа, объединенных по функции 2И), и восемь параллельных выходов. Сдвиг в сторону выходов со старшими номерами осуществляется по переднему фронту тактового сигнала С. Имеется также вход сброса –R, по нулевому сигналу на котором все выходы регистра сбрасываются в нуль. Таблица истинности регистра ИР8 приведена в табл. 8.5.
Рис. 8.15. Сдвиговые регистры
0 | X | X | X | 0 | 0 | ![]() | 0 |
1 | 0 | X | X | Не меняются | |||
1 | 1 | Х | Х | Не меняются | |||
1 | 0 ![]() | 1 | 1 | 1 | Q0 | ![]() | Q6 |
1 | 0 ![]() | 0 | Х | 0 | Q0 | ![]() | Q6 |
1 | 0 ![]() | Х | 0 | 0 | Q0 | ![]() | Q6 |
Регистр ИР9 выполняет функцию, обратную регистру ИР8. Если ИР8 преобразует входную последовательную информацию в выходную параллельную, то регистр ИР9 преобразует входную параллельную информацию в выходную последовательную. Однако суть сдвига не меняется, просто в ИР9 все внутренние триггеры имеют выведенные параллельные входы, и только один, последний триггер имеет выход (причем как прямой , так и инверсный). Запись входного кода в регистр производится по нулевому сигналу на входе -WR. Сдвиг осуществляется по положительному фронту на одном из двух тактовых входов С1 и С2, объединенных по функции 2ИЛИ. Имеется также вход расширения DR, сигнал с которого в режиме сдвига перезаписывается в младший разряд сдвигового регистра . Таблица истинности регистра ИР9 приведена в табл. 8.6.
0 | X | X | Параллельная запись |
1 | 1 | Х | Хранение |
1 | Х | 1 | Хранение |
1 | 0 | 0 1 | Сдвиг |
1 | 0 1 | 0 | Сдвиг |
Сдвиговый регистр как работает
Сдвиговый регистр — очень распространенное устройство, которое часто применяется для упрощения работы с сегментными индикаторами, с линейками и с матрицами светодиодов. Все эти устройства состоят из множества светодиодов, и если управлять ими напрямую, потребуется занять много выводов контроллера. К примеру, для подключения обычного сегментного индикатора необходимо задействовать восемь выводов. Два таких индикатора займут уже 16 ног Ардуино.
Регистр позволяет нам увеличить количество цифровых выводов микроконтроллера, и мы сможем управлять любым количеством светодиодов, реле, зуммеров и любых других цифровых устройств.
В электронике регистром называют устройство, которое может хранить небольшой объем данных для быстрого доступа к ним. Они есть внутри каждого контроллера и микропроцессора, включая и микроконтроллер Atmega328 — сердце Ардуино Уно. Как правило регистры представляют собой сборку из D-триггеров — элементарных ячеек памяти, с которыми мы уже встречались в отдельном уроке. Записывать данные в регистр можно либо последовательно, либо параллельно. Регистры первого типа называются сдвиговыми, второго типа — параллельными.
Считывать данные из регистра можно одновременно из всех ячеек. Именно это его свойство помогает нам работать с кучей светодиодов.
Список необходимых компонентов
Для выполнения всех примеров из этого урока потребуется контроллер Arduino Uno или любой его аналог, микросхема регистра, светодиоды и резисторы к ним, шкальный индикатор, макетная плата и немного проводов-перемычек и немного проводов вилка-вилка.
Необходимые компоненты можно добавить в корзину прямо здесь, и затем оформить заказ в нашем интернет-магазине.
▍ Автомат световых эффектов на К555ИР11
А в данном устройстве световых эффектов используются уже настоящие цифровые 4-разрядные регистры сдвига с параллельными входом и выходом К555ИР11 (74LS194) . Данная микросхема имеет 4 режима работы, задаваемых управляющими входами S0 и S1 .
- S1=0, S0=0 — блокировка . Микросхема не считывает состояние входов, не изменяет состояние входов, не реагирует на тактовые импульсы. Сохраняется предыдущее состояние выходов.
- S1=0, S0=1 — сдвиг вправо . Значение выхода Q2 записывается в Q3, Q1 — в Q2, Q0 — в Q1. Логический уровень, считанный со входа SR, записывается в Q0.
- S1=1, S0=0 — сдвиг влево . Значение выхода Q3 записывается в Q2, Q2 — в Q1, Q1 — в Q0. Логический уровень, считанный со входа SL, записывается в Q3.
- S1=1, S0=1 — параллельная загрузка . По переднему фронту тактового импульса микросхема считывает состояние параллельных входов и передаёт их на выход. Сдвиг при этом не осуществляется, и на состояние последовательных входов микросхема не реагирует.
В этой схеме параллельные входы D0-D3 первого регистра сдвига U3 можно подтягивать к логической единице или нулю переключателями D0-D3. А параллельные входы второго регистра сдвига U4 жёстко подтянуты к земле.
На каждый из восьми выходов Q0-Q3 двух регистров подключено по светодиоду. Ток светодиодов ограничивается общим резистором R7. Потому чем больше светодиодов включено в данный момент, тем меньше тока ему достаётся, и соответственно тем ниже яркость каждого светодиода.
Входы сброса CR обоих регистров сдвига подтянуты к плюсу питания и не используются. Тактирующие входы CLK соединены вместе и получают тактовые импульсы от мультивибратора на универсальном прецизионном таймере КР1006ВИ1 (NE555). Частоту тактовых импульсов можно регулировать с помощью подстроечного резистора RP1 номиналом 10 кОм.
Управляющие входы обоих микросхем К555ИР11 также соединены вместе: S0 с S0 и S1 c S1. Сигналы на них приходят с логических инверторов на транзисторах Q1 и Q2.
В верхнем по схеме положении ключа K1 на входах S0 будет логическая единица, а на входах S1 — логический нуль. Оба регистра будут осуществлять сдвиг вправо. В нижнем положении K1 S0 = 0, S1 = 1, происходит сдвиг влево.
Однако в момент включения питания посредством выключателя K3 конденсаторы С3 и С4 начнут заряжаться, на мгновение представляя собой почти короткое замыкание, c сопротивлением, равным эффективному последовательному сопротивлению этого конденсатора (ЭПС, ESR). То же самое мы уже видели в схеме сброса десятичного счётчика-дешифратора К561ИЕ8 из статьи про китайскую олимпиаду по электронике.
Благодаря этим электролитическим конденсаторам, в момент включения питания первый регистр сдвига U3 получит управляющие сигналы S0 = 1, S1 = 1, и перейдёт в режим последовательного ввода. Если за время, пока длится это состояние, придёт тактирующий импульс, то U3 прочитает состояние переключателей D0-D3.
А этот импульс придёт, потому что в момент включения логический уровень на выходе таймера NE555 высокий. Низким он станет, когда времязадающий конденсатор, подключённый ко входам 2 и 6, зарядится до порога, составляющего 2/3 напряжения питания.
Микросхема U2 К555ЛН1 (74LS04) содержит 6 логических инверторов с двухтактными выходами. На её КМОП варианте К561ЛН2 (74HC04) мы собирали электронного жучка.
В верхнем по схеме положении переключателя К2 на вход сдвига вправо SR первого регистра U3 приходит логический уровень с выхода Q3 второго регистра U4, а на вход сдвига влево SL U4 — с выхода Q0 U3.
В нижнем положении К2 происходит то же самое, но сигналы инвертированы логическими элементами НЕ U2A и U2B. Остальные четыре инвертора микросхемы не используются.
▍ Выводы
Итак, в момент включения в первый регистр загружаются данные с переключателей D0-D3, а во второй — нули. Направление сдвига задаётся переключателем К1 и может быть изменено в процессе работы.
Положение переключателя К2 определяет, инвертировать ли данные в момент перехода из регистра в регистр. Эти режимы также можно переключать в процессе работы схемы.
Оперируя переключателями, можно получать разные варианты бегущих огней. Это может пригодиться для интерактивного оформления какой-нибудь демонстрационной или развлекательной инсталляции, а также электронной игрушки.
Что такое электронная запись?
Что такое электронная запись?
В электронике регистр — это устройство хранения данных, состоящее из ряда триггеров, которые являются основными элементами памяти. Каждый триггер в регистре может хранить один бит информации: 0 или 1. Регистры широко используются в различных приложениях, таких как манипулирование данными, обработка сигналов и передача информации.
Как работает сдвиговый регистр в электронике
Распространенным типом регистра, используемого в электронике, является сдвиговый регистр. Этот тип регистра позволяет перемещать хранящиеся в нем биты информации в определенном направлении. Регистры сдвига могут быть двух типов: последовательный сдвиг и параллельный сдвиг.
В последовательном сдвиговом регистре биты последовательно перемещаются из одной позиции в другую. Это достигается путем подключения выхода одного триггера ко входу следующего. Когда в регистр вводится новый бит, самый старый бит перемещается на следующую позицию и теряется. Этот тип регистра полезен в приложениях, где требуется непрерывная прокрутка данных, например, при передаче последовательных сигналов.
С другой стороны, в параллельном регистре сдвига все биты одновременно сдвигаются на соседние позиции. Это достигается за счет использования мультиплексоров и логических элементов для управления сдвигом битов. Этот тип журнала полезен, когда необходимы быстрые операции загрузки и скачивания данных, например, в приложениях параллельной обработки данных.
Сдвиговые регистры также могут иметь дополнительные функции, такие как возможность хранить и извлекать данные в определенное время. Это достигается с помощью управляющих сигналов, позволяющих записывать или считывать данные в регистр.
Что такое регистр и как он используется в схемах?
Что такое регистр и как он используется в схемах?
Электронная запись — это устройство, которое последовательно хранит и манипулирует данными. Он работает как цепочка триггеров, где каждый триггер хранит один бит информации. Регистры используются в самых разных приложениях: от счетчиков и генераторов последовательностей до временного хранения данных.
Как работает сдвиговый регистр в электронике
Сдвиговый регистр — это тип регистра, который позволяет перемещать хранящиеся в нем биты из одной позиции в другую. Это достигается с помощью тактового сигнала, который запускает сдвиг битов. В зависимости от типа сдвигового регистра биты сдвигаются вправо или влево.
Наиболее распространенным сдвиговым регистром является сдвиговый регистр последовательного смещения (SISO). Регистр этого типа имеет вход данных, выход данных, тактовый вход и управляющий сигнал для указания направления сдвига. При активации тактового сигнала бит на входе данных загружается в первый триггер регистра. Затем биты сдвигаются вправо или влево в зависимости от управляющего сигнала, а последний бит удаляется из регистра.
Вы заинтересованы в: Быстрые решения, чтобы исправить неработающий пульт Hisense Remote
Другим распространенным типом сдвигового регистра является параллельный последовательный регистр сдвига (PISO). Этот тип регистра позволяет одновременно загружать все входные биты в регистр и перемещать один за другим на выход.
Кроме того, существуют параллельные сдвиговые регистры (SIPO) и параллельные сдвиговые регистры (PIPO), которые позволяют одновременно загружать и сдвигать несколько битов.
Регистры сдвига широко используются в таких приложениях, как последовательная передача данных, преобразование параллельных данных в последовательные и наоборот, а также временное хранение информации. Они также используются при реализации алгоритмов цифровой обработки сигналов и при проектировании сложных последовательных схем.
Как работает 74LS164
5 Сдвиговые регистры
Для хранения и обработки информации в микро-ЭВМ широко используются сдвиговые регистры. Сдвиговый регистр состоит из ряда триггеров (по одному на каждый бит информации), соединенных так, что выход каждого триггера подключен ко входу следующего. Информация в регистре сдвигается на один разряд вправо или влево при поступлении каждого тактового импульса. Это устройство идеально подходит для обработки последовательной информации (подаваемой по биту в каждый момент времени), преобразования параллельной информации (все биты поступают одновременно) в последовательную и последовательной в параллельную.
Сдвиговые регистры реализуются на СИС – устройствах, выполненных с применением RS-, JK-, или D – триггеров, и различия между ними главным образом связаны с методом обработки входных и выходных данных. В данном разделе описываются основные типы этих регистров.
Рис. 2.29. Типичный 4 х разрядный регистр с последовательным входом.
Рис. 2.30. Временная диаграмма работы 4 х разрядного сдвигового регистра.
Сдвиговый регистр с последовательным входом.
Сдвиговый регистр с последовательным входом – это устройство, в котором данные последовательно поступают на вход, как показано на рис. 2.29 для 4 х разрядного сдвигового регистра. В данном случае используются D – триггеры. Работает регистр следующим образом. В исходном положении импульс сброса (логический 0) подается на вход «Установка в 0», устанавливая выходы Q0-Q3 в 0. Дале первый бит данных подается на последовательный вход. При воздействии переднего фронта первого тактового импульса Q0 принимает значение равное D1. Затем на последовательный вход подается D2. При воздействии переднего фронта второго тактового импульса Q0=D2 и Q1=D1. Продолжается этот процесс, после четырех тактовых импульсов имеем Q0=D4, Q1=D3, Q2=D3, Q3=D1. Временная диаграмма для последовательно поступающих входных данных показана на рис. 2.30.
Выход данных при этом может быть как последовательным так и параллельным. В последнем случае сдвиговый регистр работает как последовательно-параллельный преобразователь. Очевидно, для сдвиговых регистров, имеющих большое число разрядов (более восьми), параллельные выходы нецелесообразны из-за большого количества выходов в корпусе ИС. Существуют сдвиговые регистры, имеющие более 1000 разрядов.
Сдвиговый регистр с параллельным входом
Сдвиговый регистр с параллельным, входом — это устройство, в котором входные данные поступают одновременно по параллельным информационным каналам (рис. 2.31).. Запись данных в регистр осуществляется следующим образом. Сначала производится сброс содержимого регистра подачей импульса (логического 0) на вход «Установка в 0». Далее D1—D4 подаются на входы и импульс (логическая 1) .поступает на вход записи. Это приводит к записи информации во все регистры с использованием входов предустановки. После этого при появлении каждого тактового импульса информация сдвигается на один разряд вправо. Выход данных может быть как последовательным, так и параллельным. Многие сдвиговые регистры, выполненные в виде ИС, имеют параллельный вход и последовательный выход. Эти устройства известны как параллельно-последовательные преобразователи.
В описанных выше сдвиговых регистрах сдвиг производился в одном направлении при появлении каждого тактового импульса. Во многих случаях, однако, желательно иметь возможность сдвигать информацию и влево, и вправо. Регистры, обладающие этой способностью, называются реверсивными сдвиговыми регистрами. Управление сдвигом в таких регистрах осуществляется путем подключения выходов триггеров к соответствующим входам при сдвиге влево или вправо. Направление сдвига регулируется входом «Способ работы». Реверсивные сдвиговые регистры с последовательными и параллельными входами и выходами называют универсальными сдвиговыми регистрами.
Рис. 2.31. Типичный 4-разрядный сдвиговый регистр с параллельным выходом.
Пример регистра
В микросхеме ИР1 каждый разряд образован синхронным двухступенчатым триггером RS с логикой на входе (рис. 2.32). Регистр сдвига позволяет реализовать следующие режимы работы: запись информации параллельным кодом; сдвиг вправо; сдвиг влево. Управление режимом работы регистра осуществляется по входам VI, V2, С1, С2 (выводы 1, 6, 9, 8).
Рис. 2.32. Логическая структура микросхемы ИР1
Для записи в регистр информации параллельным кодом следует на вход управления режимом V2 подать напряжение высокого уровня, на вход С2 напряжение низкого уровня, а информационные сигналы на входы D1 — D8. Напряжение на входах С1, VI может быть любым. Для сдвига за писанной параллельным кодом информации вправо тактовые импульсы подаются на вход С2 (вывод 8). При этом на входе V2 (вывод 6) следует поддерживать напряжение высокого уровня. При операциях с данными, представленными в последовательном коде, входную информацию в виде последовательности импульсов подают на вход информации VI (вывод 1), тактовые импульсы на вход синхронизации С1 (вывод 9), а на входах V2, D1 — D8 поддерживают напряжение низкого уровня. Режимы работы ИС ИР1 при различных видах записи информации представлены в табл. 2.11.
При сдвиге влево на вход выбора режима V2 подается напряжение высокого уровня, которое блокирует прохождение тактовых импульсов, для сдвига вправо. Если при этом на входы параллельного кода разрядов D1 — D8 не подавать параллельный код числа, а выход последнего разряда соединить с входом параллельного кода предыдущего разряда, его выход с аналогичным входом предшествующего ему разряда и т. д. то получим регистр сдвига влево. Входом последовательного кода в этом случае служит вход параллельного кода последнего разряда регистра сдвига.
Микросхемы ИР1 могут быть использованы в качестве основного элемента в арифметических устройствах буферной памяти, элемента задержки на n тактов, преобразователя последовательных кодов в параллельные и наоборот, делителя частоты, закольцованного распределителя импульсов и т. д.
Сдвиговый регистр 74HC595
Сдвиговый регистр — это набор последовательно соединённых триггеров (обычно их 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). Получается вот, такая схема:
На BreadBoard можно разместить вот, так:
Теперь к коду: — как говорилось ранее, библиотека SPI использоваться не будет. Есть удобная функция shiftOut(). для начала именуем наши пины (тактовая линия — clock, данные — data, защёлка — latch):
#define clock 13 #define data 12 #define latch 10
потом в void setup() обозначаем их как выходы и сразу ставим защёлке высокий уровень, чтобы регистр не принимал сигналов:
void setup()
теперь давайте попробуем что-нибудь отправить на регистр: — для начала ставим 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()
Теперь вгружаем в ардуину. Результат должен быть таким (зажёгся первый светодиод): (если у вас зажёгся не первый, а последний светодиод, то в функции shiftOut поменяйте LSBFIRST на MSBFIRST и всё станет на свои места). Итак, получилось! Предлагаю создать функцию для того, чтобы каждый раз не писать эти 3 СТРОЧКИ: Я назову её: sendbyte;
void sendbyte(byte value)
Эта функция отправляет регистру состояние всех разрядов сразу. Это пригодится для управления семисегментом (например). Но, чтобы использовать регистр как расширитель портов, нужно управлять каждым разрядом по-отдельности (аналогично функции digitalWrite()): — Мы можем отправлять регистру только полный байты (8 бит — 0b00000000). Если отправить не 8, а 5 бит (например: 0b00000000), то регистр будет ждать недостающие 3 бита. Значит, что когда мы хотим изменить состояние одного разряда регистра (включить его, или выключить) мы должны, по сути, послать ранее отправленный байт, с изменением на один бит. (P. S.: Сейчас долгое и нудное объяснение (новичкам), кому не интересно, спуститесь чуть ниже :); — Итак, сначала создаём, так называемую (мною), базу данных, в которой будет храниться состояние каждого разряда (включен(HIGH) или выключен(LOW)). тип: boolean:
boolean states[8];
Только что у нас появился массив переменных; Каждая переменная в данном массиве обозначает свой разряд (в нулевой (по счёту) будет храниться состояние 1 разряда, второй — 3-го, и т. д.) — Теперь напишем функцию (я назову её: sendpin). Она будет принимать 2 значения: номер разряда, и уровень, который нам надо этому разряду приписать: высокий(HIGH) или низкий(LOW).
void sendpin(int pin, boolean state) < pin—; states[pin]=state; byte value = 0; byte add = 1; for(int i=0; idigitalWrite(latch, LOW); shiftOut(data, clock, LSBFIRST, value); digitalWrite(latch, HIGH); >
— из-за того, что счёт начинается с нуля, нам придётся называть первый пин нулевым. Чтобы это исправить (мы будем писать как есть(первый, значит первый), а Arduino будет сама отбавлять один), Я написал:
— Затем отмечаем изменения в базе данных:
states[pin]=state;
Теперь надо сформировать из 8 битов байт и отправить его на регистр. — для начала создаём переменные: value — тот байт, который будем отправлять. (по умолчанию его нужно сделать нулём):
byte value = 0;
add — это переменная, которая будет хранить в себе байт текущего разряда. для первого разряда это байт 1 (0b10000000);
byte add = 1;
теперь нам нужно прокрутить в базе данных все 8 переменных и сформировать байт (делать это будем с помощью цикла for():
for(int i=0; i
Итак, каждый раз мы проверяем очередной разряд в базе данных. Если он должен иметь высокий уровень, то мы прибавляем к value add и переходим на следующий разряд в цепочке (как бы сдвигаемся на разряд выше (левее). Т. е., в двоичном коде всё просто: было так: 0b01000000; сдвинули единичку влево и получилось так: 0b10000000. А вот в цифровом виде всё по-другому. Сдвиг влево аналогичен умножению на 2 (а вправо, кстати, — делению на 2)). Получается примерно так:
if(states[i]==HIGH) value+=add; add*=2;
Теперь остаётся только послать value на регистр:
digitalWrite(latch, LOW); shiftOut(data, clock, LSBFIRST, value); digitalWrite(latch, HIGH);
В принципе, если понять, то всё очень просто. Итак, давайте попробуем включить 2, 4, 6, и 8 разряды отдельно (4 раза напишем в цикле нашу функцию):
sendpin(2, HIGH); sendpin(4, HIGH); sendpin(6, HIGH); sendpin(8, HIGH);
И кстати, в setup-e нужно очистить регистр (послать 0). Можно даже такую функцию создать:
void cleanreg()
В общем результат таков: