Модуль многоразрядного 7-ми сегментного индикатора на базе микросхемы MAX72xx, подключение к Arduino и работа с библиотечными функциями.

02.11.2016 19:46

jazon



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


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

  1. Часть 1. Первое знакомство с LED матрицами 8х8
  2. Часть 2. Создание простейшего шрифта для LED матрицы 8x8
  3. Часть 3. Каскадное подключение LED матриц 8х8
  4. Редактор символов для LED матриц 8х8

Итак, начнем... Думаю что про многоразрядность было дано хорошее описание, а вот почему семисегментный? Ответ тоже не так уж и сложен - потому что для формирования символа или отображения цифры используется семь светодиодов, проиндексированных буквами 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);

Где - 

        int addr - адрес модуля на шине SPI для которого вызывается функция, если модуль один - то этот параметр равен (по умолчанию адресация устройств на шине 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);

        int addr -  адрес модуля на шине SPI  для которого вызывается функция, если модуль один - то этот параметр равен  (по умолчанию адресация устройств на шине 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);

Где - 

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

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

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


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

#include "LedControl.h"

/*
 * Подключаем библиотеку LedControl.h
 * и создаём объект класса LedControl
 * при этом, 7-ми сегметный дисплей с драйвером MAX72xx
 * должен быть подключен к плате Arduino следующим образом:
 * Arduino[Pin 5V] -> Display Module MAX72xx[VCC]
 * Arduino[PinGND] -> Display Module MAX72xx[GND]
 * Arduino[Pin 12] -> Display Module MAX72xx[DIN]
 * Arduino[Pin 11] -> Display Module MAX72xx[CLK]
 * Arduino[Pin 10] -> Display Module MAX72xx[LOAD/CS]
 * 
 */

LedControl lc = LedControl(12, 11, 10, 1);

//Массив с закодированными символами,
//Фраза "Arduino ruLES!!!"
byte ar[15] = 
              {
                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);
}





Расскажи о нас

Сообщение

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