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

Примечания

Комментарии

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

Источники

  1. Werkbuch Elektronik (нем.). — 3. — Munich, Germany; Achim, Bremen, Germany: Franzis-Verlag GmbH (англ.)русск., 1981. — S. 695. — ISBN 3-7723-6543-4.
  2. . Texas Instruments (март 1974). — « They can be used interchangeable in present or future designs to offer designers a choice between two indicator fonts. The ’46A, ’47A, ‘LS47, and ‘LS48 compose the 6 and the 9 without tails and the ‘246, ‘247, ‘LS247, and ‘LS248 compose the 6 and the 0 with tails. Composition of all other characters, including display patterns for BCD inputs above nine, is identical. Display patterns for BCD input counts above 9 are unique symbols to authenticate input conditions. ». Дата обращения 30 марта 2017.
  3. . casio.ledudu.com. Дата обращения 24 июля 2020.
  4. . www.decodesystems.com. Дата обращения 24 июля 2020.

Программа индикации на многоразрядном семисегментном индикаторе

Как я уже писал в другой статье — АЛГОРИТМ — предшественник программы, и чем продуманнее он будет написан, тем легче будет писать программу.

Назначение переменных:

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

Data0, Data1 и  Data2 — переменные, в которые основная программа записывает вычисленное значение (трехзначное)Data — переменная, в которой записан адрес первой переменной данных — Data0@Data — эта запись означает, что в переменной Data будет храниться адрес первой переменной данных — Data0DataIndex — эта переменная хранит текущий номер переменной данных, которая выводилась на индикацию последней (0, 1 или 2, соответственно для Data0, Data1 или Data2)PortDigits — эта переменная хранит данные о том, какой разряд индикатора зажигался последним

Настройка стека:

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

Настройка восьмиразрядного таймера Taimer0:

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

Настроенный таймер через определенные промежутки времени вызывает прерывание, в результате чего происходит остановка основной программы и осуществляется переход в подпрограмму обработки прерывания. В нашем случае — вызывается подпрограмма вывода данных на индикатор.Как настраивается таймер: Частота переключения разрядов должна быть в пределах 100 Гц  для предотвращения мерцания индикаторов при их поочередном зажигании (дело это в принципе индивидуальное, и зависит от особенностей вашего зрения).Тактовая частота микроконтроллера — 1 мГц, или 1 000 000 Гц Устанавливаем внутренний делитель частоты таймера в СК/8 — рабочая частота таймера будет в 8 раз меньше тактовой частоты микроконтроллера Получаем: 1000 000/8 = 125 000 Гц, или 125 кГц — тактовая частота таймера Настраиваем вызов прерывания по переполнению счетчика таймера (счетчик таймера восьмиразрядный и считает до 255, после этого сбрасывается в ноль и вызывается прерывание) Получаем: 125 000/255 = 490 Гц (что соответствует времени приблизительно в 2 миллисекунды) Мы поочередно зажигаем три разряда: Получаем: 490/3 = 163 Гц — разряды индикатора будут переключаться с частотой 163 Гц.
Настройка таймера производится соответствующей настройкой соответствующих регистров таймера.Давайте посмотрим как это происходит в Algorithm Builder:

Инициализация индикатора

Инициализация индикатора — эта фраза подразумевает настройку разрядов портов, к которым подключены выводы индикатора на вывод, а также обнуление переменных данных Data0…2 и запись первоначальных данных в остальные переменные. Процесс инициализации индикатора прописывается в начале основной программы.
Назовем подпрограмму инициализации Ini_Indikator2/Давайте посмотрим этот процесс на примере:

В первой строке разряды порта РВ с 0 по 6 (к которым подключены семь сегментов индикатора) настраиваются на вывод информации (десятичную точку индикатора не используем).Во второй строке разряды порта PD с 0 по 2 (к которым подключены управляющие транзисторы) также настраиваются на вывод.Третьей строкой на выходах порта РВ устанавливается логический ноль — сегменты индикатора погашены для индикаторов с общим катодом).Четвертая строка — обнуляем переменную DataIndexПятая строка — в переменную PortDigits записываем единицуСледующие три строки — обнуляем переменные данных

Теперь нам необходимо куда-то записать двоичные коды цифр которые будут подаваться на разряды порта PB для высвечивания соответствующей цифры на индикаторе.
В статье по программированию работы одноразрядного семисегментного индикатора, мы эти коды записывали программным путем в ОЗУ микроконтроллера. Сейчас мы сделаем по-другому — запишем двоичные коды в теле самой программы.
Для этого создадим таблицу двоичных кодов и присвоим ей имя, к примеру D0_9:

В этой таблице размещены двоичные коды (хотя и записаны в шестнадцатиричной системе) цифр от 0 до 9.

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

Реализации

Вариант отображения цифр и некоторых букв светодиодным индикатором

Ранний индикатор с нитями накала

Механическое блинкерное 7-сегментное табло для отображения цен на бензин

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

В обычном светодиодном индикаторе используется девять выводов: один идёт к катодам (минусам) всех сегментов, и остальные восемь — к аноду каждого из сегментов, включая точку. Эта схема называется «схема с общим катодом», существуют также схемы с общим анодом, где имеется общий анод (плюс) и индивидуально подключенные катоды. Часто делают не один, а два общих вывода на разных концах корпуса — это упрощает разводку, не увеличивая габаритов.

Многоразрядные индикаторы часто работают по : выводы одноимённых сегментов всех разрядов соединены вместе. Чтобы выводить информацию на такой индикатор, управляющая микросхема должна подавать ток на общие выводы всех разрядов, в то время как на выводы сегментов ток подаётся в зависимости от того, зажжён ли данный сегмент в данном разряде. Таким образом, чтобы получить десятиразрядный экран микрокалькулятора, нужны всего восемнадцать выводов (8 анодов и 10 катодов) — а не 81.

Существуют специальные микросхемы семисегментных дешифраторов, переводящие четырёхбитный код в его семисегментное представление. К примеру, отечественные (КР)514ид1 для индикаторов с общим катодом или (КР)514ид2 с общим анодом. Иногда дешифраторы встраивают прямо в индикатор. В настоящее время, в связи с широким распространением однокристальных микроконтроллеров с GPIO, семисегментные светодиодные индикаторы подключаются напрямую к выводам микроконтроллера.

Часто на ценниках применяются закрашиваемые фломастером сегменты. Также встречаются трафареты в виде семисегментных индикаторов для изображения цен или телефонных номеров.

Одноразрядный 7-сегментный индикатор

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

Важная отличительная черта — у индикатора имеются общие ножки для катода (ножки 3 и 8). Всего их две и они равноценны. Это удобно, вам не нужно будет от каждого катода вести отдельный провод на землю. Достаточно выбрать один из общих катодов и от неё соединиться с GND. Аноды у всех отдельные.

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

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

Схематично можно изобразить следующим образом.

Принципиальная схема

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

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

Если мы хотим помигать цифрой 1, то нам надо использовать светодиоды 4 и 6, которые идут на порты 4 и 6 платы микроконтроллера.

Если мы захотим вывести цифру 5, то понадобится работать с пятью светодиодами, цифру 8 — уже семь светодиодов. При сложных проектах работать с таким количеством становится затруднительно. Придётся каждый раз смотреть на схему, что вспомнить, какие светодиоды нужно включить для отображения каждой цифры.

Но можно пойти другим путём. А поможет нам единица информации — байт. Байт в своём двоичном представлении состоит из 8 бит. Каждый бит может принимать значения 0 или 1. А наш светодиодный индикатор как раз и состоит из восьми светодиодов. Таким образом мы можем представить цифру на индикаторе в виде набора байт, где единица будет отвечать за включённый диод, а ноль — за выключенный диод.

Число в двоичном виде записывается следующим образом:

Первые два символа 0b дают понять, что речь идёт о двоичном счёте. Все нули означают, что все светодиоды будут выключены.

У нас задействованы порты от 2 по 9. Второй порт записывается в самую правую позицию. Чтобы его включить, поставим единицу.

Можно самостоятельно включать по отдельности каждый диод, перемещая единицу в представленном байте. Поняв принцип, можно, например, заметить, что за точку отвечает четвёртый бит справа. Если мы его не будем использовать, то он всегда будет равен 0. За чёрточку посередине индикатора отвечает самый последний байт (или первый слева).

Комбинируя набор нулей и единиц, можно создать нужные нам цифры. Например, цифра 0 будет представлена как 0b01110111.

Давайте напишем пример вывода цифры 0.

Код немного избыточен, переменная mask здесь лишняя, но она нам пригодится в следующем примере

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

Полученная информация помогает нам подсветить нужные светодиоды и получить цифру 0 на выходе.

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

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

Запустив пример, мы получим реальный секундомер. За точность не ручаюсь, но для простых задач подойдёт.

На видео некоторые цифры отображаются коряво, видимо из-за особенностей записи. В реальности все цифры работают как положено.

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

На Амперке есть упоминания о двух компонентах, которые можно использовать для светодиодного индикатора. Я пока ими не пользовался:

http://amperka.ru/product/74hc595-shift-out-register
http://amperka.ru/product/cd4026-segment-driver

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


Распиновка 1-разрядного семисегментного индикатора hdsp 7503 / 5161as 

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

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

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

Вариант для автомобиля

Раньше в различных «контрольках» автоэлектриков в качестве индикатора применялась маломощная лампочка 12 Вольт. С ее помощью осуществлялась проверка напряжения в различных частях бортовой сети автомобиля. Сейчас в большинстве промышленных и самодельных индикаторов 12 В используются светодиоды.

Конструкция таких приборов практически ничем не отличается от первого рассмотренного индикатора. Чтобы переделать первый указатель на 12 В, нужно исключить простой диод или заменить его на двухцветный LED. Гасящий резистор при 12 В должен иметь сопротивление 680 Ом.

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

Подключение

Сначала установим индикаторы и драйверы на breadboard. У всех них ноги располагаются с двух сторон, поэтому, чтобы не закоротить противоположные контакты, размещать эти компоненты необходимо над центральной канавкой breadboard’а. Канавка разделяет breadboard на 2 несоединённые между собой половины.

Далее, подключим один из драйверов в соответствии с его распиновкой

  • 16 — к рельсе питания: это питание для микросхемы
  • 2 «disable clock» — к рельсе земли: мы его не используем
  • 3 «enable display» — к рельсе питания: это питание для индикатора
  • 8 «0V» — к рельсе земли: это общая земля
  • 1 «clock» — через к земле. К этому контакту мы позже подведём сигнал с Arduino. Наличие резистора полезно, чтобы избежать ложного срабатывания из-за окружающих помех пока вход ни к чему не подключен. Подходящим номиналом является 10 кОм. Когда мы соединим этот контакт с выходом Arduino, резистор не будет играть роли: сигнал притянет к земле микроконтроллер. Поэтому если вы знаете, что драйвер при работе всегда будет соединён с Arduino, можете не использовать резистор вовсе.
  • 15 «reset» и 5 «÷10» пока оставим неподключенными, но возьмём на заметку — нам они понадобятся в дальнейшем

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

Далее следует самая кропотливая работа: соединение выходов микросхемы с соответствующими анодами индикатора. Соединять их необходимо через как и обычные светодиоды. В противном случае ток на этом участке цепи будет выше нормы, а это может привести к выходу из строя индикатора или микросхемы. Номинал 220 Ом подойдёт.

Соединять необходимо сопоставляя распиновку микросхемы (выходы a-g) и распиновку индикатора (входы a-g)

Повторяем процедуру для второго разряда

Теперь вспоминаем о контакте «reset»: нам необходимо соединить их вместе и притянуть к земле через стягивающий резистор. В последствии, мы подведём к ним сигнал с Arduino, чтобы он мог обнулять значение целиком в обоих драйверах.

Также подадим сигнал с «÷10» от правого драйвера на вход «clock» левого. Таким образом мы получим схему, способную отображать числа с двумя разрядами.

Стоит отметить, что «clock» левого драйвера не стоит стягивать резистором к земле, как это делалось для правого: его соединение с «÷10» само по себе сделает сигнал устойчивым, а притяжка к земле может только нарушить стабильность передачи сигнала.

Железо подготовленно, осталось реализовать несложную программу.

История изобретения

В 1910 году американским изобретателем Фрэнком Вудом из Ньюпорт-Ньюс, штат Вирджиния, был запатентован индикатор сегментного типа. Его индикатор был восьмисегментным, с дополнительным косым сегментом для отображения цифры “четыре”. Однако, до 1970-х годов семисегментные индикаторы не получили распространение и для отображения цифр применялись вакуумные индикаторы тлеющего разряда.

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

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

Подключение индикатора на панеле

Отображение букв

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

  • В латинице: заглавные A, B, C, E, F, G, H, I, J, L, N, O, P, S, U, Y, Z, строчные a, b, c, d, e, g, h, i, n, ñ, o, q, r, t, u.
  • В кириллице: А, Б, В, Г, г, д, Е, е, и, й, Н, О, о, П, п, Р, С, с, У, Ч, Ы (два разряда), Ь, Э/З.

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

On
Off
Track

и т. д.

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

Принцип работы

Семисегментный индикатор — это просто набор обычных светодиодов в одном корпусе. Просто они выложены восьмёркой и имеют форму палочки-сегмента. Можно подключить его напрямую к Arduino, но тогда будет занято 7 контактов, а в программе будет необходимо реализовать алгоритм преобразования числа из двоичного представления в соответствующие «калькуляторному шрифту» сигналы.

Для упрощения этой задачи существует 7-сегментный драйвер. Это простая микросхема с внутренним счётчиком. У неё есть 7 выходов для подключения всех сегментов (a, b, c, d, e, f, g pins), контакт для сбрасывания счётчика в 0 (reset pin) и контакт для увеличения значения на единицу (clock pin). Значение внутреннего счётчика преобразуется в сигналы (включен / выключен) на контакты a-g так, что мы видим соответствующую арабскую цифру.

На микросхеме есть ещё один выход, обозначенный как «÷10». Его значение всё время LOW за исключением момента переполнения, когда значение счётчика равно 9, а его увеличивают на единицу. В этом случае значением счётчика снова становится 0, но выход «÷10» становится HIGH до момента следующего инкремента. Его можно соединить с clock pin другого драйвера и таким образом получить счётчик для двузначных чисел. Продолжая эту цепочку, можно выводить сколь угодно длинные числа.

Микросхема может работать на частоте до 16 МГц, т.е. она будет фиксировать изменения на clock pin даже если они будут происходить 16 миллионов раз в секунду. На той же частоте работает Arduino, и это удобно: для вывода определённого числа достаточно сбросить счётчик в 0 и быстро инкрементировать значение по единице до заданного. Глазу это не заметно.

Программирование одноразрядного семисегментного индикатора

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

Алгоритм подпрограммы:

1. Инициализация индикатора (подпрограмма)
— настройка порта, к которому подключен индикатор на вывод информации
— запись кодов семисегментного индикатора, соответствующих десятичным цифрам в определенные ячейки памятиДанная подпрограмма должна вызываться отдельно из основной программы2. Вход в основную подпрограмму3. Основная часть
— считываем текущую цифру
— определяем какой код семисегментного индикатора соответствует текущей десятичной цифре
— записываем определенный код индикатора в порт микроконтроллера4. Выход из подпрограммы

Для оформления программы в виде подпрограммы нам необходимо проделать ряд действий:1. Присваиваем имя подпрограмме инициализации индикатора — Ini_Indiкator_1 (к примеру)2. Присваиваем имя основной подпрограмме — Indicator_13. Присваиваем имена переменным SRAM в которых будут храниться коды семисегментного индикатора, к примеру:
— D0 (для цифры 0, и так далее), D1, D2, D3, D4, D5, D6, D7, D8, D9
— присваиваем имя переменной в которой будет хранится адрес ячейки памяти (D0) с  кодом первой цифры (0)  — D0_94. Присваиваем имя переменной, в которой будет хранится текущая цифра, которую необходимо вывести на индикатор. В эту переменную основная программа будет записывать вычисленные данные (цифры), которые мы выводим на индикатор — Data (к примеру).

Вот как, к примеру, в Algorithm Builder (остальные примеры тоже для этой программы), объявляются имена переменных в памяти программ (ОЗУ, SRAM):

В графе «Name» перечислены все имена переменных. В графе «Adress» запись «@D0_9» означает, что в переменной D0_9 хранится адрес первой переменной (D0)

Подпрограмма инициализации индикатора (подпрограмма вызывается из основной программы до обращения к подпрограмме вывода информации на индикатор):

А теперь давайте посмотрим основную часть программы и расшифруем ее:

Основная программа записала в назначенную нами переменную Data текущую цифру (для примера — цифра 6) и для вывода ее на индикатор вызвала подпрограмму Indikator_1.

Работа подпрограммы:
— Содержимое переменной Data записывается в рабочий регистр R20, теперь в регистре число 6 (рабочий регистр может быть любой)
— Допустим, первая переменная с кодом цифры  у нас находится в ячейки памяти по адресу 100. На самом деле мы не знаем адреса ячеек памяти где хранятся значения D0…D9, но они точно следуют друг за другом. Поэтому была назначена переменная D0_9, в которой, как мы назначили, хранится адрес ячейки памяти D0 (в данный момент адрес =100).— Следующей командой:@D0_9 —> Y мы загружаем в двойной регистр Y адрес переменной D0 и получаем, что в регистре Y записалось число — 100.— Следующей командой:Y + R20 мы складываем число 100 с числом 6, результат = 106 при этом сохраняется в двойном регистре Y.— Следующей командой: —> R20 мы записываем содержимое ячейки памяти, расположенной по адресу, который записан в двойном регистре Y (106), а по этому адресу у нас расположена ячейка памяти переменной D6. Теперь в рабочем регистре R20 записано число 7Dh — код семисегментного индикатора для вывода цифры 6.— Следующей командой:R20 —> PortB мы выводим содержимое R20 в порт PB — высвечиваем цифру 6— Возвращаемся из подпрограммы

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

Часть 1: Семисегментный светодиодный индикатор: описание, подключение к микроконтроллеруЧасть 3: Многоразрядный семисегментный индикатор: организация динамической индикации, алгоритм работы, программа индикации

Семисегментный индикатор: программированиеСемисегментный индикатор: подключение, программирование, перевод двоичного кода числа в код семисегментного индикатора
Published by: Мир микроконтроллеров

Date Published: 10/02/2015

Как работает динамическая индикация

Теперь рассмотрим, как работает динамическая индикация с общим катодом. Например, нам необходимо отобразить число 1987. Для этого следует в первый момент времени подать высокий потенциал на аноды сегментов, образующих единицу – b и c, а на общий катод первого разряда подать низкий потенциал. Общие катоды оставшихся трех разрядов – digit2, digit3 и digit4 остаются не подключенными.

Во второй момент времени получают питания сегменты, образующие цифру 9, общий катод второго разряда подключается к минусу, а digit1 теряет питание; digit2, digit3, как и раннее – остаются не подключенными.

В третий момент времени засвечивается цифра 8 на третьем индикаторе, а остальные индикаторы гаснут.

В четвертый момент времени получает питание последний индикатор и отображается цифра 7.

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

Скетч для управлением индикатором hs420561k-32

Теперь остается только написать скетч, его код приведен ниже, а также доступен для скачивания тут: скачать.

//Пин подключен к SH_CP входу 74HC595
int clockPin = 6;
//Пин подключен к ST_CP входу 74HC595
int latchPin = 7;
//Пин подключен к DS входу 74HC595
int dataPin = 8;

// Пины разрядов цифер
int pins_numbers = {2, 3, 4, 5};
// Биты для отображения цифер от 0-9, минуса и символ градуса цельсия
byte numbers_array = {
    B00111111, B00000110, B01011011, B01001111, // 0 1 2 3
    B01100110, B01101101, B01111101, B00000111, // 4 5 6 7
    B01111111, B01101111, B01000000, B01100011 // 8 9 - о
  };
 
void setup() {
  //устанавливаем режим OUTPUT
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);

  for(int i; i<4; i++){
    pinMode(pins_numbers, OUTPUT);
  }
}
 
void loop() {
  // включить сразу несколько цифр нельзя, поэтому очень быстро показываем по одной
  showNumber(1, 11);
  showNumber(2, 7);
  showNumber(3, 2);
  showNumber(4, 10);
}
 
void showNumber(int numNumber, int number){
  // зажигаем нужные сегменты 
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, numbers_array); 
  digitalWrite(latchPin, HIGH);

  // включаем нужный разряд(одну из четырех цифр)
  int num_razryad = pins_numbers;
  for(int i; i<4; i++){
    // выключаем все
    digitalWrite(pins_numbers, HIGH);
  }
  // включаем нужную
  digitalWrite(num_razryad, LOW);
    
  delay(5);
}

Что такое 4-разрядный 7-сегментный индикатор hs420561k-32

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

В первую очередь нужно разобраться, как работает индикатор. У модуля 12 ног, 4 из них являются катодами, и каждый отвечает за один разряд из четырех – на какую ногу будет подан минус, тот разряд и будет активным. 8 других являются анодами и каждая отвечает за один из 7 сегментов и за точку внизу цифры. Таким образом, мы можем управлять каждым сегментом и разрядом. Единственная проблема кроется в том, что выводить можно одновременно только одну цифру на каждом разряде. Побороть это не сложно, достаточно просто за очень короткий промежуток времени по очереди выводить нужную информацию на каждый из разрядов. Человеческий глаз не сможет уловить переключение и будет казаться, что одновременно горят все разряды. Даже фотокамера не смогла это уловить – это видно по фотографии, которую я прикладывал выше.
Посмотреть какая нога индикатора за что отвечает, можно по картинке ниже.

Для удобства работы и чтобы закрепить знания из прошлой статьи про сдвиговый регистр я решил использовать в схеме микросхему 74HC595. Это снизит количество задействованных пинов ардуино. Ниже я привел схему подключений, она получилось кривая, надеюсь, со временем я научусь рисовать их качественней :). P.S. На схеме я не нарисовал 3 резистора — пропустил, их нужно добавить между пинами arduino и ножками hs420561k-32 с именами A, F и B.

Подпрограмма вывода данных на многоразрядный семисегментный индикатор

Присвоим подпрограмме имя, к примеру Indikator2, посмотрим на нее и разберем построчно:Хочу сразу отметить, что в этой подпрограмме вывод данных начинается не с первого разряда индикатора, а со второго — так удобнее реализовать алгоритм.

В переменной DataIndex храниться номер ячейки памяти (0, 1 или 2) с данными (Data0, Data1 или Data2) которые необходимо вывести на разряд индикатора в текущий момент. Первоначально мы записали в нее ноль.Первой строкой мы записываем содержимое DataIndex в регистр R20, теперь в нем соответственно то-же ноль.Во второй строчке мы увеличиваем содержимое регистра R20 на единицу (r20++), теперь в R20 записана единица, означающая, что данные мы будем брать из переменной Data1. При втором прерывании R20 увеличится еще на единицу, станет равным 2, и соответственно следующие данные мы будем брать из переменной Data2. При следующем прерывании R20 станет равным 3.Следующей строчкой (r20<3) мы проверяем какая цифра записана в регистре R20 — если меньше трех (0,1 или 2), то переходим по стрелке, а если равно трем, то обнуляем регистр R20 и данные теперь берем из переменной Data0.Далее записываем содержимое R20 в переменную DataIndex.Следующей командой @Data -> Y записываем адрес переменной Data0 в двойной регистр Y (R28, R29).Затем складываем содержимое двойного регистра Y с содержимым R20 (0,1 или 2).Командой -> r21 записываем содержимое переменной данных (или Data0, или Data1, или Data2 — в зависимости от значения r20) в рабочий регистр R21. Теперь в регистре R21 записана цифра из соответствующей переменной данных (к примеру цифра 5).Следующей командой @D0_9*2 -> Z мы загружаем начальный адрес таблицы с двоичными кодами в двойной регистр Z (R30, R31). По начальному адресу у нас находится двоичный код для цифры 0.Теперь мы складываем содержимое Z с R21 (с пятеркой) и получаем в регистре Z адрес в таблице двоичного кода с цифрой 5.Следующей командой LPM -> R21 мы записываем двоичный код цифры 5 в рабочий регистр R21.Команду NOP — холостой ход, можно и не прописывать — она вставлена для разделения отдельных кусков программы для наглядности.Следующей командой PortDidgit -> R20 мы загружаем в рабочий регистр R20 содержимое переменной PortDidgit, а в нее мы предварительно записали единицу. Теперь в R20 записана единица (#b 0000 0001).Следующей командой <<R20 мы производим сдвиг содержимого регистра R20 на один разряд влево (получаем #b 0000 0010).Следующей командой R20 -> PortD мы подаем напряжение на второй разряд индикатора. При следующем прерывании произойдет еще один сдвиг влево (#b 0000 0100) и будет подключен третий разряд индикатора.С помощью команды R20.3=1 записанной в овале, мы проверяем — достигла ли логическая единица при сдвигах третьего разряда регистра, и если — да, то записываем в R20 единицу (начинается новый круг).Командой R21 -> PortB мы выводим двоичный код соответствующей цифры на подключенный разряд индикатора.Командой R20 -> PortDigits — мы сохраняем текущее значение в переменной (последний зажженный разряд индикатора).

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

Вот, в принципе, и все. Если что-то не очень понятно, или совсем непонятно, пишите, отвечу на все вопросы.

Предыдущие статьи:Часть 1: Семисегментный светодиодный индикатор: описание, подключение к микроконтроллеруЧасть 2: Перевод двоичного кода десятичного числа в код семисегментного индикатора. Программа вывода цифры на одноразрядный светодиодный индикатор.

Многоразрядный семисегментный индикаторПодключение многоразрядного семисегментного индикатора, организация динамической индикации, алгоритм работы программы, программа индикации на многоразрядном семисегментном индикаторе
Published by: Мир микроконтроллеров

Date Published: 04/20/2015

Оцените статью:
Оставить комментарий