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

Что-то давно не было обзоров про Arduino-мелочевку.
Сегодня дошли руки до этих деталек и решил их «обозреть»

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

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


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

Если подключать такой индикатор напрямую к микроконтроллеру - тратится очень много дискретных выходов. Для подключения семисегментных и матричных индикаторов по 3-м проводам компания MAXIM разработала контроллеры MAX7219/MAX7221. Вот об этой связке будет мой обзор.

Сразу скажу, что для тех кто не любит паять, продаются



Я такой тоже использовал в , но мне не понравились большие габариты дисплея (особенно по высоте).

Индикаторы приехали в Пермь за 33 дня. Были упакованы в простой мягкий пакет. Ножки воткнуты в кусок пенопласта. Почта России их пощадила:


Размеры 40x16. Размер цифры около 10мм










Количество ножек - 12: 7 сегментов/анодов + точка-анод + 4 общих катода по числу разрядов
Шаг между ножками 2.54мм

Распиновка ножек индикатора


Драйвера MAX7219 приехали за 35 дней тоже в мелком пакете, наколотые на паролонину.


Планирую купить +47 Добавить в избранное Обзор понравился +37 +97

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

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

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

Семисегментный индикатор состоит из семи светодиодов (отсюда и его название), расположенных прямоугольником, как показано на рисунке. Каждый из семи светодиодов называется сегментом, поскольку при свечении сегмент образует часть цифры (десятичной или 12-ричной Иногда в пределах одного пакета используется 8-й дополнительной светодиод. Он служит для отображения десятичной точки (DP), позволяя, таким образом, отображать если два или более 7-сегментных индикаторов соединены вместе для представления чисел больше десяти.

Каждый из семи светодиодных сегментов дисплея соединен с соответствующей площадкой контактного ряда, расположенного прямо на прямоугольном пластиковом корпусе индикатора. Светодиодные контакты промаркированы метками от a до g, представляющими каждый отдельный сегмент. Другие контакты светодиодных сегментов соединены между собой и образуют общий вывод.

Итак, прямое смещение, поданное на соответствующие контакты светодиодных сегментов в определенном порядке, заставит некоторые сегменты светиться, а остальные останутся затемненными, что позволяет высветить нужный символ шаблона числа, которое будет отображено на дисплее. Это и позволяет нам представлять каждую из десяти десятичных цифр от 0 до 9 на 7-сегментном индикаторе.

Общий вывод, как правило, используется для определения типа 7-сегментного дисплея. Каждый светодиод дисплея имеет два соединительных вывода, один их которых называется "анод", а другой, соответственно, носит название "катод". Поэтому светодиодный семисегментный индикатор может иметь два типа схемотехнического исполнения - с общий катодом (ОК) и с общим анодом (ОА).

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

  • Общий катод (ОК) - соединенные между собой катоды всех светодиодных сегментов имеет уровень логического "0" или подключен к общему проводу. Отдельные сегменты высвечиваются подачей на их анодный вывод сигнала "высокого" логического уровня или логической "1" через ограничительный резистор для создания прямого смещения отдельных светодиодов.
  • Общий анод (ОА) - аноды всех светодиодных сегментов объединены и имеют уровень логической "1". Отдельные сегменты индикатора светятся при соединении каждого конкретного катода с землей, логическим "0" или низкопотенциальным сигналом через соответствующий ограничительный резистор.

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

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

Такие семисегментные индикаторы называются статическими. Существенным их недостатком является большое количество выводов в пакете. Для устранения этого недостатка применяются схемы динамического управления семисегментными индикаторами.

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

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

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



Рис.2.

Индикатор называется семисегментным из-за того, что отображаемый символ строится из отдельных семи сегментов. Внутри корпуса такого индикатора находятся светодиоды, каждый из которых засвечивает свой сегмент.
Буквы и другие символы на таких индикаторах отображать проблематично, поэтому для этих целей используются 16-сегментные индикаторы.

Светодиодные индикаторы бывают двух типов.
В первом из них все катоды, т.е. отрицательные выводы всех светодиодов, объединены вместе и для них выделен соответствующий вывод на корпусе.
Остальные выводы индикатора соединены к аноду каждого из светодиодов (рис.3, а). Такая схема называется «схема с общим катодом».
Также существуют индикаторы, у которых светодиоды каждого из сегментов подключены по схеме с общим анодом (рис.3, б).



Рис.3.

Каждый сегмент обозначен соответствующей буквой. На рисунке 4 представлено их расположение.

Рис.4.

В качестве примера рассмотрим двухразрядный семисегментный индикатор GND-5622As-21 красного свечения. Кстати существуют и другие цвета, в зависимости от модели.
С помощью трехвольтовой батарейки можно включать сегменты, а если объединить группу выводов в кучку и подать на них питание, то можно даже отображать цифры. Но такой метод является неудобным, поэтому для управления семисегментными индикаторами используют регистры сдвига и дешифраторы. Также, нередко, выводы индикатора подключаются напрямую к выходам микроконтроллера, но лишь в том случае когда используются индикаторы с низким потреблением тока. На рисунке 5 представлен фрагмент схемы с использованием PIC16F876A.



Рис.5.

Для управления семисегментным индикатором часто используется дешифратор К176ИД2.
Эта микросхема способна преобразовать двоичный код, состоящий из нулей и единиц в десятичные цифры от 0 до 9.

Чтобы понять, как все это работает, нужно собрать простую схему (рис.6). Дешифратор К176ИД2 выполнен в корпусе DIP16. Он имеет 7 выходных вывода (выводы 9 - 15), каждый из которых предназначен для определенного сегмента. Управление точкой здесь не предусмотрено. Также микросхема имеет 4 входа (выводы 2 - 5) для подачи двоичного кода. На 16-й и 8-ой вывод подается плюс и минус питания соответственно. Остальные три вывода являются вспомогательными, о них я расскажу чуть позже.



Рис.6.

DD1 - К176ИД2
R1 - R4 (10 - 100 кОм)
HG1 - GND-5622As-21

В схеме присутствует 4 тумблера (можно любые кнопки), при нажатии на них на входы дешифратора подается логическая единица от плюса питания. Кстати питается сама микросхема напряжением от 3 до 15 Вольт. В данном примере вся схема питается от 9-вольтовой "кроны".

Также в схеме присутствует 4 резистора. Это, так называемые, подтягивающие резисторы. Они нужны, чтобы гарантировать на логическом входе низкий уровень, при отсутствии сигнала. Без них показания на индикаторе могут отображаться некорректно. Рекомендуется использовать одинаковые сопротивления от 10 кОм до 100 кОм.

На схеме выводы 2 и 7 индикатора HG1 не подключены. Если подключить к минусу питания вывод DP, то будет светиться децимальная точка. А если подать минус на вывод Dig.2, то будет светиться и вторая группа сегментов (будет показывать тот же символ).

Входы дешифратора устроены так, что для отображения на индикаторе чисел 1, 2, 4 и 8 требуется нажатие лишь одной кнопки (на макете установлены тумблеры, соответствующие входам D0, D1, D2 и D3). При отсутствии сигнала отображается цифра ноль. При подаче сигнала на вход D0 отображается цифра 1. И так далее. Для отображения других цифр требуется нажатие комбинации тумблеров. А какие именно нужно нажимать нам подскажет таблица 1.


Таблица 1.

Чтобы отобразить цифру "3" необходимо логическую единицу подать на вход D0 и D1. Если подать сигнал на D0 и D2, то отобразится цифра "5" (рис.6).



Рис.6.

Здесь представлена расширенная таблица, в которой мы видим не только ожидаемую цифру, но и те сегменты (a - g), которые составят эту цифру.



Таблица 2.

Вспомогательными являются 1, 6 и 7-ой выводы микросхемы (S, M, К соответственно).

На схеме (рис.6) 6-ой вывод "М" заземлен (на минус питания) и на выходе микросхемы присутствует положительное напряжение для работы с индикатором с общим катодом. Если используется индикатор с общим анодом, то на 6-ой вывод следует подать единицу.

Если на 7-ой вывод "К" подать логическую единицу, то знак индикатора гасится, ноль разрешает индикацию. В схеме данный вывод заземлен (на минус питания).

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

Стоит заметить одну интересную вещь: мы знаем, что тумблер D0 включает цифру "1", а тублер D1 цифру "2". Если нажать оба тумблера, то высветится цифра 3 (1+2=3). И в других случаях на индикатор выводится сумма цифр, составляющих эту комбинацию. Приходим к выводу, что входы дешифратора расположены продуманно и имеют очень логичные комбинации.

Также вы можете посмотреть видео к этой статье.

При таком подходе, для вывода числа с любым количеством разрядов используется всего 2 цифровых выхода Arduino.

Для примера будем выводить на индикаторы количество секунд, прошедших с момента старта работы.

Исходные компоненты

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

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

Подключение

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

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

Программирование

7segment.pde #define CLOCK_PIN 2 #define RESET_PIN 3 /* * Функция resetNumber обнуляет текущее значение * на счётчике */ void resetNumber() { // Для сброса на мгновение ставим контакт // reset в HIGH и возвращаем обратно в LOW digitalWrite(RESET_PIN, HIGH) ; digitalWrite(RESET_PIN, LOW) ; } /* * Функция showNumber устанавливает показания индикаторов * в заданное неотрицательное число `n` вне зависимости * от предыдущего значения */ void showNumber(int n) { // Первым делом обнуляем текущее значение resetNumber() ; // Далее быстро «прокликиваем» счётчик до нужного // значения while (n-- ) { digitalWrite(CLOCK_PIN, HIGH) ; digitalWrite(CLOCK_PIN, LOW) ; } } void setup() { pinMode(RESET_PIN, OUTPUT) ; pinMode(CLOCK_PIN, OUTPUT) ; // Обнуляем счётчик при старте, чтобы он не оказался // в случайном состоянии resetNumber() ; } void loop() { // Получаем количество секунд в неполной минуте // с момента старта и выводим его на индикаторы showNumber((millis() / 1000 ) % 60 ) ; delay(1000 ) ; }

Результат

Подключаем контакт 2 с Arduino к контакту clock младшего (правого) драйвера, контакт 3 - к общему reset’у драйверов; разводим питание; включаем - работает!



Динамическая индикация

Итак, девочки и мальчики, сегодня дядя Сережа расскажет о том, как соорудить динамическую индикацию в домашних условиях, че это ваще такое, и зачем оно нам.

Не вдаваясь в нудные предисловия скажем так:

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

На этом принципе, как вы догадываетесь, построено кино и телевидение. Не слишком занудно?

Поконкретнее.

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

Кстати, индикаторы выглядят примерно вот так:

Уделим пару слов увиденному.

Перед нами – самый обычный светодиодный 7-сегментный индикатор. Вопрос: почему 7-сегментный, когда сегментов на самом деле – восемь? Ответ: потому что 8-й сегмент – это точка, которая не входит в изображение цифры и вообще, является необязательной. Бывают индикаторы и без точек.

Для нумерации сегментов используются латинские буквы от a до h . У всех всех всех 7-сегментных индикаторов в нашем бренном мире, сегменты нумеруются в том порядке, как это показано на рисунке, и никак иначе.

Теперь смотрим на схемы. Во-первых, почему их две? Да потому что индикаторы бывают разные. Бывают – с общим катодом (ОК), бывают – с общим анодом (ОА). Среди буржуйских более распространены, как ни странно, индикаторы с ОА. Но встречаются и с ОК. Так что – нужно быть осторожным, чтоб не спутать. Хотя, нам-то все равно. Нашими индикаторами будет управлять контроллер. А его можно запрограммировать как на работу с ОК так и с ОА. Тут сложностей нет.

У каждого индикатора – 9 ножек. С 1 по 8 – выводы сегментов, 9-я – общий. Допустим, мы хотим отображать 4-разрядное число. Надо 4 индикатора.

Арифметика маленького Пети: 8*4 = 32. То есть, нам потребуется 32 провода (не считая общие) Неслабо? Ничуть. Тем более, учитывая, что у большинства контроллеров количество каналов ввода/вывода как раз равно 32. Как-то меня не очень греет перспектива угрохать все выводы контроллера на индикацию. А вас? Ведь надо ж еще куда-то подключить кнопочки, ручечки, датчички и пр. пр. пр. а мало ли чего? Кстати, у любимого нами AT 90 s 2313 всего 15 каналов ввода/вывода. Как здесь прикажете быть? Вот тут нам и поможет динамическая индикация. Делаем очень просто: подключаем все индикаторы параллельно. Точнее, сажаем выводы сегментов на общую шину. А общие провода оставляем раздельно.

Смотрим небольшой поясняющий мультик:


Че мы делаем?

Мы последовательно подаем напряжение на адресные входы индикаторов, и одновременно выдаем в шину данных 7-сегментный код, соответствующий индикатору, активному в данный момент.

Все. Прекращаю кормить Вас баснями. Сейчас мы пишем прогу. В этой проге мы выведем на 4-разрядный индикатор число 1234. Вот тут то нам и понадобится узнанное в предыдущей главе об оперативной памяти.

Итак, я хочу, чтобы значения цифр, выводимых на индикацию, лежали в ячейках памяти. Поскольку у индикатора 4 разряда – значит цифр тоже будет 4, и соответственно, столько же ячеек памяти. Дабы не заморачиваться, мы объединяем все четыре ячейки в переменную Digit . Итак, пишем:

Include "d:\avr\avrasm\appnotes\2313def.inc" .def Temp1=R16 .def Temp2=R17 .def Temp3=R18 .def Temp4=R19 .def Temp=R20 .dseg Digit: .byte 4

Написали.
Теперь самое время определиться с портами.

Поскольку у нас на порт B уже повешены светодиоды – наверно не будет большим криминалом повесить туда еще и сегменты индикаторов.

Порт D пока что пустует – ну дык значит посадим туда общие провода. Рисуем схему:

Схему прошивки, как и договаривались, не показываем, но подразумеваем ее наличие.

В данной схеме используется два сдвоенных индикатора C562. Эти индикаторы – с общим катодом (об этом говорит буква C в названии). Будем иметь это ввиду при написании программы.

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

Резисторы в шине данных взяты меньшего номинала, чем были. Зачем? Чтоб ярче светили светодиоды. Поскольку индикация динамическая, то каждый индикатор работает только 1/4 общего времени работы схемы. Глаз это воспринимает как пропорциональное уменьшение яркости свечения (т.е. – тоже в 4 раза.). Чтобы как-то компенсировать этот недостаток, на светодиоды подается завышенный ток (больше максимально допустимого). В статическом режиме этот ток может причинить светодиодам вред. Однако в динамическом режиме, кратковременные воздействия тока не столь фатальны.

Ну вот, вроде все. Теперь пишем программулину дальше.

Cseg .org 0 rjmp RESET ; Reset Handler rjmp EXT_INT0 ; IRQ0 Handler rjmp EXT_INT1 ; IRQ1 Handler rjmp TIM_CAPT1 ; Timer1 Capture Handler rjmp TIM_COMP1 ; Timer1 Compare Handler rjmp TIM_OVF1 ; Timer1 Overflow Handler rjmp TIM_OVF0 ; Timer0 Overflow Handler rjmp UART_RXC ; UART RX Complete Handler rjmp UART_DRE ; UDR Empty Handler rjmp UART_TXC ; UART TX Complete Handler rjmp ANA_COMP ; Analog Comparator Handler EXT_INT0: ret EXT_INT1: ret TIM_CAPT1: ret TIM_OVF0: ret TIM_OVF1: ret UART_RXC: ret UART_DRE: ret UART_TXC: ret ANA_COMP: ret TIM_COMP1: ret reset: ldi Temp1,RamEnd ;инициализация стека out SPL,Temp1 cli ldi Temp,0b11111111 ;настройка портов out ddrb,Temp ldi Temp,0b00001111 out ddrd,Temp ldi Temp,4 sts Digit ,Temp ;загрузка начальных сначений ldi Temp,3 sts Digit+1,Temp ldi Temp,2 sts Digit+2,Temp ldi Temp,1 sts Digit+3,Temp ;********************************************************* ;MAIN ;********************************************************* IndicCycle: rcall Display ;цикл индикации rjmp IndicCycle ;********************************************************* Display: ;последовательный вывод на индикацию содержимого;переменной Digit lds Temp1,Digit ;загружаем 0-ю ячейку ldi Temp,0b00001110 ;активируем 0-й разряд;индикации out PortD,Temp rcall Decoder ;вызываем 7-сегм. декодер out PortB,Temp1 ;выводим значение в порт rcall Delay1 ;ждем lds Temp1,Digit+1 ;и.т.д ldi Temp,0b00001101 out PortD,Temp rcall Decoder out PortB,Temp1 rcall Delay1 lds Temp1,Digit+2 ldi Temp,0b00001011 out PortD,Temp rcall Decoder out PortB,Temp1 rcall Delay1 lds Temp1,Digit+3 ldi Temp,0b00000111 out PortD,Temp rcall Decoder out PortB,Temp1 rcall Delay1 ret ;********************************************************* Decoder: ;преобразование двоичного числа;в код 7-сегментного индикатора ldi ZL,Low(DcMatrix*2) ;инициализация массива ldi ZH,High(DcMatrix*2) ldi Temp2,0 ;прибавление переменной add ZL,Temp1 ;к 0-му адресу массива adc ZH,Temp2 lpm ;загрузка значения mov Temp1,r0 ret DcMatrix: ;массив - таблица истинности декодера; hgfedcba hgfedcba .db 0b00111111,0b00000110 ;0,1 .db 0b01011011,0b01001111 ;2,3 .db 0b01100110,0b01101101 ;4,5 .db 0b01111101,0b00000111 ;6,7 .db 0b01111111,0b01101111 ;8,9 ;********************************************************* Delay1: ;цикл задержки push Temp1 push Temp2 ldi Temp1,0 ldi Temp2,50 d11: dec Temp1 brne d11 dec Temp2 brne d11 pop Temp2 pop Temp1 ret

Очень внимательно читаем программу.

Сначала мы настраиваем прерывания, порты и стек. Это стандартно.
Затем, мы записываем в переменную Digit число 1234.
Потом мы выходим в главный цикл программы. из этого цикла вызывается функция Display , которая, собственно, и занимается динамическим выведением на индикацию числа из переменной Digit . Функция состоит из 4-х похожих кусков. Эти куски различаются лишь номером вызываемой ячейки Digit и разрядом текущего индикатора.
Из каждого кусочка вызывается функция Decoder – 7-сегментный декодер. Этот декодер преобразует значение из ячейки Digit в код 7-сегментного индикатора, и передает этот код обратно функции Display , которая выводит его на индикацию.

Вот так, в общих чертах, все просто и понятно.


ID: 720

Как вам эта статья?