Семисегментный индикатор: программирование работы
Перевод двоичного кода десятичного числа в код семисегментного индикатора
Программирование одноразрядного семисегментного индикатора
В первой части статьи о семисегментных светодиодных индикаторах было дано описание индикатора и способов его подключения к микроконтроллеру. Во второй и третьей части мы последовательно пройдем все этапы организации работы микроконтроллера с индикатором и создание программы, результатом которых станет реально работающая конструкция.
Перевод двоичного кода десятичного числа в код семисегментного индикатора
Давайте еще раз посмотрим на схему подключения семисегментного индикатора к микроконтроллеру:
На этой схеме выводы порта PB0.....PB7 подключены к выводам индикатора в определенной последовательности. Выводу PB0 соответствует сегмент "А" и далее соответственно по порядковому номеру вывода порта и по алфавиту выводов индикатора, при этом десятичная точка "dp" подсоединена к выводу порта PB7. Сейчас и далее мы будем рассматривать схемы подключения для индикаторов с общим катодом, а при необходимости я буду вставлять дополнения для индикатора с общим анодом.
Для того, чтобы высветить определенную цифру на индикаторе, необходимо на соответствующих выводах порта микроконтроллера установить логическую единицу
На рисунке выше, черные цифры от 0 до 7 - выводы порта, зеленные латинские буквы - выводы светодиодного индикатора, красные нули - логические уровни на выходах порта (в данном случае логический уровень "0"). Для того, чтобы, к примеру, высветить на индикаторе цифру "4" и зажечь десятичную точку нам необходимо подать логическую 1 на выводы индикатора B, C, F, G и dp, что соответствует подачи логической единицы на выводы порта 1,2,5,6 и 7:
Поэтому, первое что нам необходимо сделать, это определить соответствие каждой десятичной цифре двоичного числа, которое надо выдавать на выход порта микроконтроллера для зажигания соответствующих сегментов индикатора.
Для "четверки" мы уже определили такую комбинацию = 1110 0110, что соответствует шестнадцатиричному числу 66h, определяем и для остальных цифр:
Операция, которую мы проделали, называется переводом двоичного кода десятичного числа в код семисегментного индикатора.
Данная таблица дана для семисегментных индикаторов с общим катодом (сегмент индикатора зажигается логическим уровнем "1"). Для индикаторов с общим анодом (сегмент индикатора зажигается логическим уровнем "0") двоичные коды необходимо проинвертировать (поменять 0 на 1, и наоборот) и заново вычислить соответствующие значения в шестнадцатиричной системе.
Программирование одноразрядного семисегментного индикатора
Использование в конструкции одноразрядного индикатора может потребоваться в разных случаях. К примеру, собираем кодовый замок и есть необходимость высвечивать цифру соответствующую нажатой кнопки, или в охранной сигнализации высвечивать номер сработавшего датчика. Так что сфера применения одноразрядных индикаторов приличная.
Организацию вывода цифр на одноразрядный индикатор мы оформим в виде подпрограммы: "Вывод информации на одноразрядный семисегментный светодиодный индикатор", так, чтобы затем эту подпрограмму с минимальными изменениями можно было использовать в любой программе.
Алгоритм подпрограммы:
1. Инициализация индикатора (подпрограмма)
- настройка порта, к которому подключен индикатор на вывод информации
- запись кодов семисегментного индикатора, соответствующих десятичным цифрам в определенные ячейки памяти
Данная подпрограмма должна вызываться отдельно из основной программы
2. Вход в основную подпрограмму
3. Основная часть
- считываем текущую цифру
- определяем какой код семисегментного индикатора соответствует текущей десятичной цифре
- записываем определенный код индикатора в порт микроконтроллера
4. Выход из подпрограммы
Для оформления программы в виде подпрограммы нам необходимо проделать ряд действий:
1. Присваиваем имя подпрограмме инициализации индикатора - Ini_Indiкator_1 (к примеру)
2. Присваиваем имя основной подпрограмме - Indicator_1
3. Присваиваем имена переменным SRAM в которых будут храниться коды семисегментного индикатора, к примеру:
- D0 (для цифры 0, и так далее), D1, D2, D3, D4, D5, D6, D7, D8, D9
- присваиваем имя переменной в которой будет хранится адрес ячейки памяти (D0) с кодом первой цифры (0) - D0_9
4. Присваиваем имя переменной, в которой будет хранится текущая цифра, которую необходимо вывести на индикатор. В эту переменную основная программа будет записывать вычисленные данные (цифры), которые мы выводим на индикатор - Data (к примеру).
Вот как, к примеру, в Algorithm Builder (остальные примеры тоже для этой программы), объявляются имена переменных в памяти программ (ОЗУ, SRAM):
В графе "Name" перечислены все имена переменных. В графе "Adress" запись "@D0_9" означает, что в переменной D0_9 хранится адрес первой переменной (D0)
Подпрограмма инициализации индикатора (подпрограмма вызывается из основной программы до обращения к подпрограмме вывода информации на индикатор):
А теперь давайте посмотрим основную часть программы и расшифруем ее:
Основная программа записала в назначенную нами переменную Data текущую цифру (для примера - цифра 6) и для вывода ее на индикатор вызвала подпрограмму Indikator_1.
Работа подпрограммы:
- Содержимое переменной Data записывается в рабочий регистр R20, теперь в регистре число 6 (рабочий регистр может быть любой)
- Допустим, первая переменная с кодом цифры 0 у нас находится в ячейки памяти по адресу 100. На самом деле мы не знаем адреса ячеек памяти где хранятся значения D0...D9, но они точно следуют друг за другом. Поэтому была назначена переменная D0_9, в которой, как мы назначили, хранится адрес ячейки памяти D0 (в данный момент адрес =100).
- Следующей командой:
@D0_9 --> Y мы загружаем в двойной регистр Y адрес переменной D0 и получаем, что в регистре Y записалось число - 100.
- Следующей командой:
Y + R20 мы складываем число 100 с числом 6, результат = 106 при этом сохраняется в двойном регистре Y.
- Следующей командой:
[Y] --> R20 мы записываем содержимое ячейки памяти, расположенной по адресу, который записан в двойном регистре Y (106), а по этому адресу у нас расположена ячейка памяти переменной D6. Теперь в рабочем регистре R20 записано число 7Dh - код семисегментного индикатора для вывода цифры 6.
- Следующей командой:
R20 --> PortB мы выводим содержимое R20 в порт PB - высвечиваем цифру 6
- Возвращаемся из подпрограммы
Надеюсь, что материал изложен доступно, если что-то не понятно, спрашивайте.
Предыдущая статья:
Часть 1: Семисегментный светодиодный индикатор: описание, подключение к микроконтроллеру
Следующая статья:
Часть 3: Многоразрядный семисегментный индикатор: организация динамической индикации, алгоритм работы, программа индикации
в коде цифры пять ошибка. Должно быть 5D
пардон, это у меня ошибка в монтаже
Так сложно что бы показать указатели?
Почему дефайнами не определить коды цифр, а потом в порт передавать просто кейзом?
..это Алгоритм Буилдер, нет тут дефайнов..
Здравствуйте.
Дефайнов нет. Смысл в том, чтобы показать алгоритм работы.
С уважением, Admin.
Сайт для тех, кто хочет научиться программировать.
Без разницы - Алгоритм Буилдер, Ассемблер, С и т.п., главное понять как, а перевести в язык программирования, сделать под себя (дефайн) - не так уж и сложно.
А Алгоритм Буилдер - недооцененная программа, практически Ассемблер, И русский программист Громов сделал шедевр.
Ничего себе перевести и сделать под себя не сложно)) Я даже понять не могу как всё это переписать в Си и хоть что-то сделать) Для тех, кто хочет научиться программировать это всё выглядит непоследовательным и взятым с потолка)
Влад, ну вы просто с автором этой статьи относитесь к разным "возрастным" школам - он приверженец написания программ для микроконтроллеров на ассемблере, поэтому вам трудновато его понять. Кстати, специально для вас нашел нужную вам статью на нашем сайте с программой на С - измерение температуры с помощью микроконтроллера AVR и датчика LM35.
Благодарю! Здеся доходчиво изложено! В руководстве АВ сложно что то понять, т.к. рассчитано на узкий круг людей..
Молодчик автор!!
Светодиодный семисегментный индикатор представляет собой группу светодиодов расположенных в определенном порядке и объединенных конструктивно. Зажигая одновременно несколько светодиодов можно формировать на индикаторе символы цифр.