Подключение семисегментного индикатора по трём проводам (74hc595)

Подключение семисегментного индикатора по трём проводам (74hc595)

9zip.ru Радиотехника, электроника и схемы своими руками Подключение семисегментных индикаторов по трём проводам через 74HC595

Для вывода информации используются, как правило, символьные ЖК-дисплейчики и семисегментные индикаторы. Почему в одних случаях выбирают первое, а в других второе? Это можно понять, если сравнить плюсы и минусы данных приборов.

Символьный ЖК-дисплей
+ возможность отображения любых символов
+ вместимость — 32 символа (для модулей 1602)
— требуется 11 линий данных (или 7 — для 4-битного обмена)
— малые размеры и яркость, неразборчиво издалека

7-сегментные индикаторы
+ высокая яркость, разборчиво издалека
+ доступность
— требуется 8 линий данных на каждый элемент
— отображают только цифры и некоторые буквы

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

При использовании как ЖК дисплеев, так и семисегментных индикаторов, требуется достаточное количество пинов микроконтроллера, причём при использовании семисегментных индикаторов количество их растёт с каждым элементом, от чего приходится прибегать к различным ухищрениям наподобие динамической индикации. Эту проблему можно решить, если передавать данные от МК к устройству отображения не параллельно, а последовательно, в идеале — всего по двум проводам. Но даже если и по трём, это будет всё равно значительно меньше. В случае с символьным ЖК-дисплеем это потребует лишь небольшой процедуры для преобразования команд в последовательность, а в случае с 7-сегментными индикаторами это значительно упрощает программу и появляется преимущество, доступное лишь для ЖК-дисплеев: достаточно передать данные на индикацию, и они будут непрерывно отображаться, МК в промежутках между обновлениями можно отправлять в режим пониженного энергопотребления. Правда, на фоне высокого потребления самими индикаторами это, скорее всего, никак не оправдается.

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

Для проверки этого прекрасного метода была изготовлена экспериментальная плата из четырёх последовательно соединённых регистров 74HC595. Таким образом, появляется возможность по трём проводам управлять 4*8=32 выходами.


Это идеально подходит для подключения четырёх семисегментных индикаторов. К сожалению, развести всё в рамках односторонней платы не получилось, а делать двухстороннюю вряд ли оправдано, то был сделан «бутерброд» из двух плат, соединённых друг с другом через 32 выводных резистора, что оказалось удобным и механически прочным. Помимо трёх проводов, разумеется, требуется ещё питание.

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


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

Хочешь почитать ещё про схемы своими руками? Вот что наиболее популярно на этой неделе:
Схемы и печатные платы блоков питания на микросхемах UC3842 и UC3843
Зарядное устройство на UC3842/UC3843 с регулировкой напряжения и тока
Регулируемый блок питания из блока питания компьютера ATX

Сдвиговый регистр 74HC595 и семисегментный индикатор

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

Преимущества использования сдвигового регистра 74HC595:

  • не требует никакой обвязки кроме конденсатора по питанию;
  • работает через широкораспостраненный интерфейс SPI;
  • для самого простого включения достаточно двух выходов микроконтроллера;
  • возможность практически неограниченного расширения количества выходов без увеличения занятых выходов микроконтроллера;
  • частота работы до 100 МГц;
  • напряжение питания от 2 В до 6 В;
  • дешевый — стоит менее 5 центов;
  • выпускается как в планарных корпусах (74HC595D удобен для производства), так и в DIP16 (74HC595N удобен для радиолюбителей и макетирования).

Для понимания работы регистра стоит взглянуть на функциональную схему. Она состоит из:

  • 8-битного регистра сдвига,
  • 8-битного регистра хранения,
  • 8-битного выходного регистра.

Рассмотрим какие выводы есть у сдвигового регистра 74hc595.

Общего вывод и вывод питания объяснений не требуют.

  • GND — земля
  • VCC — питание 5 вольт

Входы 74HC595:

Вход переводящий выходы из высокоимпедансного состояние в рабочее состояние. При логической единице на этом входе выходы 74HC595 будут отключены от остальной части схемы. Это нужно например для того чтобы другая микросхема могла управлять этими сигналами.
Если нужно включить в рабочее состояние микросхеме подайте логический ноль на этот вход. А если в принципе не нужно переводить выходы в высокоимпедансное состояние – смело заземляйте этот вывод.

MR — сброс регистра

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

DS – вход данных

Последовательно подаваемые сюда данные будут появляются на 8-ми выходах регистра в параллельной форме.

SHCP – вход для тактовых импульсов

Когда на тактовом входе SHCP появляется логическая единица, бит находящийся на входе данных DS считывается и записывается в самый младший разряд сдвигового регистра. При поступлении на тактовый вход следующего импульса высокого уровня, в сдвиговый регистр записывается следующий бит со входа данных. Тот бит который был записан ранее сдвигается на один разряд (из Q0 в Q1) , а его место занимает вновь пришедший бит. И так далее по цепочке.

STCP – вход «защёлкивающий» данные

Что бы данные появились на выходах Q0…Q7 нужно подать логическую единицу на вход STCP. Данные поступают в параллельный регистр который сохряняет их до следующего импульса STCP.

Выходы 74HC595

  • Q0…Q7 – выходы которыми будем управлять. Могут находится в трёх состояниях: логическая единица, логический ноль и высокоимпедансное состояние
  • Q7′ – выход предназначенный для последовательного соединения регистров.

Временная диаграмма на которой показано движение логической единицы по всем выходам регистра.

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

Вот такая схема подключения семисегментных индикаторов к микроконтроллеру ATMega48 по SPI получилась:

Это схема с динамической индикацией, то есть в каждый момент времени загорается только одна цифра счетверенного семисегментного индикатора, потом загорается следующая и так по кругу. Но так как смена происходит очень быстро, то глазу кажется, что горят все цифры.
Кроме того одновременно эта схема и опрашивает 4 кнопки S1-S4. Добавив два сдвоенных диода можно опрашивать 8 кнопок. А добавив 4 транзистора и резистора можно подключить дополнительный 4-х знаковый индикатор.
Чтобы динамическая индикация заработала в регистры нужно послать два байта: первый байт определяет, какой из 4-х индикаторов будет работать и какую кнопку будем опрашивать. А второй, какие из сегментов загорятся.

12 thoughts on “ Сдвиговый регистр 74HC595 и семисегментный индикатор ”

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

Читайте также  Фьюзы микроконтроллеров avr – как и с чем их едят

В приведенной схеме динамической индикации светодиоды семисегментного индикатора должны быть на напряжение не более 4 В. В больших индикаторах часто используется последовательное включение нескольких светодиодов: например в индикаторах высотой 5см — 4 светодиода.

Поэтому стоит сделать регистру 74HC595 высоковольтный выход: подключить по MosFET на каждый выход. Затвор на выход микросхемы, исток на землю, а к стоку — «высоковольтную» нагрузку.

А действительно, часто такие схемы обслуживают таблоиды и поболее 5 см. Там может и предложенные MosFET (КМОП, полевики с изолированным затвором) будут рентабельны — цена-то у них, как правило, кусючая. В большинстве-же случаев, достаточно будет DD1, как и DD2 подсоединить к токовым ключам, а не напрямую.
Этого не сделано на приведенной схеме, так как на DD2 может падать нагрузка одновременно с семи сегментов, а на DD1 — только с одного. А экономичность схематического решения — далеко не последнее дело, в каждом, конкретном случае.

Datasheet 74HC595 и 74HCT595 от NXP.

Если не нужно каскадирование, регистр хранения и высокоимпедансное состояние на выходах то можно обойтись 74HC164N.

А зачем, если цена фактически одна? Купить сразу несколько сотен 74HC595 по 1,50 за штуку и ставить их везде и всюду, где нужны последовательно-параллельные регистры.

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

А кто и как интересно опрашивает состояние кнопок на такой схеме, регистр же не контроллер он не понимает нажата кнопка или нет, его дело просто подать соответсвующие сигналы навыходных ножках, обратной же связи нет, или я чего-то не понимаю?

Тот микроконтроллер что дает сигнал на включение разрядов индикатора.
Например логическим нулем зажигаем разряд который подключен к выводу Q0 микросхемы DD2 , тогда при нажатии кнопки S1 на 9-том контакте X1 разъема появляется логический ноль, этот сигнал и считывает микроконтроллер.

А кто и как будет считывать значения с кнопок?

В этом схеме нет алгоритм для считывание состояние кнопок.
Для управление 7сег. индик. лучше включить после 595 микросхему 2003.

Применяйте микросхему TPIC6B595DWR, которая уже содержит полевики с открытым стоком на выходе.

Zzzloj › Блог › Управление по одному проводу семисегментным дисплеем на сдвиговых регистрах 74HC595

Достаточно часто у любителей микроконтроллеров возникает проблема с нехваткой выводов. Обычно для расширения портов ввода/вывода используют сдвиговые регистры типа 74HC595. Но для управления ими требуется целых три вывода! А можно обойтись и ОДНИМ! Именно об этом пойдет речь далее.

Совершенно случайно ко мне в руки попала вот такая игрушка. Устройство представляет собой четырех разрядный статический семисегментный дисплей, выполненный на основе сдвиговых регистров 74HC595. Модуль ориентирован на ардуино и давно снят с продажи. Но интересна схема коммутации входов. Она выполнена с использованием двух RC цепочек на входах тактирования и управления выходной защелкой и позволяет управлять выходами сдвиговых регистров всего по одному проводу вместо трех.

Я бы может и прошел мимо, но данную схему впервые встретил в журнале Радио еще лет 15 назад, и тогда хотелось ее повтрить, но почему-то этого не случилось.

Схема подключения индикаторов к регистрам не вызывает вопросов. Разберемся с подключением сигналов управления. Вход тактирования 11 сдвигового регистра подключается к порту микроконтроллера напрямую. Вход данных 14 подключается к той же линии через RC-цепочку R1C1, время заряда которой составляет примерно 20-25мкС. Вход управления защелкой 12 подключен через RC-цепочку R2C2, которая заряжается примерно за 250мкС.

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

Принцип работы схемы хорошо виден на осциллограмме управляющих сигналов

Передача логической единицы производится подачей импульса длительностью примерно 25мкС и короткой паузы не более 1мкС. Импульс зарядит конденсатор на входе данных до уровня логической единицы, а короткая пауза не успеет его разрядить. Фронт следующего импульса попадет на тактовый вход и запишет единицу в регистр.

Для записи в сдвиговый регистр логического нуля необходимо наоборот сперва подать паузу длиной примерно 30мкС, чтобы разрядить конденсатор на входе данных до уровня логического нуля, если ор был заряжен в предыдущем периоде. А затем подаем короткий импульс около 1мкС, чтобы его фронт записал ноль в регистр.

В завершении передачи 24 бит данных для заполнения 4 сдвиговых регистров следует подать импульс длительностью 250мкС для переключения сигнала управления защелкой. Записанные данные поступят на выходы микросхем и будут удерживаться там до следующего фронта. Теперь конденсатор следует разрядить, для этого устанавливаем на входе схемы низкий уровень минимум на 250мкС, прежде чем подавать новые данные.

На этом можно было бы и закончить баловство, если бы не моя привычка тестировать свои железяки. Меня насторожил тот факт, что RC цепочки имеют разницу по времени заряда всего на один порядок. Отсюда получается, что конденсатор на входе защелки может полностью зарядиться, если подать 10 единиц подряд. А с учетом того, что уровень логической единицы для 74НС595 начинается с напряжения 3,15В, то для полного заряда конденсатора достаточно подряд подать около 6 единиц.

В схеме использованы индикаторы с общим анодом, для отключения сегментов которых на выходе регистра необходимо записать единицы. Получается, что при включении на индикаторе цифры 1 необходимо передать двоичный код 11001111, который как раз и содержит 6 единиц. Если включать на семисегментном дисплее две единицы подряд, то как раз и получим шесть импульсов, передающих логические единицы. Такая комбинация успевает зарядеть конденсатор на входе защелки. В результате чего в момент обновления дисплея наблюдается кратковременное «подмигивание».

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

Мусор появляется на очень короткое время и практически не различим, НО теперь я об этом знаю… и не могу с этим жить. Как только я не пытался сократить длительности импульсов высокого уровня и увеличить паузы, полностью устранить этот глюк не получилось.

Проблему решил заменой резистора R2 с 33КОм на 100КОм. Время заряда RC-цепочки увеличилось в несколько раз. Индикатор стал работать лучше. Но все равно разница между временем заряда конденсаторов на входе данных и защелки было недостаточным для вывода на дисплей четырех единиц. Да и включить при такой схеме больше четырех сдвиговых регистров подряд не получится, т.к. конденсатор С2 все равно может успеть зарядиться до уровня логической единицы.

Для окончательной доработки схемы нужно добавить один а лучше два диода для ускорения разряда С2 и заряда С1. В идеале нужно использовать диоды Шоттки, они обладают более высоким быстродействием. Результат доработки показан на схеме.

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

Читайте также  Мультиметр mastech ms8229

А вот и листинг демо программы для микроконтроллера armega328. Частота процессора 16000000Гц. Данные передаются по линии PORTC.0. Писал в CodeVisionAVR. Думаю, что по комментариям все понятно.

Урок 20. Подключение семисегментного индикатора по трём проводам (74HC595)

Семисегментный индикатор отличное средство для отображения небольшого объема информации, он может отображать все цифры и некоторые буквы. Он достаточно дешёв, распространён, им легко управлять. Но у семисегментного индикатора есть один существенный недостаток — это большое количество проводов для его управления. Представьте ситуацию, вы собираете, какое либо устройство на микроконтроллере и вам нужно добавить средство отображения информации, например семисегментник. Хорошо когда МК «жирный» и в нём есть куча лишних портов ввода/вывода, а если МК «маленький», attiny13 или attiny25, например? Тогда чтобы подключить индикатор вам нужно использовать сдвиговый регистр. О нём сейчас и пойдет речь, а точнее как им управлять в BASCOM-AVR.

Чтобы понять, как управлять сдвиговым регистром с помощью МК, давайте поставим перед собой следующую задачу: Собрать устройство, которое будет поочерёдно отображать цифры от 0 до 9 на семисегментном индикаторе с помощью сдвигового регистра 74HC595, а в качестве управляющего контроллера используем МК Attiny13.

И так, «железная» часть реализации данной задачи, принципиальная схема:

Как видим всё просто, семисегментный индикатор можно использовать практически любой с общим анодом. Я использовал GNS-5612BS-21. Питание схемы от 3 до 5.5 вольт. Я думаю, вам не нужно объяснять, что такое сдвиговый регистр и как он работает.

Теперь «программная» часть задачи, откроем BASCOM-AVR и напишем следующий код:

Этот код должен отображать цифры от 0 до 9 на семисегментном индикаторе с временным интервалом в 1 секунду. Давайте разберемся, как же всё так работает и почему.

1, 2, 3, 4 и 5 строка кода: Указываем используемый микроконтроллер (Attiny13), устанавливаем тактовую частоту МК (1.2 МГц) и размеры стека и фрейма памяти.

7, 8 и 9 строки кода: Конфигурирование портов микроконтроллера PORTB.2, PORTB.1, PORTB.0 на выход.

11 и 12 строки кода: Назначение имён для определённых портов, в данном случае Ds для PORTB.2 и Sh_cp для PORTB.0.

13 строка кода: Назначение константы St_cp = 1, в данной константе прописан номер порта PORTB.1 к которому подключена нога St_cp сдвигового регистра.

15 и 16 строки кода: Назначение переменных, в которых буду храниться «промежуточные» данные.

18 и 31 строки кода: Операторные скобки (Do, Loop) бесконечного цикла, то есть код заключённый в эти скобки будет выполняться бесконечно.

20, 21, 22, 23 и 24 строки кода: Здесь постоянно увеличивается значение переменной Level, при достижении переменной значения 9 ей присваивается 0 и счёт начинается заново. Кстати значение переменной Level и выводится на семисегментный индикатор.

26 строка кода: Присваиваем переменной R1 данные массива, в котором хранятся значения цифр выводимых на семисегментный индикатор. От переменной Level зависит то, какие данные из массива мы присвоим к переменной R1.

27 строка кода: Отправка в сдвиговый регистр значения переменной R1.

28 строка кода: Защёлкиваем данные в сдвиговом регистре, то есть, отображаем их на семисегментнике.

30 строка кода: Останавливаем выполнение программы на одну секунду.

35 строка кода: Метка массива данных под названием Numbers.

36. 45 строки кода: Массивы данных для семисегментного индикатора.

Вот так устроена программа, надеюсь вам всё понятно. Да, кстати, если у вас индикатор с общим катодом — не расстраивайтесь! Просто поменяйте все цифры в массиве на противоположные (1 на 0, 0 на 1) и всё будет работать.

Я схему собрал на макетной плате с механическими контактами, вот что получилось:

При прошивке фьюз-биты оставляйте по «заводу», вот картинка на всякий случай:

Подключаем сдвиговый регистр 74hc595 Ардуино

Сдвиговый регистр 74hc595 Arduino ► рассмотрим на нескольких примерах, как использовать 74hc595 для подключения светодиодов и семисегментного индикатора Ардуино

Сдвиговый регистр 74hc595 Arduino используется для управления семисегментного индикатора и светодиодами. Назначение у сдвиговых регистров велик, один из самых популярных способов применения — умножение выходов Arduino (занимаем 3 пина, а получаем 8). Рассмотрим на примерах с программами и схемами, как использовать 74hc595 для подключения светодиодов и семисегментного индикатора 5161as.

Как работает сдвиговый регистр 74hc595

Чтобы понять принцип работы микросхемы 74hc595, следует рассмотреть распиновку сдвигового регистра 74hc595, которая изображена на картинке ниже. Контакты DS, ST_CP и SH_CP — служат для управления и подключаются к любым выходам платы Arduino. Контакты Q0Q7 — это выходы (разряды) сдвигового регистра. С помощью отправки байта с Ардуино можно менять состояние разряда (HIGH или LOW).

Схема. Описание и распиновка сдвигового регистра 74hc595 Ардуино

Контакты VCC и GND — это питание регистра;
Контакт MR — сброс (не активен);
Контакт OE подключается к GND;
Контакт Q7` предназначен для последовательного соединения регистров.

Как подключить 74hc595 к плате Arduino

Для этого занятия нам потребуется:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • 74HC595 / КР1564ИР52 сдвиговый регистр;
  • макетная плата;
  • светодиоды и резисторы;
  • семисегментный индикатор;
  • провода «папа-папа».

Скетч. Тестирование 74hc595 сдвигового регистра

Мы кратко рассмотрели 74hc595 описание на русском. Но чтобы полностью разобраться в назначении и принципе его работы — следует подключить регистр или его российский аналог КР1564ИР52 к Ардуино Уно, согласно схеме и загрузить следующий скетч. Программа позволяет попеременно включать/выключать восемь светодиодов, используя лишь 3 цифровых пина микроконтроллера Arduino.

Пояснения к коду:

  1. пока защелка регистра ST_CP (подключен к latchPin) находится в состоянии HIGH — регистр не принимает сигнал с микроконтроллера;
  2. данные отправляют в двоичном виде, где каждый из 8 битов отвечает за свой разряд. «1» — разряд переходит в состояние HIGH, «0» — в состояние LOW.

Скетч. Сдвиговый регистр 74hc595 и светодиоды

В следующем примере используем функцию bitWrite(x, n, b), которая позволяет изменять состояние указанного бита переменной. x — переменная, у которой необходимо изменить бит; n — это номер бита, состояние которого необходимо изменить (начинается с крайнего правого бита), b — новое значение бита (0 или 1). Схема со светодиодами остается прежней, меняется только программа.

Пояснения к коду:

  1. в цикле for Arduino меняется переменная bitPos от 0 до 8. С помощью функции bitWrite(byteToSend, bitPos, HIGH); изменяется байт в двоичном виде, который отправляется на регистр. При bitPos=0 получим B00000001, при bitPos=1 — B00000010, при bitPos=2 — B00000100 и т.д.;
  2. MSBFIRST и LSBFIRST меняет направление сигнала.

Скетч. Сдвиговый регистр 74hc595 и индикатор

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

Пояснения к коду:

  1. в схеме не используется контакт Q0 регистра, поэтому байт B0110000 всегда начинается с нуля, так как разряд не используется.

Заключение. Сегодня мы рассмотрели характеристики, назначение и описание сдвигового регистра 74hc595 Arduino. Привели несколько примеров со схемами, рабочими программами с подробными комментариями для управления с помощью регистра светодиодами и семисегментного индикатора 5161as. В своих следующих проектах на Ардуино мы обязательно будем применять эту микросхему.

Подключение семисегментного индикатора по трём проводам (74hc595)

    Сдвиговые регистры, оглавление:
  1. ATmega8 + Proteus: работа со сдвиговыми регистром 74HC595
  2. ATmega8 + Proteus: входной сдвиговый регистр 74HC165, совместная работа с 74hc595
  3. ATmega8 + PCF8574: 8-битный сдвиговой регистр на I2C интерфейсе

Изучение модуля USI MSP430 странным образом(на самом деле закономерным) вывела меня на такую штуку, как сдвиговый регистр. Имея о них лишь общее представление, мне пришлось срочно разбираться c этой, довольно обширной темой. Итак.

Сдвиговый регистр, он же расширитель портов, он же шинный преобразователь, преобразует сигнал последовательной шины в параллельный или/и обратно.

Читайте также  Солнечная батарея своими руками

В рамках этой статью я рассмотрю работу с популярным 8-и битовыми сдвиговым регистром на SPI интерфейсе 74HC595.

В качестве практических примеров, я рассмотрю подключение светодиодной гирлянды, семисегментных индикаторов и дисплея с параллельной шиной HD44780.

В качестве микроконтроллера я буду использовать ATmega8, а в качестве среды моделирования Proteus 8.5.

Кроме этого, я затрону организацию SPI интерфейса у ATmega8.

1) Сдвиговый регистр 74HC595 c SPI интерфейсом

Это один из самых простых регистров, который преобразует последовательную шину в параллельную. Он позволяет получить из трех выводов микроконтроллера — 8 ^n .

    Описание
  • Микросхема принимает на вход последовательность 8-битных данных, которые затем преобразует в логические состояния на 8-пиновом выходе.
  • Микросхема работает только на выход, т.е. мы можем с ее помощью управлять светодиодами или дисплеем HD44780, но не сможем с нее получать данные с датчиков например.
  • Выходы могут принимать состояния: логический ноль, логическую единицу, высокоимпедансное состояние — HiZ.
  • Микросхемы можно соединять каскадом для получения 16-битного выхода, 24-битного, и т.д.
  • Питание микросхемы 74HC595N может варьироваться от двух до шести Вольт.
  • Сдвиговый регистр 74HC595N может работать на частотах до 100MHz.

Микросхема часто используется как драйвер семисегментных индикаторов или дисплея HD44780. Документацию на чип можно скачать например отсюда.

Распиновка микросхемы выглядит следующим образом:

Здесь, Q — Q7 — это цифровые выходы. MR — это reset. OE — переводит выводы в HiZ режим. Q’7 — это бит переполнения, используется для соединения регистров каскадом. DS — линия передачи данных, SH — линия тактирования, ST — защелка(latch), но мне привычнее такие штуки называть Enter’ом.

В рабочем состоянии, OE должен быть соединен с землей, а MR подтянут к питанию. Ведущий микроконтроллер может менять состояние DS при низком уровне линии тактирования — SH. Чип считывает состояние линии DS при растущем фронте на линии тактирования SH.

Прием данных сдвиговым регистром происходит при низком уровне защелки — ST. При этом принимаемые данные идут во внутренний (теневой) регистр(на самом деле там одна цепочка триггеров). При выставлении защелки ST в высокий уровень, содержимое теневого регистра записывается в регистр вывода, и выходы Q — Q7 принимают состояние в соответствии с его содержимым.

Данные посылаются старшим вперед.

Временная диаграмма сигналов:

2) Управление гирляндой светодиодов

Для знакомства с работой сдвигового регистра 74HC595 , в Proteus соберем такую схему:

    Всего в передаче данных задействовано три пина.
  • на PD2 — линия тактирования, SH;
  • на PD3 — линия передачи данных, DS;
  • на PD4 — линия синхронизации данных, ST.

Этими тремя пинами мы можем управлять теперь восемью светодиодами.

Составим программу бегущих огней:

Теперь, если мы хотим соединить регистры каскадом, чтобы получить 16 выводов, всего-то нужно лишь немного видоизменить принципиальную схему:

Для работы видоизмененной схемы в коде нужно будет поменять всего три константы:

Все это хорошо, но: «При чем тут SPI, и всякие шины?» — спросите вы?

А вот при чем. Эта короткая программка является программной реализацией протокола SPI.

3) SPI интерфейс в микроконтроллере ATmega8

То, что мы используем SPI, проверяется очень просто — переключением в коде на использование аппаратного SPI модуля.

В руководстве на ATmega8, SPI модуль описан следующей блок-схемой:

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

Передача данных по SPI между двумя устройствами происходит по такой схеме:

Здесь мастером(ведущим) выступает микроконтроллер ATmega8, а ведомым в нашем случае выступает 74hc595. При передаче старший бит мастера записывается в младший бит слейва, и через восемь тактов, они обмениваются одним байтом.

В работе SPI модуля в ATmega8 задействовано всего три регистра: SPCR — регистр управления, SPSR — флаговый регистр, SPDR — регистр данных.

Регистр управления выглядит так:

Здесь SPIE — включает прерывания по завершении приема или передачи байта из SPDR, SPE — включает модуль SPI, DORD — переключает направление в сдвиговом регистре, MSTR — определяет режим работы микроконтроллера: ведущий или ведомый, CPOL — переключает полярность линии тактирования, CPHA — переключает фазу линии тактирования. Оставшиеся два бита SPR0, SPR1 и SPI2X из SPSR, устанавливают предделитель для линии тактирования.

Регистр SPSR имеет три служебных бита:

Здесь нам будет интересен флаг вызова перерывания SPIF.

В руководстве на ATmega8 имеются примеры работы с SPI-модулем на ассемблере и Си. В последнем случае пример выглядит так:

Для проверки программы нужно будет переподключить сдвиговый регистр к SPI порту ATmega8:

Тестовая программа с использованием SPI будет выглядеть так:

И если все сделать правильно, «бегущий огонь» должен работать через SPI.

4) Подключение семисегментного индикатора через сдвиговый регистр 74HC595

Сдвиговый регистр часто используется как драйвер семисегментного индикатора. Наличие бита переноса позволяет составлять каскад из нескольких разрядов.

Вместо светодиодов подключим пока один индикатор с общим катодом:

Для работы с ним запустим такую программу:

Результат работы должен быть как на гифке сверху.

Семисегментные индикаторы тоже можно подключать каскадом:

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

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

На скорую руку я набросал в Proteus схему такого индикатора:

Здесь индикатор с общим анодом, следовательно сегмент будет загораться при подаче логического нуля. Чтобы обеспечить совместимость с программой для управления индикаторами с общим катодом, я поставил на вход логические инверторы. Хотя, вместо этого можно было бы поменять значения в массиве seg[10], но здесь я хотел показать как делать логические инверторы без использования корпусных микросхем.

Чтобы обеспечить динамическую индикацию, нужно постоянно обновлять информацию на дисплее. Я не нашел ничего проще, чем использовать прерывание по таймеру:

Это программа только для Proteus. Для реального устройства должны быть изменены значения временных задержек. В главном цикле должно стоять 1000ms вместо десяти, и прерывание по таймеру можно запускать не так часто. Напомню, что прерывание в ATmega8 по таймеру TIMER0 рассматривалось здесь пару лет назад.

Результат работы программы должен выглядеть как-то так:

5) Подключение жидко-кристаллического дисплея HD44780 через сдвиговый регистр 74HC595

Широко известный в узких кругах дисплей с параллельной шиной, также можно подключать через сдвиговый регистр.

Для начала следует проверить работу симуляции дисплея в Proteus. Для этого составляется такая схема:

В качестве управляющей программы служит следующая программа:

Это модифицированная версия программы из примера двухлетней давности: «ATmega8: простая программа управления ЖК-дисплеем HD44780. В отличии от оригинала, здесь строб подается отдельно от данных, что наверно более корректно.

Теперь рисуем схему подключения дисплея через сдвиговый регистр:

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

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

В заключение хочу сказать, что кроме SPI, сдвиговый регистр возможно подключать через OneWire интерфейс по одному проводу через RC-цепочки. Изначально это задумывалось для микроконтроллеров в корпусах с малым количеством пинов, на вроде ATtiny13. Но это можно использовать также для SoC c малым количеством выводов, например: ESP8266 или RT5350F. Мне лично этот фокус показался бесполезным, но упомянуть о нем считаю нужным.