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

Содержание

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

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

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

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

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

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

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

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

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


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

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


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

Понравилась статья? Похвастайся друзьям:

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

Подключение семисегментного индикатора по трём проводам (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. Мне лично этот фокус показался бесполезным, но упомянуть о нем считаю нужным.

Урок 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) и всё будет работать.

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

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

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. В идеале нужно использовать диоды Шоттки, они обладают более высоким быстродействием. Результат доработки показан на схеме.

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

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

Сдвиговый регистр 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 и семисегментный индикатор ”

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

В приведенной схеме динамической индикации светодиоды семисегментного индикатора должны быть на напряжение не более 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, которая уже содержит полевики с открытым стоком на выходе.

Arduino.ru

Вывод информации на 4 разрядный 7сегментный индикатор при помощи двух 74hc595

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Здравствуйте!
Для одного из проектов мне потребовались часы на 7 сегментном 4-х разрядном индикаторе и возможность подключить еще ряд внешних исполнительных устройств.
Вариант с LCD мне не подходит. То что находил в интернете не подходит, т.к. либо индикатором заняты все “ноги” Arduino, либо, при использовании 74hc595, регистр ставили на каждый разряд, что я считаю перерасходом микросхем.
В итоге решил делать на двух регистрах – один для генерации символов, другой для переключения разрядов.
После долгих часов оптимизации чужих скетчей у меня получился представленный ниже. В принципе код рабочий, но напрягает то что “засвечиваются” соседние разряды. В принципе жить с этим можно, но охота чтобы все разряды показывали четко те символы какие мне необходимы.
В данный момент вместо часов я подключил переменный резистор, для наглядности, а так же может кому и такое решение подойдет.

Вопрос у меня в следующем – Подскажите, пожалуйста что нужно переделать или добавить для корректного отображения символов.

Схема подключения:


Скетч:

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

напрягает то что “засвечиваются” соседние разряды

Ну, а почему засвечиваются, выяснили?

Предлагаю, например, сэкономить ардуиноноги, и оставить только один выход Latch, на обе 595-е.
Заодно и засвечивание пропадёт, мне кажется.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

напрягает то что “засвечиваются” соседние разряды

Ну, а почему засвечиваются, выяснили?

Предлагаю, например, сэкономить ардуиноноги, и оставить только один выход Latch, на обе 595-е.
Заодно и засвечивание пропадёт, мне кажется.

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

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

Не знаю как сюда видео работы устройства выложить, поэтому залил на яндекс

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Да я же подсказал, осталось попробовать. 🙂

Проблема в том, что цифра на индикаторе меняется в один момент времени – в функции Segment(int x),
а номер разряда в другой момент – в функции Razryad(int r).

Чем эти моменты дальше друг от друга, тем больше рассинхронизация разряда и цифры, и соответственно заметнее засветка.

Можно попробовать изменить программу, чтобы строчки digitalWrite(latchPin, HIGH); и digitalWrite(latchPin2, HIGH); выполнялись подряд, и пауза между ними была как можно меньше.

Но в идеале, всё-таки советую оставить один latchPin, для достижения полной синхронности.
А увеличению разрядности это никак не помешает.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

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

Я, кстати, параллельное расположение менять не предлагаю. Оно ничем не мешает – пусть остаётся, если удобно.

Нужно только объединить у 595-ых сдвиговые входы, и подключить к одному выходу ардуины.

Upd: Не сдвиговые конечно, а входы защёлкивания. Ошибся, извините – ночью советовал. 🙂

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Стало интересно сколько и какие внешние устройства предполагается подключить помимо семисегментника.

Может стоит именно эти устройства подключить через сдвиговые регистры или взят I2C расширитель портов например PCF8574 и не мучаться со сдвиговыми регистрами.

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

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Стало интересно сколько и какие внешние устройства предполагается подключить помимо семисегментника.

согласен, логичнее именно другую переферию подключить на сдвиговые регистры (если применимо), потому как врядли другую переферию нужно так часто переключать как выводы для семисегментника при динамической индикации

в данном варианте вместо PCF8574 целесообразней поставить драйвер семисегментников типа max7219

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Для семисегиентников есть прекрасный драйвер stled316.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

О применении max7219 я думал, но не стал использовать по ряду причин:
1. Работают только с индикаторами с общим катодом, а у меня общий анод на всех имеющихся индикаторах 🙁
2. У нас в городе max7219 не купить, а заказывать с китая только партиями не менее 10 штук. Ради 3-4 проектов заказывать 10 микросхем не охота.
3. Для своих нужд посчитал кощунством использовать max7219. Если уж их грузить, то по полной 🙂
4. max7219 в 3 раза дороже 74hc595. 300 рублей (за 10 штук), конечно, не великие деньги, но тем не менее.
5. 74hc595 считаю более распространенным.
. хотя, касательно цены! В данной схеме используются две 74hc595, а значит разница уже не в 3 раза, а с учетом удобства работы с библиотекой для max7219, может оно и действительно вариант правильнее и проще ;). Но не для меня. Если бы не причина №1, то думаю сделалбы на max7219.

Драйвер stled316 и PCF8574 не стал использовать по тем же причинам – недоступность у нас в городе (думаю не только у меня) да и цена куда выше 74hc595.
Еще, просто хотелось понять как работать с 74hc595 🙂

Скорректированная схема:

Итоговый код:

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

Читайте также:  6.2.5. возможные модификации
Рейтинг
( Пока оценок нет )
Загрузка ...
Adblock
detector