Андрей Смирнов
Время чтения: ~24 мин.
Просмотров: 0

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

КОД

#define F_CPU 1000000L

#include <avr/io.h>

#include <util/delay.h>

#define CHISLO PORTD

#define RAZRIAD PORTB

unsigned int razr1 = 0, razr2 = 0, razr3 = 0, razr4 = 0;

unsigned int chisla = {

       // числа от 0 до 10

       0x3f, 0x6, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x7, 0x7f, 0x6f

       };

void vse_chislo (unsigned int rabivka_chisla)

{

       razr1 = rabivka_chisla/1000;            // тысячи

       razr2 = rabivka_chisla%1000/100;  // сотни

       razr3 = rabivka_chisla%100/10;          // десятки

       razr4 = rabivka_chisla%10;              // единицы

}

int main(void)

{

    DDRB = 0b00001111;

    DDRD = 0b11111111;

    RAZRIAD = 0b00000001; // изначально 1-й разряд

    CHISLO = 0x3f;               // число 0

    while (1)

    {

             vse_chislo(1987);     // отображаемое число

              RAZRIAD = 0b00000001; // включаем 1-й разряд, остальные выключаем

             CHISLO = chisla ; // отображаем 1-ю цифру

             _delay_ms(3);

             RAZRIAD = 0b00000010; // включаем 2-й разряд, остальные выключаем

             CHISLO = chisla ; // отображаем 2-ю цифру

             _delay_ms(3);

             RAZRIAD = 0b00000100; // включаем 3-й разряд, остальные выключаем

             CHISLO = chisla ; // отображаем 3-ю цифру

             _delay_ms(3);

             RAZRIAD = 0b00001000; // включаем 4-й разряд, остальные выключаем

             CHISLO = chisla ; // отображаем 4-ю цифру

             _delay_ms(3);

    }

}

Программируем с Ардуино: основы работы со скетчами

  • Информация о курсе
  • График
  • Вебинары
  • Отзывы

Темы

Кол-во академ. часов

Что такое ARDUINO IDE. Разновидности ARDUINO и принципы работы. Робототехника и мехатроника (основные понятия). Знакомство с платформой ARDUINO. Аппаратная часть. Знакомство с набором АМПЕРКА и подбор комплектующих ARDUINO IDE

Составление технологической карты. Составление простых программ для ARDUINO. Микроконтроллеры Atmel

2

Среда программирования ARDUINO и (интерфейсы программирования). Мозговой штурм. Разработка системы. Написание руководства для учителя и карточки учащегося

2

Запускаем первую программу. Анализируем программу (Blink) Подключение внешнего светодиода. Работа с макетной платой. Закон Ома и формула для расчёта мощности

2

Работа с экраном. ARDUINO. Работа со звуком. Программные структуры ARDUINO. Структура «переключатель»

2

Двигатель постоянного тока. Борьба с выбросами напряжения. Использование транзистора в качестве переключателя. Написание схемотехники для ARDUINO

2

2

Методика организации проектной работы с использованием ARDUINO и Матрешка Z. Мозговой штурм для формулирования темы проекта

2

История создания протокола I²C. Особенности написания программ. Аппаратная реализация. Знакомство со средой программирования ROBOTC

2

Взаимодействие и идентификация устройств. Общие сведения о протоколе SPI.Библиотека LiquidCristal. Отображение данных на ЖК –

2

2

Робототехника и мехатроника в учебном процессе. Интегрирование на уроках физики и информатики

2

Рассмотрение методик. Мозговой штурм для формулирования темы проекта. Подведение итогов. Творческое задание для самостоятельного выполнения

2

Итого:

24

Данный курс доступен в режиме офлайн. Просмотреть можно в любое удобное для Вас время.

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

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

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

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

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

Базилик

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

Изготовление

Изготовление индикатора начинают с нарезки трубочек длиной 77 мм Затем формуют выводы светодиодов — руководствуясь расположением их на платах, показанным на рис. 3, сгибают выводы под прямым углом на расстоянии примерно 2 5…3 мм от корпуса (вывод катода HL14 сгибают на расстоянии, большем на 5 мм).

В завершение корпусы светодиодов плотно вставляют в предварительно развальцованные металлическим стержнем концы трубочек с таким расчетом, чтобы концы выводов были направлены в одну сторону. После монтажа элементов к печатным платам припаивают отрезки гибкого монтажного провода, которые будут служить выводами индикатора А-G и +U.

Рис. 4. Коробчатая рамка.

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

Заготовку вырезают из тонкого (толщиной 0.25 — 0.4 мм) плотного картона (например, электрокартона марки ЭВ). Места сгиба показаны на чертеже тонкими штриховыми линиями. места разреза — утолщенными линиями Для того чтобы внутренние стенки удерживались в согнутом состоянии, между ними вклеивают прямоугольные пластины из того же материала.

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

Д. Мамичев. Р-2010-05.

Какой необходим максимальный уровень для счастья дофамина и как он вырабатывается?

Реализации

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

Характеристики часов

  • формат отображения времени: часы, минуты;
  • будильник с функцией повтора;
  • простое управление с помощью 2 кнопок;
  • поддержка работы от батарейки;
  • напряжение питания: 7…12В / 0,2 A;
  • размеры двух печатных плат: 60×21 мм, 58×44 мм.

Принципиальная схема часов показана на рисунке ниже. Схема часов должна быть запитана постоянным напряжением в диапазоне  7…12В.  Это может быть любой блок питания с нагрузкой по току не менее 200 мА.

Диод VD1 (1N4007) защищает схему от неправильной полярности подключения входного питания. Внешнее входное напряжение подается на стабилизатор DA1 (), а конденсаторы C3…C7 выполняют роль фильтра питания.

Работой часов управляет микроконтроллер Atmega8, а в качестве часов реального времени применена микросхема типа PCF8583. Связь PCF8583 с микроконтроллером осуществляется через I2C интерфейс.

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

К разъему CON5 платы можно подключить зуммер с генератором, который будет выступать в качестве звукового сигнала будильника. К клеммам SA1 и SA2 печатной платы подключаются кнопки, которые служат для ввода настроек и обслуживания часов.


Многофункциональные часы — будильникНабор для сборки. Большой светодиодный дисплей, температура…


Светодиодные часы на DS3231Набор для сборки часов. Цветной дисплей, датчик света, сенсорное…

Подключение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Распиновка 4 разрядного 7 сегментного индикатора

Распиновка сегментов индикатора, состоящего из четырех символов ничем не отличается от одно символьного семисегментного индикатора Ардуино. Отличие модуля в количестве разрядов (символов) — каждый разряд включается отключением питания от соответствующего катода. Таким образом все светодиоды одного сегмента в разрядах (например, A-A-A-A) подключены параллельно к общему катоду.


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

С включением сегмента довольно просто разобраться. Разберем небольшой пример. Изначально на все 4 разряда (D1, D2, D3, D4) подано напряжение. Чтобы включить сегмент A на втором символе, необходимо на ножку A (анод) подать напряжение. Но сегмент не загорится, пока мы не отключим напряжение у ножки D2. Таким образом можно включать любой светодиод на модуле 7 сегментного индикатора.

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

Камрад, рассмотри датагорские рекомендации

Внимание! 800 рублей для новичков на Aliexpress Регистрируйтесь по нашей ссылке. Если вы впервые на Aliexpress — получите 800.00₽ купонами на свой первый заказ.. Цифровой осциллограф DSO138

Кит для сборки

Цифровой осциллограф DSO138. Кит для сборки

Функциональный генератор. Кит для сборки

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

Иван Внуковский (if33)
Украина, г. Днепропетровск
Список всех статей

Профиль if33

Радиолюбитель, стаж более 40 лет. Работал на заводе инженером КБ, инженером по обслуживанию ЭВМ, механиком по ремонту бытовой техники. Сейчас на пенсии.

Схема

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

Светодиоды HL1 -HL14 — сверхъяркие зеленого цвета свечения в прозрачных корпусах диаметром 5 мм. например, LDGL3333, LDGM3333. LDGM3343 фирмы LIGITEK. Минимальный ток необходимый для одновременного свечения всех элементов индикатора — примерно 25 мА прямое падение напряжения на каждом элементе — около 6 В.

Рис. 2. ПРинципиальная схема сегмента индикатора.

Основа конструкции индикатора — две печатные платы, чертежи которых показаны на рис. 3. На первой из них (по рисунку — левой) монтируют элементы В и С на второй — Е и F (согласно общепринятой маркировке показанной на рис 1, 6) Элементы А D G и соединительные перемычки устанавливают между платами.

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

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

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

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

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

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

Вывод clock (1) рекомендуется снабдить стягивающим резистором для избежания ложных срабатываний. Для сброса счетчика подается импульс на вход reset clock (15). На пины enable display (3) должен подаваться сигнал HIGH, иначе все выводы окажутся выключенными.

Если вы не собираетесь включать и выключать отображение цифр на индикаторе — просто подключите этот вывод к рельсе питания. К пину 16 следует подключить питание. Пины disable clock (2) и 0V (8) подключаются к земле.

У драйвера 7 выходов (a, b, c, d, e, f, g) для подключения к соответствующим ножкам индикатора через токоограничительные резисторы. Особого внимания заслуживает выход ÷10 output (5).

Микросхема работает на частоте 16 МГц, за счет чего изменение напряжения на выходах, а, соответственно, и изображения на индикаторе происходит очень быстро, и его нельзя заметить невооруженным глазом.

Распиновка микросхемы CD4026

Схема подключения семисегментного индикатора LD-5161AG

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

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

Выводы микросхемы 6,7 и с 9 по 13 соединить с выводами семисегментного индикатора, ориентируясь на буквенный обозначения на схемах выше. Средние выводы индикатора — это общие катоды, их нужно подключить к рельсе земли.Вот так это должно выглядеть:

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

Семисегментный драйвер CD4026 с подключённым к нему семисегментным индикатором

Теперь загрузите в плату Arduino следующий код:

// Обнуляет текущее значение// Просто последовательно выдаём HIGH и LOW на вывод resetdigitalWrite(RESET_PIN, HIGH);digitalWrite(RESET_PIN, LOW);//Выводит на индикаторе переданное в параметрах число// Обнуляем текущее значение// «Помигаем» выводом счётчика до нужного значенияfor (byte i=0; i<n; i++) {digitalWrite(CLOCK_PIN, HIGH);digitalWrite(CLOCK_PIN, LOW);//Настраиваем выводы на выходpinMode(RESET_PIN, OUTPUT);pinMode(CLOCK_PIN, OUTPUT);// Обнуляем счётчик при старте// Получаем количество секунд с момента старта// и выводим его на индикаторыshowNumber((millis() / 1000) % 60);

Этот код отображает количество целых секунд, прошедших с момента запуска платы. То есть, отображает числа от 0 до 60. При одном подключённом индикаторе, вы увидите, что индикатор отображает только цифры от 0 до 9.

Семисегментный драйвер CD4026 отображает числа от 0 до 9

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

Вывод 1 «clock» не нужно подключать к контроллеру Arduino, просто подключите его к выводу 5 «÷10» первого драйвера. Этого достаточно, чтобы второй драйвер начал отображать десятки на подключённом к нему индикаторе.

Выводы 15 «reset» обоих драйверов должны быть соединены между собой.

Теперь наш счётчик показывает 2 разряда,а вы восхитительны!

Таким образом можно множить цепочку индикаторов до бесконечности. Управлять всем этим по прежнему будут всего 2 вывода контроллера.

Трехразрядные устройства

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

Тетроды в данном случае пороговое напряжение обязаны выдерживать на уровне 15 В. Проводимость их зависит от частотности конденсаторов. Многие специалисты при сборе часов советуют преобразователи устанавливать с тиристором. В данном случае блок питания можно использовать без усилителя. Для подключения индикаторов понадобятся проводники. Для безопасного использования прибора их необходимо изолировать.

Hardware

  • Osoyoo UNO Board (Fully compatible with Arduino UNO rev.3) x 1
  • 8×8 LED Matrix x 1
  • 10k ohm Potentiometer x2
  • M/M Jumpers
  • Breadboard x 2
  • USB Cable x 1
  • PC x 1

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

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

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

Объяснение работы программы

Программа для рассматриваемой схемы представлена следующим фрагментом кода. Комментарии к коду программы поясняют принцип работы отдельных команд.

C++

#include <avr/io.h> // заголовок чтобы разрешить контроль данных на контактах
#define F_CPU 1000000 // задание тактовой частоты
#include <util/delay.h> // заголовок чтобы задействовать функции задержки в программе
int main(void)
{
DDRB = 0x00; // установка portB в режим ввода данных
DDRA = 0xFF; // установка porta в режим вывода данных
DDRD = 0b11111111; // установка portd в режим вывода данных
int DISPLAY1 = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67};
// значения символов на дисплее в диапазоне 0-9
int c = 0;
int i=0;
int d = 0;
int one = 0; // память (переменная) для хранения числа единиц
int ten =0; // память (переменная) для хранения числа десятков
while(1)
{
if (bit_is_clear(PINB,0)) // когда кнопка 1 нажата
{
if (i<21)
{
i++; // увеличение целого числа ‘i’ на единицу если оно меньше 21
}
}
if (bit_is_clear(PINB,1)) // когда кнопка 2 нажата
{
if (d<21)
{
d++; // увеличение целого числа ‘d’ на единицу если оно меньше 21
}
}
if (i>20) // если ‘i’ было выполнено более чем 21 раз
{
if (c<99) // если значение счетчика меньше 99
{
c++; // увеличение значения счетчика
}
i=0; // присваиваем i ноль
}
if (d>20) // если ‘d’ было выполнено более чем 21 раз
{
if (c>0) // если значение счетчика больше чем 0
{
c—; // уменьшение значения счетчика на 1
}
d=0; // присваиваем d ноль
}
if (c<10) // если значение счетчика меньше 10
{
one = c; // числу единиц присваиваем значение счетчика
ten = 0; // числу десятков присваиваем 0 поскольку c<10
}
if (c>=10) // если значение счетчика больше или равно 10
{
ten = c/10; // вычисляем значение числа десятков
one = c-(ten*10); // вычисление числа единиц
}
PORTD |=(1<<PIND6); // включаем второй транзистор (отображение числа единиц)
PORTA = DISPLAY1; // записываем в porta соответствующее значение для отображения его на дисплее
_delay_ms(10); // задержка 10 мс
PORTD &=~(1<<PIND6); // выключаем второй транзистор
PORTD |=(1<<PIND5); // включаем первый транзистор (отображение числа десятков)
PORTA = DISPLAY1; // записываем в porta соответствующее значение для отображения его на дисплее
_delay_ms(10);
PORTD &=~(1<<PIND5);// выключаем первый транзистор
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67

#include <avr/io.h> // заголовок чтобы разрешить контроль данных на контактах
#define F_CPU 1000000   // задание тактовой частоты
#include <util/delay.h> // заголовок чтобы задействовать функции задержки в программе

intmain(void)

{

DDRB=0x00;// установка portB в режим ввода данных

DDRA=0xFF;// установка porta в режим вывода данных

DDRD=0b11111111;// установка portd в режим вывода данных

intDISPLAY110={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67};

// значения символов на дисплее в диапазоне 0-9

intc=;

inti=;

intd=;

intone=;// память (переменная) для хранения числа единиц    

intten=;// память (переменная) для хранения числа десятков    

while(1)

{

if(bit_is_clear(PINB,))// когда кнопка 1 нажата

{

if(i<21)

{

i++;// увеличение целого числа ‘i’ на единицу если оно меньше 21

}

}

if(bit_is_clear(PINB,1))// когда кнопка 2 нажата

{

if(d<21)

{

d++;// увеличение целого числа ‘d’ на единицу если оно меньше 21

}
}

if(i>20)// если ‘i’ было выполнено более чем 21 раз

{

if(c<99)// если значение счетчика меньше 99

{

c++;// увеличение значения счетчика

}

i=;// присваиваем i ноль

}

if(d>20)// если ‘d’ было выполнено более чем 21 раз

{

if(c>)// если значение счетчика больше чем 0

{

c—;// уменьшение значения счетчика на 1

}

d=;// присваиваем d ноль

}

if(c<10)// если значение счетчика меньше 10

{

one=c;// числу единиц присваиваем значение счетчика

ten=;// числу десятков присваиваем 0 поскольку c<10  

}

if(c>=10)// если значение счетчика больше или равно 10

{

ten=c10;//  вычисляем значение числа десятков

one=c-(ten*10);// вычисление числа единиц

}

PORTD|=(1<<PIND6);// включаем второй транзистор (отображение числа единиц)

PORTA=DISPLAY1one;// записываем в porta соответствующее значение для отображения его на дисплее

_delay_ms(10);// задержка 10 мс

PORTD&=~(1<<PIND6);// выключаем второй транзистор

PORTD|=(1<<PIND5);// включаем первый транзистор (отображение числа десятков)

PORTA=DISPLAY1ten;// записываем в porta соответствующее значение для отображения его на дисплее

_delay_ms(10);

PORTD&=~(1<<PIND5);// выключаем первый транзистор

}
}

Алгоритм написания кода для подключения динамической индикации

Для большей конкретизации действий будем применять 4-х разрядный семисегментный индикатор с общим катодом. Первым делом следует создать массив цифр от 0 до 9. Этому мы уже научились ранее, вот здесь. Далее необходимо разбить 4-х значное число на четыре отдельных цифры. Например, число 1987 нужно разбить на 1, 9, 8 и 7. Затем единицу нужно отобразить в первом разряде индикатора, девятку – во втором, восьмерку – в третьем и семерку – в четвертом.

Среди многих алгоритмов разбивки многозначного числа на отдельные числа мы воспользуемся операциями деления и остатком от деления. Рассмотрим пример:

1987/1000 → 1

1987%1000/100 → 9

1987%100/10 → 8

1987%10 → 7

В языке С при использовании целочисленного типа данных int при выполнении деления все десятые, сотые и т. д., то есть все числа меньше единицы отбрасываются. Остаются только целые числа. Математическое округление здесь не работает, то есть 1,9 в данном случае будет 1, а не 2.

Команда «остаток от деления» обозначается знаком процента «%». Данная команда отбрасывает все целые числа и оставляет остальную часть числа. Например, 1987%1000 → 987; 1987%100 → 87; 1987%10 → 7.

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

Рейтинг автора
5
Материал подготовил
Максим Иванов
Наш эксперт
Написано статей
129
Ссылка на основную публикацию
Похожие публикации