Как пишется семисегментный

Программирование микроконтроллеров Курсы

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

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

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

По количеству разрядов различают одно-, двух-, трех-, и четырехразрядные индикаторы. Бывает и более разрядов, но они встречаются довольно редко.

Семисегментный индикатор. Принцип работы семисегментного индикатора

Устройство семисегментного индикатора

Любой семисегментный индикатор обязательно состоит из семи сегментов. Отсюда и происходит его название. Каждый сегмент – это обычный отдельный светодиод. Мощные семисегментники могут содержать в одном сегменте несколько, как правило, последовательно соединенных светодиодов.

Кроме того в корпусе помимо сегментов находится еще и точка или запятая или другой символ.

С помощью семи сегментов можно изобразить десять цифр: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 и некоторые буквы, как латиницы, так и кириллицы.

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

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

Вне зависимости от количества разрядов и размеров цифр каждый сегмент имеет название в виде одной из первых букв английского алфавита: a, b, c, d, e, f, g. Точка обозначается dp.

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

Для того чтобы засветить один из светодиодов семисегментного индикатора с общим анодом следует на общий вывод (анод) подать «+», а на соответствующий отдельный вывод – «-» источника питания.

Принцип работы семисегментного индикатора

Если применяется общий катод, — то наоборот – минус подается на общий, а плюс на отдельный вывод.

Чтобы отобразить на индикаторе цифру или букву следует засветить несколько сегментов. Например, для отображения единицы 1 задействуются сегменты b и c. При отображении восьмерки 8 задействуются все символы от a до g. Пятерка получается из таких символов: a, c, d, f, g.

Семисегментный индикатор. Отображение цифр

Как подключить семисегментный индикатор к микроконтроллеру

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

Схемы подключения с общим анодом ОА и общим катодом ОК аналогичны, только общий вывод подключается соответственно к плюсу или минусу источника питания.

Схема подключения семисегментного индикатора к микроконтроллеру

Все светодиоды подключаются к выводам микроконтроллера через отдельные резисторы сопротивлением 220…330 Ом.

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

Схема подключения семисегментного индикатора к микроконтроллеру ATmega8

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

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

Теперь создадим модель в Протеусе и соберем схему на макетной плате. Далее по мере написания кода будем проверять работу микроконтроллера на модели и на реальном устройстве.

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

Семисегментный индикатор в Proteus находится в категории (Category) Optoelectronics (Оптоэлектроника). Ниже в подкатегории (Sub-category) следует кликнуть по строке 7-Segment Displays. После этого в окне результатов (Results) выбираем одноразрядный семисегментный индикатор 7SEG-MPX1-CC.

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

Код для микроконтроллера ATmega8

Теперь пишем код. Сначала настраиваем порт D полностью на выход. Для отображения единицы 1 задействуются сегменты b и c, выводы которых подключены к PD1 и PD2. Поэтому соответствующие биты регистр PORTD нужно установить в единицу.

#include <avr/io.h>

int main(void)

{

    DDRD = 0b11111111;

        while (1)

    {

         PORTD = 0b00000110; //1

    }

}

После компиляции кода и прошивки кода результаты мы видим в Proteus и на макетной плате.

Модель семисерментного индикатора в Proteus

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

Аналогичным образом формируются все цифры.

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

#define F_CPU 1000000L

#include <avr/io.h>

#include <util/delay.h>

int main(void)

{

    DDRD = 0b11111111;

    while (1)

    {

         PORTD = 0b00111111; //0

         _delay_ms(300);

         PORTD = 0b00000110; //1

         _delay_ms(300);

         PORTD = 0b01011011; //2

         _delay_ms(300);

         PORTD = 0b01001111; //3

         _delay_ms(300);

         PORTD = 0b01100110; //4

         _delay_ms(300);

         PORTD = 0b01101101; //5

         _delay_ms(300);

         PORTD = 0b01111101; //6

         _delay_ms(300);

         PORTD = 0b00000111; //7

         _delay_ms(300);

         PORTD = 0b01111111; //8

         _delay_ms(300);

         PORTD = 0b01101111; //9

         _delay_ms(300);

            }

}

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

Скачать программы и модель в Proteus

Как читать электрические схемы и создавать электронные устройства

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

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

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

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

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

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

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

Их конструкция и особенности

Наверняка вы уже видели индикаторы – «восьмёрки». Это и есть семисегментный светодиодный индикатор, который служит для отображения цифр от 0 до 9, а также децимальной точки (DP – Decimal point) или запятой.

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

В зависимости от модели сборка может состоять из 1 – 4 семисегментных групп. Например, индикатор АЛС333Б1 состоит из одной семисегментной группы, которая способна отображать всего лишь одну цифру от 0 до 9.

А вот светодиодный индикатор KEM-5162AS уже имеет две семисегментных группы. Он является двухразрядным. Далее на фото показаны разные светодиодные семисегментные индикаторы.

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

Также существуют индикаторы с 4-мя семисегментными группами – четырёхразрядные (на фото – FYQ-5641BSR-11). Их можно использовать в самодельных электронных часах.

Четырёхразрядный индикатор

Как обозначаются семисегментные индикаторы на схемах?

Так как семисегментный индикатор – это комбинированный электронный прибор, то изображение его на схемах мало отличается от его внешнего вида.

Обозначение семисегментного индикатора на принципиальных схемах

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

Особенности семисегментных индикаторов.

Несмотря на кажущуюся простоту этой детали и у неё есть особенности.

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

Вот, например, цоколёвка уже знакомого нам 4-ёх разрядного индикатора FYQ-5641BSR-11.

Цоколёвка семисегментного индикатора FYQ-5641BSR

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

Кроме небольших индикаторов есть большие и даже очень большие. Их можно увидеть в общественных местах, обычно в виде настенных часов, термометров, информеров.

Чтобы увеличить размеры цифр на табло и одновременно сохранить достаточную яркость каждого сегмента, используется несколько светодиодов, включенных последовательно. Вот пример такого индикатора – он умещается на ладони. Это FYS-23011-BUB-21.

Индикатор FYS-23011-BUB-21

Один его сегмент состоит из 4 светодиодов, включенных последовательно.

Цоколёвка индикатора FYS-23011

Чтобы засветить один из сегментов (A, B, C, D, E, F или G), нужно подать на него напряжение в 11,2 вольта (2,8V на каждый светодиод). Можно и меньше, например, 10V, но яркость тоже уменьшится. Исключение составляет децимальная точка (DP), её сегмент состоит из двух светодиодов. Для неё нужно всего 5 — 5,6 вольт.

Работа семисегментного индикатора на светодиодах

Также в природе встречаются двухцветные индикаторы. В них встраиваются, например, красные и зелёные светодиоды. Получается, что в корпус встроено как бы два индикатора, но со светодиодами разного цвета свечения. Если подать напряжение на обе цепи светодиодов, то можно получить жёлтый цвет свечения сегментов. Вот схема соединений одного из таких двухцветных индикаторов (SBA-15-11EGWA).

Двухцветный семисегментный индикатор

Если коммутировать выводы 1 (RED) и 5 (GREEN) на «+» питания через ключевые транзисторы, то можно менять цвет свечения отображаемых чисел с красного на зелёный. А если же одновременно подключить выводы 1 и 5, то цвет cвечения будет оранжевым. Вот так можно баловаться с индикаторами .

Управление семисегментными индикаторами.

Для управления семисегментными индикаторами в цифровых устройствах используют регистры сдвига и дешифраторы. Например, широко распространённый дешифратор для управления индикаторами серии АЛС333 и АЛС324 – микросхема К514ИД2 или К176ИД2. Вот пример.

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

Для управления большими семисегментными индикаторами, такими как, FYS-23011-BUB-21 применяются специализированные драйверы, например, микросхема MBI5026.

Что внутри семисегментного индикатора?

Ну и немного вкусненького. Любой электронщик не был бы таковым, если бы не интересовался «внутренностями» радиодеталей. Вот что внутри индикатора АЛС324Б1.

Индикатор АЛС324 в разобранном виде

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

Главная » Радиоэлектроника для начинающих » Текущая страница

Также Вам будет интересно узнать:

  • Схема мигалки на светодиодах.

  • Простая схема «Бегущих огней».

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

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

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

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

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

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

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

Что получается в итоге? Каждая полоска на семисегментном индикаторе засвечивается светодиодом или группой светодиодов. В результате, засветив определенные сегменты, мы можем вывести цифру от 0 и до 9, а также буквы и символы.

Виды семисегментных индикаторов и обозначение на схеме

Существуют одноразрядные, двухразрядные, трехразрядные и четырехразрядные семисегментные индикаторы. Более четырех разрядов я не встречал.

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

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

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

семисегментный индикатор обозначение на схемах

В действительности же, помимо основных выводов, каждый семисегментный индикатор также имеет общий вывод с общим анодом (ОА) или общим катодом (ОК)

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

Внутренняя схема семисегментного индикатора с общим анодом будет выглядеть вот так:

семисегментный индикатор внутреннее строение с общим анодом

а с общим катодом вот так:

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

Если семисегментный индикатор у нас с общим анодом (ОА), то в схеме мы должны на этот вывод подавать «плюс» питания, а если с общим катодом (ОК) — то «минус»  или землю.

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

У нас имеются в наличии вот такие индикаторы:

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

Для того, чтобы проверить современный семисегментный индикатор, нам достаточно мультиметра с функцией прозвонки диодов. Для начала ищем общий вывод — это может быть или ОА или ОК.  Здесь только методом тыка.  Ну а далее проверяем работоспособность остальных сегментов индикатора по схемам выше.

Как вы видите ниже на фото, у нас загорелся проверяемый сегмент. Таким же образом проверяем и другие сегменты. Если все сегменты горят, то такой индикатор целый и его можно использовать в своих разработках.

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

Иногда напряжения на мультиметре не хватает для проверки сегмента. Поэтому, берем блок питания, и выставляем на нем 5 Вольт. Чтобы ограничить ток через сегмент, проверяем через резистор на 1-2 Килоома.

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

Таким же образом проверяем индикатор от китайского приемника

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

В схемах семисегментные индикаторы  соединяются с резисторами на каждом выводе

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

В нашем современном мире семисегментные индикаторы заменяются жидко-кристаллическими индикаторами, которые могут высвечивать абсолютно любую информацию

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

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

Форма электронного устройства отображения для отображения десятичных чисел

Типичный 7-сегментный светодиодный дисплей компонент с десятичной точкой в ​​широком DIP -10 корпусе

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

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

Содержание

  • 1 История
  • 2 Реализации
  • 3 символа
    • 3.1 Десятичный
    • 3.2 Шестнадцатеричный
    • 3.3 Латинский алфавит
    • 3.4 Пунктуация
  • 4 См. Также
  • 5 Ссылки
  • 6 Внешние ссылки

История

A мультиплексированный 4-значный семисегментный дисплей всего с 12 контактами

Семисегментное представление фигур можно найти в патентов еще в 1903 г. (в U.S. Патент 1126641 ), когда Карл Кинсли изобрел метод телеграфной передачи букв и цифр и их печати на ленте в сегментированном формате. В 1908 году Ф. В. Вуд изобрел 8-сегментный дисплей, на котором цифра 4 отображалась с помощью диагональной полосы (Патент США 974943 ). В 1910 г. на сигнальном табло котельной электростанции был установлен семисегментный индикатор, освещенный лампами накаливания. Они также использовались, чтобы показывать набранный телефонный номер операторам при переходе от ручного набора номера к автоматическому. Они не получили широкого распространения до появления светодиодов в 1970-х годах.

Семисегментный дисплей с нитью накала

Некоторые ранние семисегментные дисплеи использовали нити накаливания в откачанной лампе; они также известны как нумитроны. Вариант (минитроны) использовал вакуумированный герметичный ящик. Минитроны — это сегментные дисплеи с нитью накала, которые размещены в корпусах DIP, как современные сегментные светодиодные дисплеи. Они могут иметь до 16 сегментов. Были также сегментные дисплеи, в которых вместо светодиодов или нитей накаливания использовались маленькие лампы накаливания. Они работали так же, как современные светодиодные сегментные дисплеи.

Вакуумные флуоресцентные дисплеи версии также использовались в 1970-х.

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

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

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

Семисегментный дисплей вдохновил дизайнеров шрифтов на создание шрифтов, напоминающих этот дисплей (но более разборчивых), таких как New Alphabet, «DB LCD Temp», «ION B» и т. Д.

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

Реализации

Семисегментные дисплеи могут использовать жидкокристаллический дисплей (LCD), светоизлучающий диод (LED) для каждого сегмента., электрохромный дисплей или другие методы генерации света или управления, такие как газовый разряд с холодным катодом (Panaplex), вакуумно-флуоресцентный (VFD), накаливания (Numitron) и другие. Для ценовых тотемов бензина и других крупных знаков по-прежнему широко используются лопаточные дисплеи, состоящие из отражающих свет сегментов (или «лопаток»), перевернутых с помощью электромагнита. Альтернативой 7-сегментному дисплею в 1950–1970-х годах была неоновая лампа с холодным катодом никси-лампа. Начиная с 1970 года RCA продавала устройство отображения, известное как Numitron, в котором использовались нити накаливания, расположенные в виде семисегментного дисплея. В СССР первый электронный калькулятор «Вега», выпускавшийся с 1964 года, содержал 20 десятичных знаков с семисегментным электролюминесцентным дисплеем.

В простом светодиодном корпусе, как правило, все катоды (отрицательные клеммы) или все аноды (положительные клеммы) сегментных светодиодов подключены и выведены на общий вывод; это называется устройством с «общим катодом» или «общим анодом». Следовательно, для пакета из 7 сегментов плюс десятичная точка потребуется только девять контактов, хотя коммерческие продукты обычно содержат больше контактов и / или пробелов в местах расположения контактов, чтобы соответствовать стандартным разъемам IC. Также существуют интегрированные дисплеи с одной или несколькими цифрами. Некоторые из этих интегрированных дисплеев имеют собственный внутренний декодер, но большинство из них не имеют: каждый отдельный светодиод выведен на соединительный контакт, как описано.

Многоразрядные светодиодные дисплеи, используемые в карманных калькуляторах и аналогичных устройствах, мультиплексированные дисплеи для уменьшения количества контактов ввода / вывода, необходимых для управления дисплеем. Например, все аноды сегментов A каждой позиции цифры будут подключены вместе и к выводу схемы драйвера , в то время как катоды всех сегментов для каждой цифры будут подключены. Чтобы управлять любым конкретным сегментом любой цифры, управляющая интегральная схема должна включать катодный драйвер для выбранной цифры и анодные драйверы для желаемых сегментов; затем после короткого интервала гашения будет последовательно выбираться следующая цифра и светиться новые сегменты. Таким образом, восьмиразрядный дисплей с семью сегментами и десятичной точкой потребует только 8 катодных драйверов и 8 анодных драйверов вместо шестидесяти четырех драйверов и выводов IC. Часто в карманных калькуляторах линии ввода цифр также используются для сканирования клавиатуры, обеспечивая дополнительную экономию; однако одновременное нажатие нескольких клавиш приведет к странным результатам на мультиплексном дисплее.

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

Один байт может кодировать полное состояние 7-сегментного дисплея. Самые популярные битовые кодировки — это gfedcba и abcdefg, где каждая буква представляет определенный сегмент на дисплее. В представлении gfedcba байтовое значение 0x06 (в общей анодной схеме) включает сегменты «c» и «b», которые отображают «1».

Символы

Сетка 16 × 8, показывающая 128 состояний семисегментного дисплея

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

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

Сегменты 7-сегментного дисплея обозначаются буквами от A до G, где дополнительная десятичная точка («восьмой сегмент», обозначаемая как DP) используется для отображение нецелых чисел.

Десятичное

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

0 1 2 3 4 5 6 7 8 9

Цифры 6 и 9 также могут быть представлены без «хвоста», а цифра 7 — с «хвостом»:

6 7 9

В Unicode 13.0 10 кодовых точек имели дано для сегментированных цифр 0–9 в блоке Symbols for Legacy Computing, чтобы воспроизвести ранние компьютерные шрифты, которые включали семисегментные версии цифр. В рекомендации показан менее распространенный дизайн для 7. Здесь моделируются символы:

0 1 2 3 4 5 6 7 8 9 A B C D E F
U + 1FBFx 0 1 2 3 4 5 6 7 8 9

шестнадцатеричный

Четыре двоичных бита необходимы для указания чисел 0–9, но также можно указать 10–15, поэтому обычно декодеры с 4-битными входами также могут отображать шестнадцатеричные (шестнадцатеричные) цифры. Сегодня комбинация прописных и строчных букв обычно используется для A – F; это делается для получения уникальной однозначной формы каждой шестнадцатеричной цифры (в противном случае заглавная буква «D» выглядела бы идентично «0», а заглавная буква «B» была бы идентична «8»). Также цифра «6» должна отображаться с освещенной верхней полосой, чтобы избежать двусмысленности с буквой «b».

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

Отдельные сегменты семисегментного дисплея

Шестнадцатеричное кодирование для отображения цифр от 0 до F

Цифра Дисплей gfedcba abcdefg a b c d e f g
0 0 0x3F 0x7E on on on on on on
1 1 0x06 0x30 on on
2 2 0x5B 0x6D on on on on on
3 3 0x4F 0x79 on on on on on
4 4 0x66 0x33 on on on on
5 5 0x6D 0x5B on on on on on
6 6 0x7D 0x5F on on on on on on
7 7 0x07 0x70 on on on
8 8 0x7F 0x7F on on on on on on on
9 9 0x6F 0x7B on on on on on on
A A 0x77 0x77 on on on on on on
b b 0x7C 0x1F on on on on on
C C 0x39 0x4E on on on on
d d 0x5E 0x3D on on on on on
E E 0x79 0x4F on on on on on
F F 0x71 0x47 on on on on

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

  • Texas Instruments семисегментные микросхемы декодера дисплея 7446/7447/7448/7449 и 74246/74247/74248/74249 и Siemens В микросхемах FLH551-7448 / 555-8448 используются усеченные версии «2», «3», «4», «5» и «6» для цифр A – E. Цифра F (двоичный код 1111) была пуста.
  • Семисегментные микросхемы декодера Toshiba TC5002 и TC5022 повторяют цифры от 0 до 5 для цифр A – F. На них также отображается цифра 7 с дополнительным сегментом «f».
  • Советские программируемые калькуляторы, такие как Б3–34, использовали символы «-», «L», «C», «Г», «E» и «» (пробел), позволяющие отображать сообщение об ошибке EГГ0Г.
  • Многие более ранние микросхемы обеспечивали логику, предназначенную только для 0–9 и выше дают любую полученную картину. National Semiconductor MM74C912 отображал «o» для A и B, «-» для C, D и E и пробел для F. CD4511 просто отображал пробелы. MC14558 отображает цифру «1» в левой части дисплея (с использованием сегментов «e» и «f» вместо обычных «b» и «c»).
современный A b C d E F
TI, Siemens A B C D E F
Toshiba A B C D E F
Elektronika A B C D E F
National Semiconductor A B C D E F

Латинский алфавит

Большинство букв латинского алфавита можно разумно реализовать с использованием семи сегментов. Хотя не все буквы доступны, можно составить много полезных слов. Выбирая более качественные синонимы , можно обойти многие недостатки семисегментных кодировок алфавита. Некоторые буквы (‘O’, ‘I’, ‘S’) выглядят идентично числам, хотя вместо них можно использовать строчные буквы ‘o’ и ‘i’ или поставить ‘I’ слева, как показано здесь.. Кроме того, семисегментные дисплеи могут использоваться для отображения различных других букв латинского, кириллического и греческого алфавитов, включая знаки препинания, но немногие представления одновременно являются однозначными и интуитивно понятными. Когда все буквы необходимо отобразить на устройстве, лучше использовать экранные изображения с шестнадцатисегментной структурой и и матричные, чем с семисегментными.

Кодировки латинского алфавита

Регистр A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Верхний A C E F G H I J L O P S U
Нижний b c d h i n o q r t u y

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

Примеры:

O P En , CL O S E, P L A y , P A U S E, S H U F F L E, n o d 1 S C
S t A r t , S t o P , r un , F A IL , Er r o r , S Et U P , H EL P
o n , O F F , y ES , n o , H o t , Co L d

Пунктуация

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

Кодировки знаков препинания

Глиф Отображение Unicode Имя (я)
sp 0x0020 Пробел, пустой, все сегменты отключены
_ _ 0x005F Подчеркивание, нижнее тире, нижняя строка
- 0x002D Дефис-минус, минус, минус, дефис, Dash
‾ 0x203E Overline, Overscore, Overbar, Macron
= экв 0x003D Equals, Двойной дефис
⁼ 0x207C Надстрочный индекс «равно»
≡ 0x2261 Тройная черта, кнопка гамбургера, идентично
° ° 0x00B0 градус, надстрочный ноль
« " 0x0022 двойной цитата, Двойное простое число
' 0x0027 Апостроф, Одинарная кавычка, Простое число
(или [ [ 0x005B Круглая скобка, Скобка (конфликтует с заглавными буквами C )
) или] ] 0x005D Скобка, скобка
? ? 0x003F Знак вопроса

См. Также сегмент

7, 9, 14, 16 дисплеи отображаются рядом.

Есть также четырнадцатисегментные и шестнадцатисегментные дисплеи (для полного буквенно-цифрового ); однако в основном они были заменены точечно-матричными дисплеями. Дисплеи с двадцатью двумя сегментами, способные отображать полный набор символов ASCII, были кратко доступны в начале 1980-х, но не стали популярными.

  • Девятисегментный дисплей
  • Четырнадцатисегментный дисплей
  • Шестнадцатисегментный дисплей
  • Точечно-матричный дисплей
  • Дисплей с никкси-трубкой
  • Вакуумный флуоресцентный дисплей

Справочная информация

Внешние ссылки

  • Интерактивная демонстрация семисегментного дисплея
  • Связь семисегментного дисплея с микроконтроллером 8051
  • Взаимодействие семисегментного дисплея с Микроконтроллер AVR

   Введение 

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

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

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

Эксперименты с семисегментным индикатором

   Рассмотрим простейший случай управления индикатором – вывод одной цифры.  Схема для наших экспериментов приведена ниже. 

  Чтобы зажечь на индикаторе какую-то цифру нужно настроить порты, к которым подключен индикатор, в режим выхода, “открыть” транзистор (в данном случае подать на базу “единицу”) и установить в порту микроконтроллера её код.
  В зависимости от того, куда подключены сегменты индикатора – коды могут быть разные. Для нашего случая коды цифр будут выглядеть так.

unsigned char number[] =
{
  0x3f, //0
  0x06, //1
  0x5b, //2
  0x4f, //3  
  0x66, //4
  0x6d, //5
  0x7d, //6
  0x07, //7  
  0x7f, //8
  0x6f  //9   
};

   Используя десятичные цифры от 0 до 9 в качестве индекса массива, легко выводить в порт нужные коды.

Пример 1. Вывод цифр от 0 до 9


#include <ioavr.h>
#include <intrinsics.h>

unsigned char number[] =
{
  0x3f, //0
  0x06, //1
  0x5b, //2
  0x4f, //3  
  0x66, //4
  0x6d, //5
  0x7d, //6
  0x07, //7  
  0x7f, //8
  0x6f  //9   
};

unsigned char count = 0;
int main( void )
{
  //порт, к которому подкл. сегменты
  PORTB = 0xff;
  DDRB = 0xff;

  //вывод, к которому подкл. катод
  PORTD |= (1<<0);
  DDRD |= (1<<0);

  while(1){
    PORTB = number[count];
    count++;
    if (count == 10) count = 0;
    __delay_cycles(8000000);   
  }
  return 0;
}


Эта программа каждую секунду выводит значение переменной count на семисегментный индикатор. Индикация в данном случае — статическая.

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

Пример2. Вывод цифр от 0 до 99


#include <ioavr.h>
#include <intrinsics.h>

unsigned char number[] =
{
  0x3f, //0
  0x06, //1
  0x5b, //2
  0x4f, //3  
  0x66, //4
  0x6d, //5
  0x7d, //6
  0x07, //7  
  0x7f, //8
  0x6f  //9   
};

unsigned char
count = 0;

//числа для вывода на индикатор
unsigned char data1 = 2;
unsigned char data2 = 5;

int main( void )
{
  //порт, к которому подкл. сегменты
  PORTB = 0xff;
  DDRB = 0xff;

  //порт, к которому подкл. катод
  PORTD = 0;
  DDRD = (1<<1)|(1<<0);

  while(1){

    //гасим оба разряда
    PORTD &= ~((1<<1)| (1<<0));

    //выводим в порт код цифры
    //и зажигаем следующий разряд

    if (count == 0) {
      PORTB = number[data2];
      PORTD |= (1<<1);
    }
    if (count == 1) {
      PORTB = number[data1];
      PORTD |= (1<<0);
    }

        count++;

    if (count == 2) count = 0;

    //частота смены разрядов будет 100 Гц при кварце 8МГц

    __delay_cycles(800000);   
  } 
  return 0;
}


   Эта программа просто выводит любое поразрядно заданное число от 0 до 99.
   Частота смены разрядов семисегментного индикатора задается с помощью программной задержки __delay_cycles(). Это не самое удачное решение, потому что добавление каких-нибудь других задач в цикл while будет мешать выводу на индикатор. Давайте организуем смену разрядов индикатора с помощью аппаратного таймера/счетчика Т0

Пример3. Вывод цифр от 0 до 99. Смена разрядов выполняется в прерывании таймера


#include <ioavr.h>
#include <intrinsics.h>

unsigned char number[] =
{
  0x3f, //0
  0x06, //1
  0x5b, //2
  0x4f, //3  
  0x66, //4
  0x6d, //5
  0x7d, //6
  0x07, //7  
  0x7f, //8
  0x6f  //9   
};

//числа для вывода на индикатор
volatile unsigned char data1 = 0;
volatile unsigned char data2 = 0;

int main( void )
{
  //порт, к которому подкл. сегменты
  PORTB = 0xff;
  DDRB = 0xff;

  //порт, к которому подкл. катод
  PORTD = 0;
  DDRD |= (1<<1)|(1<<0);

  //инициализация таймера Т0
  //частота прерываний 100Гц при кварце 8МГц

  TIMSK = (1<<TOIE0);
  TCCR0 = (1<<CS02)|(0<<CS01)|(1<<CS00);
  TCNT0 =  0xb2;

  __enable_interrupt();
  while(1){
    //программный счетчик секунд
    data1++;
    if (data1 == 10) {
        data1 = 0;
        data2++;
        if (data2 == 10) data2 = 0;
    }
    __delay_cycles(8000000);   
  } 
  return 0;
}

//прерывания таймера Т0 — вывод на индикатор
#pragma vector = TIMER0_OVF_vect
__interrupt void Timer0_Ovf(void)
{
  static unsigned char count = 0;
  TCNT0 = 0xb2;

   //гасим оба разряда
   PORTD &= ~((1<<1)|(1<<0));

    //выводим в порт код цифры
    //и зажигаем следующий разряд

   if (count == 0) {
      PORTB = number[data2];
      PORTD |= (1<<1);
   }
   if (count == 1) {
      PORTB = number[data1];
      PORTD |= (1<<0);
   }

        count++;

    if (count == 2) count = 0;
}


   Переменные data1, data2  объявлены с ключевым словом volatile, потому что они используются и в основном коде и в прерывании.  В проекте  под GCC я забыл поставить его поставить, и компилятор выкинул обе переменные, посчитав их ненужными!

   Прерывания таймера происходят параллельно выполнению цикла while. Это позволяет выполнять в цикле какую-нибудь полезную задачу. В данном примере с помощью двух переменных  в цикле организован программный счетчик от 0 до 99.
   Использовать две восьмиразрядные переменные для организации счетчика от 0 до 99 неудобно и расточительно, ведь такой счетчик можно сделать и на одной переменной типа unsigned char. Хорошо, счетчик мы сделаем, а как вывести его значение на семисегментный индикатор? Нужен код “разбивающий” десятичное число на отдельные разряды и вот как он выглядит:

    //программный счетчик
    unsigned char counterProg = 35;

    //”разбиваем” значение счетчика на отдельные разряды
    data1 = counterProg % 10;
    data2 = counterProg/10;

data1 = counterProg % 10 – это операция деления по модулю 10 (деление с остатком). Результатом этого выражения будет остаток от деления переменной counterProg на 10, то есть для нашего случая  5.

counterProg/10 – это целочисленное деление на 10. Результатом этого выражения будет число 3.

Таким образом, в переменные data2, data1 будут записаны числа 3 и 5 соответственно, значение счетчика counterProg при этом не изменится.

Пример 4. Вывод цифр от 0 до 99.
Преобразование двоичных чисел в двоично-десятичные (BCD)


#include <ioavr.h>
#include <intrinsics.h>

unsigned char number[] =
{
  0x3f, //0
  0x06, //1
  0x5b, //2
  0x4f, //3  
  0x66, //4
  0x6d, //5
  0x7d, //6
  0x07, //7  
  0x7f, //8
  0x6f  //9   
};

//числа для вывода на индикатор
volatile  unsigned char data1 = 0;
volatile  unsigned char data2 = 0;

//программный счетчик секунд
unsigned char counterProg = 0;

int main( void )
{
  //порт, к которому подкл. сегменты
  PORTB = 0xff;
  DDRB = 0xff;

  //порт, к которому подкл. катод
  PORTD = 0;
  DDRD |= (1<<1)|(1<<0);

  //инициализация таймера Т0
  TIMSK = (1<<TOIE0);
  TCCR0 = (1<<CS02)|(0<<CS01)|(1<<CS00);
  TCNT0 =  0xb2;

  __enable_interrupt();
  while(1){
    //программный счетчик секунд
    counterProg++;
    if (counterProg == 100) counterProg = 0;
    data1 = counterProg % 10;
    data2 = counterProg/10;
    __delay_cycles(8000000);   
  } 
  return 0;
}

//прерывания таймера Т0 — вывод на индикатор
#pragma vector = TIMER0_OVF_vect
__interrupt void Timer0_Ovf(void)
{
  static unsigned char count = 0;
  TCNT0 = 0xb2;

   //гасим оба разряда
   PORTD &= ~((1<<1)|(1<<0));

   //выводим код цифры в порт
   //и зажигаем следующий разряд

   if (count == 0) {
      PORTB = number[data2];
      PORTD |= (1<<1);
   }
   if (count == 1) {
      PORTB = number[data1];
      PORTD |= (1<<0);
   }

        count++;

    if (count == 2) count = 0;
}


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

Функция инициализации

#define PORT_IND PORTB
#define DDR_IND DDRB
#define PORT_K PORTD
#define DDR_K DDRD
#define KAT1 0
#define KAT2 1

volatile  unsigned char data[2];

void IND_Init(void)
{
  //порт к которому подкл. сегменты
  PORT_IND = 0xff;
  DDR_IND = 0xff;

  //порт, к которому подкл. катоды
  PORT_K &= ~((1<<KAT2)|(1<<KAT1));
  DDR_K |= (1<<KAT2)|(1<<KAT1);

   //очистка буфера
   data[0] = 0;
   data[1] = 0;
}

Порты, к которым подключен семисегментный индикатор, определены с помощью директивы

#define – в будущем это позволит быстро править код. Вместо двух переменных data1, data2 удобнее использовать массив unsigned char data[2].

Функция преобразования

void IND_Conv(unsigned char value)
{
  unsigned char tmp;
  tmp = value % 10;
  data[0] =  number[tmp];
  tmp = value/10;
  data[1] =  number[tmp];
}

Процедура преобразования чисел аналогична описанной выше. Единственное отличие – в буфере (data[]) мы теперь сохраняем не результат преобразования, а коды цифр. Зачем делать в прерывании то, что можно сделать в основном цикле программы?

Функция вывода на индикатор

void IND_Update(void)
{
   static unsigned char count = 0;

   //гасим оба разряда
   PORT_K &= ~((1<<KAT2)|(1<<KAT1));

   //выводим в порт код цифры
   PORT_IND = data[count];  

   //зажигаем нужный разряд
   if (count == 0) PORT_K |= (1<<KAT1);
   if (count == 1) PORT_K |= (1<<KAT2);

          count++;

   if (count == 2) count = 0;
}

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

Пример 5. Код программы с использованием этих функций


//программный счетчик секунд
unsigned char counterProg = 0;

int main( void )
{
  IND_Init();

  //инициализация таймера Т0
  TIMSK = (1<<TOIE0);
  TCCR0 = (1<<CS02)|(0<<CS01)|(1<<CS00);
  TCNT0 =  0xb2;

  __enable_interrupt();
  while(1){
    counterProg++;
    if (counterProg == 100) counterProg = 0;
    IND_Conv(counterProg);
    __delay_cycles(8000000);   
  } 
  return 0;
}

//прерывания таймера Т0 – вывод на индикатор
#pragma vector = TIMER0_OVF_vect
__interrupt void Timer0_Ovf(void)
{
  TCNT0 = 0xb2;
  IND_Update();
}


И, наконец – разбиение программы на модули.

Создаем два файла – indicator.h и indicator.c. Сохраняем их в папке проекта.
В хидер файле у нас будут директивы условной компиляции, макроопределения и прототипы функций.

#ifndef INDICATOR_H
#define INDICATOR_H

#include <ioavr.h>

#define PORT_IND PORTB
#define DDR_IND DDRB
#define PORT_K PORTD
#define DDR_K DDRD
#define KAT1 0
#define KAT2 1

void
IND_Init(void);
void IND_Conv(unsigned char value);
void IND_Update(void);

#endif //INDICATOR_H

В сишном файле –

#include “indicator.h”,  объявления переменных  и реализация трех функций. Функции описаны выше, поэтому здесь их не привожу.

Подключаем файл indicator.c к проекту.
В файл main.c инклюдим заголовочный файл нашего драйвера семисегментного индикатора  —

#include “indicator.h”

Все. Теперь мы можем использовать функции для работы с индикатором в файле main.
Полный код драйвера смотрите в проектах.

Продолжение следует… Скоро будет дополнение к этой статье —  описание вольтметра на микроконтроллере – в проекте используется 4-ех разрядный семисегментный индикатор.

Файлы

Понравилась статья? Поделить с друзьями:
  • Как пишется семинарная работа
  • Как пишется семинар или симинар
  • Как пишется семинар или сименар
  • Как пишется семимесячный
  • Как пишется семиместный