Семисегментный индикатор. Arduino и четырехразрядный семисегментный индикатор 4 разрядный индикатор ардуино подключение

Семисегментный индикатор. Arduino и четырехразрядный семисегментный индикатор 4 разрядный индикатор ардуино подключение
Семисегментный индикатор. Arduino и четырехразрядный семисегментный индикатор 4 разрядный индикатор ардуино подключение

Доброго времени суток! После моего затяжного и вынужденного перерыва, продолжим освоение курса «Программирование Ардуино». В одном из наших предыдущих уроков, мы уже работали с последовательностью светодиодов, теперь пора переходить к следующему этапу обучения. Темой сегодняшней статьи будет – 7-сегментный индикатор.

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

Прошлый раз мы работали с последовательностью из 8 светодиодов, сегодня их также будет 8 (7 – светодиодных полосок и 1 точка). В отличии от предыдущей последовательности, элементы этого набора не выстроенные в ряд (друг за дружкой), а расположены в определённом порядке. Благодаря чему используя лишь один компонент можно вывести 10 цифр (от 0 до 9).

Еще одно существенное отличие, что выделяет данный индикатор на фоне простых светодиодов. У него общий катод (вернее две равноценные ножки 3 и 8, на который заведен катод). Достаточно всего лишь соединить один из катодов с землей (GND ). Аноды у всех элементов индикатора индивидуальные.

Небольшое отступление. Все выше сказанное относится к 7-сегментным индикаторам с общим катодом. Однако существуют индикаторы с общим анодом. Подключение таких индикаторов имеет существенные отличия, поэтому прошу не путать «грешное с праведным». Необходимо четко понимать, какой именно тип семисегментника у вас в руках!

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

Надеюсь, вы не забыли об необходимости использования токоограничивающих резисторов при подключении светодиодов. Это же относится и к индикаторам: на каждый элемент индикатора должен быть подключен свой резистор. 8 элементов (7 + 1) – 8 резисторов.

У меня под рукой оказался семисегментник с маркировкой 5161AS (общий катод). Распиновка контактов:



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

Как говорил ранее, для того, чтобы включить сегмент «А» подключим к любому общему контакту (3 или 8) «землю», а на вывод 7 подадим 5В питания. Если индикатор с общим анодом, то на анод подаём 5В, а на вывод сегмента «землю»!

Соберём тестовый стенд. Соединяем провода по порядку, начиная с первой ножки, которая идёт на 2-й вывод платы Ардуино. Землю подключим к 8 выводу индикатора.

После того, как стенд собран можно приступать к написанию прошивки.

Для проверки индикатора запустим написанную программу. Выберем элемент «А» и помигаем им.


Теперь помигаем цифрой 2. Для этого включим еще несколько элементов.

Чтобы вывести одну цифру, нужно написать n-число строчек кода. Затруднительно, не находите.

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

Таблица соответствия.

Если у дисплея общий анод, то 1 нужно заменить на 0, а 0 – на 1!

Столбец hex – представление цифры в байтовом виде (более детально поговорим об этом во второй части).

Число в двоичной системе счисления записывается следующим образом: 0b00000000. 0b – двоичная система. Нули означают, что все светодиоды выключены.

При подключении мы задействовали выводы с 2 по 9. Чтобы включить 2 вывод записываем в него единицу = 0b00000001. За точку отвечает четвёртый бит справа. За чёрточку посередине индикатора отвечает самый последний бит.

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

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

Примечание: функция bitRead() считывает состояние указанного бита и возвращает значение состояния (0 или 1). bitRead(x, n) где, x — число, бит которого необходимо считать; n — номер бита, состояние которого необходимо считать. Нумерация начинается с младшего значащего бита (крайнего правого) с номером 0.

И в завершении первой части напишем небольшой счетчик.

Подключим семисегментный светодиодный индикатор к плате Ардуино и научимся управлять им с помощью библиотеки Led4Digits.h.

В предыдущем уроке подробно описаны к микроконтроллерам. Подключим такой индикатор к плате Ардуино.

Схема подключения индикатора к плате Ардуино выглядит так.

Я собрал ее на монтажной плате.

Для управления индикаторами я написал библиотеку Led4Digits.h:

И оплатите.

Библиотека позволяет управлять семисегментными индикаторами:

  • размерностью до четырех разрядов;
  • с любыми вариантами полярностей управляющих импульсов (все );
  • работает в параллельном процессе;
  • позволяет выводить на индикатор:
    • сегменты каждого разряда;
    • цифру каждого разряда;
    • целое число 0 … 9999;
  • для вывода целого числа может быть задано число разрядов;
  • есть режим гашения незначащих разрядов.

Загрузить библиотеку Led4Digits.h можете по этой ссылке:

И оплатите. Всего 40 руб. в месяц за доступ ко всем ресурсам сайта!

Как устанавливать написано в .

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

Библиотека управления LED индикаторами для Ардуино Led4Digits.

Вот описание класса. Я привел только public методы и свойства.

class Led4Digits {
public:
byte digit; // коды управления сегментами разрядов
void regen(); // регенерация, метод должен вызываться регулярно
void tetradToSegCod(byte dig, byte tetrad); // преобразования тетрады в коды сегментов
boolean print(unsigned int value, byte digitNum, byte blank); // вывод целого числа



} ;

Конструктор.

Led4Digits (byte typeLed, byte digitPin0, byte digitPin1, byte digitPin2, byte digitPin3,
byte segPinA, byte segPinB, byte segPinC, byte segPinD,
byte segPinE, byte segPinF, byte segPinG, byte segPinH);

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

typeLed Выбор разряда Выбор сегмента Тип схемы
0 -_- -_- Общий анод с ключами выбора разряда
1 _-_ -_- Общий анод
2 -_- _-_ Общий катод
3 _-_ _-_ Общий катод с ключами выбора разряда

digitPin0 … digitPin3 – выводы выбора разрядов. Если digitPin = 255, то разряд отключен. Это позволяет подключать индикаторы с меньшим количеством разрядов. digitPin0 – младший (правый) разряд.

segPinA … segPinH – выводы управления сегментами.

Например,

означает: тип индикатора 1; выводы разрядов 5,4,3,2; выводы сегментов 6,7,8,9,10,11,12,13.

Метод void regen()

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

Например,

// обработчик прерывания 2 мс
void timerInterrupt() {
disp.regen(); // регенерация индикатора
}

Массив byte digit

Содержит состояние сегментов. digit это младший разряд, младший бит digit это сегмент ”A” младшего разряда. Состояние бита равное 1, означает, что сегмент светится.

Например,

digit = B0000101;

означает, что во втором разряде светятся сегменты ”A” и ”C”.

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

// бегущие сегменты
#include
#include

//
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

void setup() {
прерывание по таймеру 2 мс
MsTimer2::start(); // разрешение прерывания
}

void loop() {
for (int i = 0; i < 32; i++) {
if (i == 0) disp.digit= 1;
else if (i == 8) disp.digit= 1;
else if (i == 16) disp.digit= 1;
else if (i == 24) disp.digit= 1;
else {
disp.digit = disp.digit << 1;
disp.digit = disp.digit << 1;
disp.digit = disp.digit << 1;
disp.digit = disp.digit << 1;
}
delay(250);
}
}

// обработчик прерывания 2 мс
void timerInterrupt() {
disp.regen(); // регенерация индикатора
}

В массиве digit сдвигается 1 и индикаторы отображают это.

Метод void tetradToSegCod(byte dig, byte tetrad)

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

  • dig – номер разряда 0 … 3;
  • tetrad – десятичный код символа. Код 0 отобразит цифру ”0”, код 1 - цифру ”1”, код 14 - букву ”E”.

Например,

tetrad(2, 7);

выведет цифру “7” в третьем разряде.

Пример программы меняющей символы в каждом разряде по очереди.

// цифры по очереди
#include
#include

// тип индикатора 1; выводы разрядов 5,4,3,2; выводы сегментов 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

void setup() {
MsTimer2::set(2, timerInterrupt); // прерывание по таймеру 2 мс
MsTimer2::start(); // разрешение прерывания
}

void loop() {
for (int i = 0; i < 64; i++) {
disp.tetradToSegCod(i>>4, i);
delay(250);
}
}

// обработчик прерывания 2 мс
void timerInterrupt() {
disp.regen(); // регенерация индикатора
}

Метод boolean print(unsigned int value, byte digitNum, byte blank)

Метод выводит на индикаторы целое число. В нем двоичное число преобразуется в двоично-десятичный код для каждого разряда. Имеет аргументы:

  • value – число, которое выводится на индикатор.
  • digitNum – количество разрядов для числа. Не надо путать с количеством разрядов индикатора. Вы можете захотеть вывести число на 2х разрядах, а на остальных двух отобразить символы, используя digit.
  • blank – признак гашения незначащих разрядов. blank=0 означает, что число должно отображаться со всеми нулями. Число ”7” будет выглядеть “0007”. При blank, отличном от 0 незначащие нули будут гаситься.

Если число value превышает допустимое для выбранного количества разрядов (digitNum), то функция отобразит на индикаторе ”---” и вернет false.

Пример программы вывода чисел.

// вывод числа
#include
#include

// тип индикатора 1; выводы разрядов 5,4,3,2; выводы сегментов 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

void setup() {
MsTimer2::set(2, timerInterrupt); // прерывание по таймеру 2 мс
MsTimer2::start(); // разрешение прерывания
}

void loop() {
for (int i = 0; i < 12000; i++) {
disp.print(i, 4, 1);
delay(50);
}
}

// обработчик прерывания 2 мс
void timerInterrupt() {
disp.regen(); // регенерация индикатора
}

Последние два метода не меняют состояния сегмента ”H” – децимальной точки. Чтобы изменить состояние точки можно использовать команды:

digit |= 0x80; // зажечь децимальную точку
digit &= 0x7f; // погасить децимальную точку

Вывод на индикаторы отрицательных чисел (int).

Вывод отрицательных чисел можно производить следующим образом:

  • Проверить знак числа.
  • Если число отрицательное, то напечатать на старшем разряде знак минус и в функции print() изменить знак числа на положительный.
  • Если число положительное, то погасить разряд знака и вывести число функцией print().

Вот программа, которая демонстрирует такой способ. Она выводит числа от -999 до 999.

// вывод отрицательных чисел
#include
#include

// тип индикатора 1; выводы разрядов 5,4,3,2; выводы сегментов 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

void setup() {
MsTimer2::set(2, timerInterrupt); // прерывание по таймеру 2 мс
MsTimer2::start(); // разрешение прерывания
}

void loop() {

for (int i = -999; i < 1000; i++) {

if (i < 0) {
// число отрицательно
disp.digit= B01000000; // знак -
disp.print(i * -1, 3, 1);
}
else {
disp.digit= B00000000; // гашение знака
disp.print(i, 3, 1);
}

delay(50);
}
}

// обработчик прерывания 2 мс
void timerInterrupt() {
disp.regen(); // регенерация индикатора
}

Вывод на индикаторы дробных чисел, формат float.

Для вывода на индикаторы чисел с плавающей запятой (float) существует много способов с использованием стандартных функций языка C. Это, прежде всего, функция sprint(). Работает очень медленно, требует дополнительных преобразований кодов символов в двоично-десятичные коды, надо из строки выделять точку. С другими функциями те же проблемы.

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

  • Число с плавающей запятой умножается на 10 в степени соответствующей требуемому числу знаков после запятой. Если вам необходимо на индикаторы выводить 1 знак после запятой, умножаете на 10, если 2, то умножаете на 100, 3 знака – на 1000.
  • Далее число с плавающей запятой явно преобразуется в целое (int) и выводится на индикаторы функцией print().
  • В нужном разряде ставится точка.

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

float x = 2.12345;

disp.digit |= 0x80; //

Мы умножаем число на 100, а поставив точку в третьем разряде, делим результат на 100.

Вот программа, выводящая на индикаторы числа с плавающей запятой от 0.00 до 99.99.

// вывод чисел с плавающей запятой
#include
#include

// тип индикатора 1; выводы разрядов 5,4,3,2; выводы сегментов 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

void setup() {
MsTimer2::set(2, timerInterrupt); // прерывание по таймеру 2 мс
MsTimer2::start(); // разрешение прерывания
}

void loop() {
float x = 0;

for (int i = 0; i < 10000; i++) {
x += 0.01;

disp.print((int)(x * 100.), 4, 1);
disp.digit |= 0x80; // зажечь точку третьего разряда

delay(50);
}
}

// обработчик прерывания 2 мс
void timerInterrupt() {
disp.regen(); // регенерация индикатора
}

Как видите, библиотека Led4Digits.h значительно упрощает работу с семисегментыми светодиодными (LED) индикатороми, подключенными к плате Ардуино. Аналога такой библиотеки я не нашел.

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

В отличие от аналогов библиотека Led4Digits.h:

  • Работает параллельным процессом. В основном цикле программа загружает данные в определенные переменные, которые автоматически, отображаются на дисплее. Вывод информации и регенерация индикаторов происходят в прерывании по таймеру, незаметно для основной программы.
  • Цифры дисплея светятся равномерно, без миганий. Это свойство обеспечивается тем, что регенерация происходит в цикле, строго заданном прерыванием по таймеру.
  • Библиотека имеет компактный код, выполняется быстро, минимально нагружает контроллер.

В следующем уроке подключим к плате Ардуино одновременно светодиодный индикатор и матрицу кнопок. Напишем библиотеку для такой конструкции.

Рубрика: . Вы можете добавить в закладки.

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

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

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

И вот в начале двадцатого века, с появлением электронных ламп появились первые газоразрядные индикаторы

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

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

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

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

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

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

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

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

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

Обратите внимание, что трехзначный частотомер может указывать максимальные частоты 999 Гц при использовании односекундной базы, 99 кГц при использовании 100 мс временной базы, 9 кГц при использовании временной базы 10 мс и 999 кГц при использовании 1 мс временной базы.

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

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

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

Несколько мгновений спустя переключатель переходит в положение 3, заставляя дисплей 3 отображать число через несколько минут, весь цикл начинает повторяться снова и так далее, добавляя бесконечность. На практике около 50 из этих циклов происходят каждую секунду, поэтому глаз не видит, что дисплеи включаются и выключаются отдельно, но воспринимают их как явно устойчивый дисплей, который показывает номер 327, или какой-либо другой номер продиктован сегментом данные.

Если рассмотреть схему одиночного семисегментного индикатора, то она выглядит вот так:

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

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

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

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

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

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

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

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

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

Управление 7-сегментным дисплеем

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

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

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

Подсчет в шестнадцатеричном виде на одном 7-сегментном дисплее

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

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

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

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

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

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

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

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

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

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

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

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

К сожалению, есть проблема, потому что для отображения необходимо восемь портов - четыре объявления потребуют 32 порта. Но есть несколько путей. Сдвиговые регистры уже описаны в другом учебнике. Это упростило бы создание требуемых 32 выходных линий только с тремя выводами. Принцип управления не отличается от управления одним 7-сегментным дисплеем, только то, как «выходные выводы» приближаются к их значениям, отличается и определяется использованием сдвиговых регистров. На данный момент, однако, должен быть показан другой вариант управления.



Рис.2.

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

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

Одним из аспектов этого типа управления является частота мультиплексирования, то есть полный цикл перехода с одного дисплея на другой. Он должен быть достаточно высоким, чтобы избежать мерцания дисплея. Человеческий глаз вялый, в кинотеатре 24 кадра в секунду, с телевизором, чтобы быть на безопасной стороне, что также неподвижные изображения спокойны, каждый сегмент должен контролироваться не менее 100 Гц, поэтому он подключается, по крайней мере, каждые 10 мс. В исключительных случаях, однако, даже 100 Гц все еще могут мерцать, Например, когда дисплей перемещается быстро или когда возникают помехи с искусственными источниками света, которые работают с переменным током.

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



Рис.3.

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

Рис.4.

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



Рис.5.

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

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



Рис.6.

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

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

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

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

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


Таблица 1.

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



Рис.6.

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



Таблица 2.

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

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

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

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

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

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

На этот раз, в статье будет рассмотрен один из интереснейших модулей, а именно - многоразрядный семисегментный индикатор на базе микросхемы MAX7219. Почему многоразрядный? Ответ прост - количество разрядов это и есть количество цифр, которое может отобразить модуль. Например, на фото ниже, показаны три вида многоразрядных индикаторов, слева направо - 4-х разрядный, 6-ти разрядный, 8-ми разрядный. Причем первый является 4-х разрядным индикатором часового типа. Отличие индикатора часового типа от обычного в том, что у него есть знак двоеточия, тогда как у обычного любого индикатора этот знак заменяется точкой внизу, рядом с цифрой.

В этой статье, рассматриваемые модули работают на базе микросхемы MAX7219 . Эта микросхема является драйвером для светодиодных семисегментных индикаторов, а также LED матриц 8х8, и мы не будем рассматривать принципиальные схемы подключения этого драйвера. Просто за основу взят готовый модуль, будут приведены примеры подключения к плате Arduino UNO и разобрана работа с функциями библиотеки LedControl . Кстати, как уже было сказано - LED матрицы 8х8 тоже работают на базе драйвера MAX7219 , и кому интересно то добро пожаловать в статьи:

Итак, начнем... Думаю что про многоразрядность было дано хорошее описание, а вот почему семисегментный? Ответ тоже не так уж и сложен - потому что для формирования символа или отображения цифры используется семь светодиодов, проиндексированных буквами A, B, C, D, E, F, G, таблица ниже показывает как это обозначено:

Как видно из таблицы, есть также и восьмой светодиод - DP. Полностью закодировать символ или цифру можно в 1 байте, устанавливая или сбрасывая определенный бит, как это показано с примером кодирования символа J. В примере установлены биты B, C, D, E , что позволяет отобразить заданный символ на семисегментном индикаторе.

От теории к практике - подключим 8-ми разрядный модуль к плате Arduino Uno по указанной ниже схеме:

Для отображения символов используется несколько функций из подключаемой библиотеки LedControl.h. Разберем каждую из этих функций по порядку, начнем с функции setDigit().

Прототип объявления функции для отображения числа и передаваемые функции аргументы:

setDigit(int addr, int digit, byte value, boolean dp);

Где -

i nt addr - адрес модуля на шине SPI 0 SPI начинается с нуля)

int digit - 0 , 7

byte value - значение(число от 0 до 9) которое нужно отобразить в разряде номер которого указан в параметре int digit

boolean dp - int digit . Если параметр равен true то точка отобразится, если false то точка не отобразится.

Прототип объявления функции для отображения символа и передаваемые функции аргументы:

setChar(int addr, int digit, char value, boolean dp);

i nt addr - адрес модуля на шине SPI для которого вызывается функция, если модуль один - то этот параметр равен 0 (по умолчанию адресация устройств на шине SPI начинается с нуля)

int digit - порядковый номер разряда в модуле индикации, по умолчанию для многоразрядных индикаторов нумерация разрядов начинается с крайнего правого разряда, соответственно номер крайнего правого разряда равен 0 , а номер крайнего левого разряда в нашем случае равен 7

char value - символ, который должен отобразиться в разряде номер которого задан параметром int digit

boolean dp - этот параметр отвечает за отображение точки у разряда номер которого указан в параметре int digit . Если параметр равен true то точка отобразится, если false то точка не отобразится.

Отдельным моментом стоит упомянуть, что функция setChar() может отобразить только ограниченный набор символов, таких как:

  • 0 1 2 3 4 5 6 7 8 9 цифра отображается как символ
  • A a
  • B b
  • С с символ отобразится в нижнем регистре
  • D d символ отобразится в нижнем регистре
  • E e символ отобразится в верхнем регистре
  • F f символ отобразится в верхнем регистре
  • H h символ отобразится в нижнем регистре
  • L l символ отобразится в верхнем регистре
  • P p символ отобразится в верхнем регистре
  • - знак "минус"
  • . , отображение точки
  • _ символ подчеркивания
  • <Пробел> установить символ пробела

В тестовом скетче можно поставить задачу такого плана:

  1. Отобразить поочередно цифры от 1 до 8 без точки
  2. Заполнить цифрами от 1 до 8 все разряды модуля индикации, плюс отобразить все точки указаных разрядов
  3. Отрисовать поразрядно массив с заранее закодированными в двоичном коде символами, в результате должно получиться "Arduino rules!!!"

Из-за ограниченного набора символов функция setChar() не подходит для тестового скетча, так как она не сможет нормально отрисовать фразу указанную в пункте 3. Вместо этой функции мы будем использовать функцию setRow() . Итак... функция setRow() уже была нами испытана в в статьях про изучение Led матриц 8х8, давайте вновь опишем прототип вызова и параметры данной функции.

Прототип объявления функции setRow() и передаваемые функции аргументы:

setRow(int addr, int row, byte value);

i nt addr - адрес модуля на шине SPI для которого вызывается функция, если модуль один - то этот параметр равен 0 (по умолчанию адресация устройств на шине SPI начинается с нуля)

int row - порядковый номер разряда в модуле индикации, по умолчанию для многоразрядных индикаторов нумерация разрядов начинается с крайнего правого разряда, соответственно номер крайнего правого разряда равен 0 , а номер крайнего левого разряда в нашем случае равен 7

byte value - значение в двоичном формате(пример B00000000, также возможна альтернатива в десятичном и шестнадцатиричном), которым закодирован необходимый символ. Таблица кодирования символов поможет правильно закодировать нужный символ.

Ну и в завершение статьи тестовый скетч и видео, как это работает:

#include "LedControl.h" /* * Подключаем библиотеку LedControl.h * и создаём объект класса LedControl * при этом, 7-ми сегметный дисплей с драйвером MAX72xx * должен быть подключен к плате Arduino следующим образом: * Arduino -> Display Module MAX72xx * Arduino -> Display Module MAX72xx * Arduino -> Display Module MAX72xx * Arduino -> Display Module MAX72xx * Arduino -> Display Module MAX72xx * */ LedControl lc = LedControl(12, 11, 10, 1); //Массив с закодированными символами, //Фраза "Arduino ruLES!!!" byte ar = { B01110111, //A B00000101, //r B00111101, //d B00011100, //u B00010000, //i B00010101, //n B00011101, //o B00000101, //r B00011100, //u B00001100, //l B01001111, //E B01011011, //S B10110000, //! B10110000, //! B10110000 //! }; void setup() { //Устройство(7-ми сегментный дисплей) выводим из спящего режима lc.shutdown(0, false); //Установить яркость дисплея на 8 //Всего возможных режимов яркости от 0 до 15 lc.setIntensity(0,8); //Очистить дисплей lc.clearDisplay(0); } void loop() { //Простейший перебор чисел от 1 до 8 по разрядам for(int i = 0, j = 7; i < 8, j >= 0; i++, j--) { lc.setDigit(0, j, byte(i + 1), false); delay(400); lc.clearDisplay(0); } //Перебор чисел без очистки экрана for(int i = 0, j = 7; i < 8, j >= 0; i++, j--) { lc.setDigit(0, j, byte(i + 1), true); delay(400); } lc.clearDisplay(0); //Отрисовка фразы "Arduino ruLES!!!" int n = 0; for(int i = 0; i < 2; i ++) { for(int j = 7; j >= 0; j --) { if(n > 6 && !(i % 2)) { continue; } else { lc.setRow(0, j, ar[n]); delay(400); n ++; } } lc.clearDisplay(0); } delay(400); lc.clearDisplay(0); }


Пожалуйста, включите javascript для работы комментариев.


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

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

Как говорит его название, состоит из семи элементов индикации (сегментов), включающихся и выключающихся по отдельности. Включая их в разных комбинациях, из них можно составить упрощённые изображения арабских цифр.
Сегменты обозначаются буквами от A до G; восьмой сегмент - десятичная точка (decimal point, DP), предназначенная для отображения дробных чисел.
Изредка на семисегментном индикаторе отображают буквы.

Бывают разных цветов, обычно это белый, красный, зеленый, желтый и голубой цвета. Кроме того, они могут быть разных размеров.

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

Кроме десяти цифр, семисегментные индикаторы способны отображать буквы. Но лишь немногие из букв имеют интуитивно понятное семисегментное представление.
В латинице : заглавные A, B, C, E, F, G, H, I, J, L, N, O, P, S, U, Y, Z, строчные a, b, c, d, e, g, h, i, n, o, q, r, t, u.
В кириллице : А, Б, В, Г, г, Е, и, Н, О, о, П, п, Р, С, с, У, Ч, Ы (два разряда), Ь, Э/З.
Поэтому семисегментные индикаторы используют только для отображения простейших сообщений.

Всего семисегментный светодиодный индикатор может отобразить 128 символов:

В обычном светодиодном индикаторе девять выводов: один идёт к катодам всех сегментов, а остальные восемь - к аноду каждого из сегментов. Эта схема называется «схема с общим катодом» , существуют также схемы с общим анодом (тогда все наоборот). Часто делают не один, а два общих вывода на разных концах цоколя - это упрощает разводку, не увеличивая габаритов. Есть еще, так называемые «универсальные», но я лично с такими не сталкивался. Кроме того существуют индикаторы со встроенным сдвиговым регистром, благодаря чему намного уменьшается количество задействованных выводов портов микроконтроллера, но они намного дороже и в практике применяются редко. А так как необъятное не объять, то такие индикаторы мы пока рассматривать не будем (а ведь есть еще индикаторы с гораздо большим количеством сегментов, матричные).

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

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

На схеме ниже, показано как подключается одноразрядный семисегментный индикатор к микроконтроллеру.
При этом следует учитывать, что если индикатор с ОБЩИМ КАТОДОМ , то его общий вывод подключается к «земле» , а зажигание сегментов происходит подачей логической единицы на вывод порта.
Если индикатор с ОБЩИМ АНОДОМ , то на его общий провод подают «плюс» напряжения, а зажигание сегментов происходит переводом вывода порта в состояние логического нуля .

Осуществление индикации в одноразрядном светодиодном индикаторе осуществляется подачей на выводы порта микроконтроллера двоичного кода соответствующей цифры соответствующего логического уровня (для индикаторов с ОК — логические единицы, для индикаторов с ОА — логические нули).

Токоограничительные резисторы могут присутствовать в схеме, а могут и не присутствовать. Все зависит от напряжения питания, которое подается на индикатор и технических характеристик индикаторов. Если, к примеру, напряжение подаваемое на сегменты равно 5 вольтам, а они рассчитаны на рабочее напряжение 2 вольта, то токоограничительные резисторы ставить необходимо (чтобы ограничить ток через них для повышенного напряжении питания и не сжечь не только индикатор, но и порт микроконтроллера).
Рассчитать номинал токоограничительных резисторов очень легко, по формуле дедушки Ома .
К примеру, характеристики индикатора следующие (берем из даташита):
— рабочее напряжение — 2 вольта
— рабочий ток — 10 мА (=0,01 А)
— напряжение питания 5 вольт
Формула для расчета:
R= U/I (все значения в этой формуле должны быть в Омах, Вольтах и Амперах)
R= (напряжение питания — рабочее напряжение)/рабочий ток
R= (5-2)/0.01 = 300 Ом

Схема подключения многоразрядного семисегментного светодиодного индикатора в основном та-же, что и при подключении одноразрядного индикатора. Единственное, добавляются управляющие транзисторы в катодах (анодах) индикаторов:

На схеме не показано, но между базами транзисторов и выводами порта микроконтроллера необходимо включать резисторы, сопротивление которых зависит от типа транзистора (номиналы резисторов рассчитываются, но можно и попробовать применить резисторы номиналом 5-10 кОм).

Осуществление индикации разрядами осуществляется динамическим путем:
— выставляется двоичный код соответствующей цифры на выходах порта РВ для 1 разряда, затем подается логический уровень на управляющий транзистор первого разряда
— выставляется двоичный код соответствующей цифры на выходах порта РВ для 2 разряда, затем подается логический уровень на управляющий транзистор второго разряда
— выставляется двоичный код соответствующей цифры на выходах порта РВ для 3 разряда, затем подается логический уровень на управляющий транзистор третьего разряда
— итак по кругу
При этом надо учитывать:
— для индикаторов с ОК применяется управляющий транзистор структуры NPN (управляется логической единицей)
— для индикатора с ОА — транзистор структуры PNP (управляется логическим нулем)