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


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

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

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

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

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

Давайте еще раз посмотрим на схему подключения семисегментного индикатора к микроконтроллеру:
Подключение светодиодного индикатораНа этой схеме выводы порта 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: Многоразрядный семисегментный индикатор: организация динамической индикации, алгоритм работы, программа индикации


(16 голосов, оценка: 4,94 из 5)

Загрузка...


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



Комментарии

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

  1. Так сложно что бы показать указатели?
    Почему дефайнами не определить коды цифр, а потом в порт передавать просто кейзом?

      • Здравствуйте.
        Дефайнов нет. Смысл в том, чтобы показать алгоритм работы.
        С уважением, Admin.

        • Сайт для тех, кто хочет научиться программировать.
          Без разницы - Алгоритм Буилдер, Ассемблер, С и т.п., главное понять как, а перевести в язык программирования, сделать под себя (дефайн) - не так уж и сложно.
          А Алгоритм Буилдер - недооцененная программа, практически Ассемблер, И русский программист Громов сделал шедевр.

          • Ничего себе перевести и сделать под себя не сложно)) Я даже понять не могу как всё это переписать в Си и хоть что-то сделать) Для тех, кто хочет научиться программировать это всё выглядит непоследовательным и взятым с потолка)

  2. Благодарю! Здеся доходчиво изложено! В руководстве АВ сложно что то понять, т.к. рассчитано на узкий круг людей..
    Молодчик автор!!

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *