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

7 сегментный дисплей
Дисплей состоит из сегментов - каждый сегмент это светодиод. Поджигая нужные сегменты, мы формируем цифры. На дисплее 4 символа, в каждом 8 сегментов (восьмой это точка) - всего 32 светодиода. Первое, что бросается в глаза - ног на железяке сильно меньше.



Дело в том, что все аноды(+) идентичных сегментов подключены к одному контакту. В свою очередь, все сегменты одного символа объединены общим катодом(-). Поэтому когда мы подаем напряжение на сегмент
А
он загорится на тех символах, катод которых подключен к земле. Это можно проверить на и-н-т-е-р-а-к-т-и-в-н-о-й (то есть можно нажимать мышкой или пальцем)
схеме внизу.Наша задача "собирать" нужные нам сегменты на каждом символе (подаем 1 на нужные аноды и 0 на не нужные) подсвечивать его (подаем 0 на нужный катод и 1 на все остальные). Затем проделать то же самое для оставшихся трех. Быстро переключаясь между символами, мы получим иллюзию того, что горит 4 символа одновременно. В общем случае, это называется мультиплексинг.
Сдвиговый регистр 74hc595
Может так случиться, что занимать у микроконтроллера 12 ног вывода окажется накладно (часто у МК нет 12 ног). В реальных проектах, дисплеи подключается через драйвера (вспомогательные железки на плате). Например, в точечную матрицу установлен max7219.
В этой лабораторной мы будем использовать сдвиговый регистр 74hc595 в качестве примитивного драйвера.

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

То есть, заняв у МК 3 пина(
data
, clock
, latch
), мы получим 8 пинов вывода (или больше - сдвиговые регистры можно составлять в цепочки).У микросхемы два регистра - хранения и сдвига. Первый распаян на ножки вывода. Во второй мы побитово задвагием восьмибитное слово с помощью ножек clock
и data
. На каждом переходе clock
из 0 в 1, микросхема сдвинет все биты в регистре сдвига и в освободившееся место положит значение из пина data
(1 или 0).
При сдвиге последний бит не пропадает бесследно - он выдавливается на ногу Q7S
- ее можно подключить к data
следующей микросхемы в цепи.
Как только мы закончили сдвиг - дергаем latch
(защелку) - при переходе из 0 в 1 микросхема перекинет значение из регистра сдвига в регистр хранения (все биты одновременно) - сигнал на ножках обновится мгновенно. Осознать смысл описанного поможет и-н-т-е-р-а-к-т-и-в-н-а-я (то есть можно нажимать мышкой или пальцем)
схема:
По уму, при подключении дисплея желательно подключать катоды через транзистор, но в этой лабораторной и так много проводов, поэтому я не настаиваю.

Программно, работа с регистром не представляет ничего особенного, понадобится сконфигурировать 3 пина на output и дергать их методом digitalWrite()
. Можно использовать утилиту shiftOut
Полезные ссылки
Сдвиговый регистр 74hc165
8 пинов входа это тоже много. Для считывания значения с восьмибитного переключателя, воспользуемся Parallel In Serial Out регистром (PISO). Работает почти так же, как и вышеописанный - через пины data
, clock
, latch
. Только в этом случае data
пин будет для микроконтроллера входным.
Обратите внимание на clk inh
pin микросхемы - если его оставить в воздухе, наводки приведут к непредсказуемым эффектам.
Внутренней подтяжки у входов нет - поэтому если мы используем кнопки (а переключатели это кнопки), нужно их подтянуть.
Встроенная Arduino функция shiftIn не подходит. Она сначала дергает clock, что в нашем случае лишнее - данные с последнего flip-flop уже лежат на выходе. Поэтому чтобы не терять последний бит - нам нужно сначала его прочитать, потом сдвигать дальше.
Полезные ссылки
Задачи
2.1 - Запускаем дисплей
Если по теории все понятно, можно прыгнуть сразу на следующую задачу
Подключить 7-сегментный дисплей к микроконтроллеру. Выводить значение с потенциометра, убирая незначащие нули. Значение с потенциометра считывать в некотором интервале, напремер 100ms.
2.2 - Запускаем дисплей через "драйвер"
Подключить 7-сегментный дисплей через сдвиговый регистр. Выводить значение с потенциометра.
2.3 - Считываем значение с переключателя
С помощью 74hc165
считать значение на битовом переключателе (красненький такой). Вывести в Serial
.
2.4 - Все готово (Архив)
На дисплее отобразить значение с переключателя.
2.5 - И еще яркость меняется (Архив)
На 74hc595
есть пин OE (Output Enable). Если подать на него ШИМ, можно управлять яркостью дисплея. Значение яркости считывать с Serial
в процентах (как это было в лаб. 1.4)