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

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

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

В индикаторе есть восемь сегментов (7 — на знак и одна точка), как правило, аноды или катоды одного разряда индикатора соединены вместе.  Таким образом, для получения «картинки» на индикаторе надо, для схемы с общим анодом, катоды «светящихся» сегментов подключить к GND, а общий анод к VCC, естественно, ограничив ток каждого сегмента с помощью резистора (см соответствующую статью). «Зажигание» всех разрядов индикатора, производится, как правило, динамически, т.е. некоторое время «светится» один разряд, затем — другой и так далее…

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

Это наиболее распространенный способ получения изображения на многоразрядном индикаторе. Суть метода сводится к включению изображения на одном разряде индикатора на некоторое время, затем включение следующего разряда с его «картинкой», затем — следующего и т.д. Время «зажигания» разряда подбирается таким, чтобы глаз человека не замечал мерцаний. По аналогии с телевидением или кино, можно принять: период обновления всей картинки не должен превышать 40 мс (частота смены 25 Гц). В реальности, частоту «развертки» желательно увеличить.

Схема примера приведена ниже. s7seg_rДвухразрядный индикатор подключен к Arduino. Катоды сегментов разрядов подключены к выводам платы напрямую через токоограничивающие резисторы. Это допустимо, т.к. при поразрядной развертке, при любом числе разрядов индикатора, в каждый момент времени к выводу микроконтроллера подключен только один сегмент и выходного тока 20 мА вполне хватает. Для получения максимальной яркости свечения номинал надо выбирать «поменьше». Аноды индикатора подключать к выводам платы напрямую опасно, т.к. общий ток складывается из всех светящихся сегментов и, например для цифры «8» (включены все сегменты), при токе сегмента 10 мА, общий ток анода будет 70 мА — что выше предельно допустимого. Поэтому аноды индикатора подключены к выводам Arduino через транзисторные ключи.

Простой скетч, демонстрирующий работу динамической поразрядной индикации, приведен ниже. Ничего полезного программа не делает, но позволяет легко в себе разобраться. Основными процедурами являются DisplayShow() — реализующая один цикл развертки (10 мс свечение одного разряда и 10 мс — другого);  Show() — кодирование цифры в ее 7-сегментное изображение. Программа индицирует на индикаторе число «34».

/* индикация числа "34" на 2х разрядном 7-сегм.индикаторе
программная динамическая развертка 10мс на разряд */

//определение выводов платы для управления индикатором
#define DIG1 4    //анод первого разряда
#define DIG2 5    //анод второго разряда
#define A 6       //сегмент А
#define B 7
#define C 8
#define D 9
#define E 10
#define FF 11
#define G 12      //сегмент G

int dig1 = 0;     //цифра в первом разряде (десятки)
int dig2 = 0;     //цифра во втором разряде (единицы)

void setup() {  //определение режимов портов (все на вывод)              
  pinMode(A, OUTPUT); pinMode(B, OUTPUT);
  pinMode(C, OUTPUT); pinMode(D, OUTPUT);
  pinMode(E, OUTPUT); pinMode(FF, OUTPUT);
  pinMode(G, OUTPUT); pinMode(DIG1, OUTPUT);
  pinMode(DIG2, OUTPUT);
  digitalWrite(DIG1,HIGH); //выключаем анод разряда 1
  digitalWrite(DIG2,HIGH); //выключаем анод разряда 2
}

void loop() {
  DisplayMath(34);
  DisplayShow();
}

//перевод числа в две отображаемые цифры первого и второго разряда
void DisplayMath(int data) {
  dig1 = dig2 = 0;
  if (data < 100) {
    while (data >= 10) {
      data -= 10;
      dig1++;
    }
    dig2 = data;
  }
}

//один цикл развертки: 10мс на первый разряд и 10мс - на второй
void DisplayShow() {
  digitalWrite(DIG1,HIGH); //выключаем анод разряда 1 
  digitalWrite(DIG2,HIGH); //выключаем анод разряда 2
  Show(dig1);   //включаем нужные сегменты первого разряда
  digitalWrite(DIG1,LOW);  //включаем разряд 1(анод к VCC)
  delay(10);               //время свечения разряда
  digitalWrite(DIG1,HIGH); //гасим первый разряд
  Show(dig2);   //включаем нужные сегменты второго разряда
  digitalWrite(DIG2,LOW);  //включаем разряд 2(анод к VCC)
  delay(10);               //время свечения разряда
  digitalWrite(DIG2,HIGH); //гасим второй разряд
}

//перекодирование цифры в ее 7-сегментную картинку
//LOW - сегмент светится, HIGH - сегмент погашен
void Show(int digit) {
  switch(digit) {
    case 0: { //для нуля все сегменты кроме G светятся
      digitalWrite(A,LOW); digitalWrite(B,LOW);
      digitalWrite(C,LOW); digitalWrite(D,LOW);
      digitalWrite(E,LOW); digitalWrite(FF,LOW);
      digitalWrite(G,HIGH);
    }
    break;
    case 1: {
      digitalWrite(A,HIGH); digitalWrite(B,LOW);
      digitalWrite(C,LOW); digitalWrite(D,HIGH);
      digitalWrite(E,HIGH); digitalWrite(FF,HIGH);
      digitalWrite(G,HIGH);
    }
    break;
    case 2: {
      digitalWrite(A,LOW); digitalWrite(B,LOW);
      digitalWrite(C,HIGH); digitalWrite(D,LOW);
      digitalWrite(E,LOW); digitalWrite(FF,HIGH);
      digitalWrite(G,LOW);
    }
    break;
    case 3: {
      digitalWrite(A,LOW); digitalWrite(B,LOW);
      digitalWrite(C,LOW); digitalWrite(D,LOW);
      digitalWrite(E,HIGH); digitalWrite(FF,HIGH);
      digitalWrite(G,LOW);
    }
    break;
    case 4: {
      digitalWrite(A,HIGH); digitalWrite(B,LOW);
      digitalWrite(C,LOW); digitalWrite(D,HIGH);
      digitalWrite(E,HIGH); digitalWrite(FF,LOW);
      digitalWrite(G,LOW);
    }
    break;
    case 5: {
      digitalWrite(A,LOW); digitalWrite(B,HIGH);
      digitalWrite(C,LOW); digitalWrite(D,LOW);
      digitalWrite(E,HIGH); digitalWrite(FF,LOW);
      digitalWrite(G,LOW);
    }
    break;
    case 6: {
      digitalWrite(A,LOW); digitalWrite(B,HIGH);
      digitalWrite(C,LOW); digitalWrite(D,LOW);
      digitalWrite(E,LOW); digitalWrite(FF,LOW);
      digitalWrite(G,HIGH);
    }
    break;
    case 7: {
      digitalWrite(A,LOW); digitalWrite(B,LOW);
      digitalWrite(C,LOW); digitalWrite(D,HIGH);
      digitalWrite(E,HIGH); digitalWrite(FF,HIGH);
      digitalWrite(G,HIGH);
    }
    break;
    case 8: {
      digitalWrite(A,LOW); digitalWrite(B,LOW);
      digitalWrite(C,LOW); digitalWrite(D,LOW);
      digitalWrite(E,LOW); digitalWrite(FF,LOW);
      digitalWrite(G,LOW);
    }
    break;
    case 9: {
      digitalWrite(A,LOW); digitalWrite(B,LOW);
      digitalWrite(C,LOW); digitalWrite(D,LOW);
      digitalWrite(E,HIGH); digitalWrite(FF,LOW);
      digitalWrite(G,LOW);
    }
    break;
  }
}

Надо отметить, что программа написана в ХУДШИХ традициях программирования. При ее работе контролер только разверткой изображения и занимается, сделать что-то полезное ему «некогда». В нормальных программах разверткой картинки должна заниматься процедура обработки прерывания от таймера. Но для демонстрационных целей и даже решения несложных задач приведенный подход вполне пригоден…

Для увеличения числа разрядов индикатора в схеме надо добавить транзисторные ключи по числу разрядов, а в процедуре DisplayShow() в цикл развертки — включение индикации новых разрядов. Возможно, понадобится уменьшить время индикации разряда, чтобы мерцание развертки оставалось незамеченным.

Для индикаторов с общим катодом схема изменится: аноды сегментов подключаются к выходам микроконтроллера через резисторы, а катоды разрядов через транзисторные (N-P-N) ключи. В процедурах DisplayShow() и Show() надо поменять местами HIGH и LOW, т.к. транзисторный ключ открывается уровнем HIGH, а сегмент зажигается при уровне на аноде HIGH.

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

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

  2. Поправьте код для цифры 3
    case 3: {
    digitalWrite(A,LOW); digitalWrite(B,LOW);
    digitalWrite(C,LOW); digitalWrite(D,LOW);
    digitalWrite(E,HIGH); digitalWrite(FF,HIGH);
    digitalWrite(G,LOW);

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

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

Ваш e-mail не будет опубликован.

Нажимая кнопку "Отправить" Вы даёте свое согласие на обработку введенной персональной информации в соответствии с Федеральным Законом №152-ФЗ от 27.07.2006 "О персональных данных".