MAX7219 – драйвер светодиодных индикаторов

MAX7219 подключение к МКМикросхема MAX7219 (MAX7221) предназначена для управления семисегментными светодиодными индикаторами. Использование данного драйвера в электронных устройствах на микроконтроллере значительно упрощает вывод информации на индикаторы. Отпадает необходимость в реализации динамической индикации, как следствие экономия процессорного времени, упрощение кода программы. Управление драйвером осуществляется по интерфейсу SPI, для реализации которого потребуется выделить всего 3 линии ввода/вывода микроконтроллера, максимальная частота тактирования равна 10 Мгц. Помимо семисегментных индикаторов, с помощью драйвера можно управлять светодиодной матрицой. MAX7221 является аналогичным драйвером, с незначительными отличиями.

Ниже представлена схема подключения семисегментных индикаторов к драйверу MAX7219:
MAX7219 схема подключения
К драйверу можно подключить до 8-ми индикаторов с общим катодом. Выводы DIN, CLK, CS (LOAD для MAX7221) используются для передачи данных по интерфейсу SPI, к выводу ISET подключается резистор, задающий максимальный ток через сегменты индикатора, минимальное сопротивление резистора равно 9,53 кОм, при этом максимальный ток составит 40 мА. Вывод DOUT используется для каскадного подключения нескольких драйверов, этот вывод подключают к входу DIN второго драйвера, тем самым данные загруженные в первый драйвер последовательно загружаются во второй. Я не стал собирать схему из отдельных деталей, а заказал в Китае готовое цифровое табло из 8-ми индикаторов на основе данного драйвера, схема которого соответствует вышеприведенной.

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

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

АдресНазваниеНазначение
0хХ0No-OpПустой регистр, изменение значения регистра не влияет на работу драйвера.
0хХ1Digit 0Данные для 0-го индикатора
0хХ2Digit 1Данные для 1-го индикатора
0хХ3Digit 2Данные для 2-го индикатора
0хХ4Digit 3Данные для 3-го индикатора
0хХ5Digit 4Данные для 4-го индикатора
0хХ6Digit 5Данные для 5-го индикатора
0хХ7Digit 6Данные для 6-го индикатора
0хХ8Digit 7Данные для 7-го индикатора
0хХ9Decode ModeРегистр управления режимом декодирования данных
0хХAIntensityРегистр настройки яркости свечения индикаторов
0хХBScan LimitРегистр настройки количества активных индикаторов
0хХCShutdownРегистр управления режимом работы
0хХFDisplay TestРегистр для тестирования драйвера

Регистр Decode Mode позволяет установить режим декодирования данных для каждого индикатора: 0-й бит регистра отвечает за 0-й индикатор (на схеме HG1), 1-й бит соответствует 1-му индикатору (на схеме HG2) и т.д. Если значение бита равно 0, декодирование данных отключено, если 1 – включено.

При отключенном режиме декодирования, значения битов в регистрах Digit X (где X – номер индикатора) определяют состояние сегментов на соответствующем индикаторе. Сегмент погашен при 0-м значении бита, и включен при 1, то есть, чтобы отобразить какой-либо символ на индикаторе, необходимо правильно выставить биты в регистре Digit X.

Режим декодирования упрощает процесс вывода символов на индикаторы, например, для отображения цифры 1, надо просто записать в регистр Digit X число 1. Ниже в таблице приведено соответствие отображаемых символов от значения регистра Digit X, для режима с декодированием данных и без него:

СимволДекодирование включеноДекодирование отключено
Биты регистра Digit XБиты регистра Digit X и
соответствующие сегменты индикатора
DPABCDEFG
76-4321076543210
0X00001111110
1X00010110000
2X00101101101
3X01101111001
4X01000110011
5X01011011011
6X01101011111
7X01111110000
8X10001111111
9X10011111011
X10100000001
EX10111001111
HX11000110111
LX11010001110
PX11101100111
Индикатор погашенX11110000000

Расположение сегментов (a, b, c, d, e, f, g, dp) в стандартном индикаторе можно увидеть на вышеприведенной схеме. В режиме декодирования, состояние 4,5,6-го битов в регистре Digit X не имеет значения. Независимо от режима, 7-й бит отвечает за отображение десятичного знака.

Регистр Intensity предназначен для цифровой регулировки интенсивности свечения. Изменение яркости свечения реализовано с помощью ШИМ, всего имеется 16 уровней яркости, в следующей таблице представлено соответствие между яркостью свечения и значением регистра Intensity:

Коэффициент заполнения ШИМБиты регистра IntensityШестнадцатеричное значение
MAX7219MAX7221D7-D4D3D2D1D0
1/32 (мин.)1/16 (мин.)X00000хХ0
3/322/16X00010хХ1
5/323/16X00100хХ2
7/324/16X01100хХ3
9/325/16X01000хХ4
11/326/16X01010хХ5
13/327/16X01100хХ6
15/328/16X01110хХ7
17/329/16X10000хХ8
19/3210/16X10010хХ9
21/3211/16X10100хХA
23/3212/16X10110хХB
25/3213/16X11000хХC
27/3214/16X11010хХD
29/3215/16X11100хХE
31/32(макс.)15/16(макс.)X11110хХF

Значение старшего полубайта регистра Intensity не имеет значения. Максимальная яркость ограничивается резистором на выводе ISET, о чем было сказано выше.

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

Активные индикаторыБиты регистра Scan LimitШестнадцатеричное значение
D7-D3D2D1D0
0X0000хХ0
0,1X0010хХ1
0,1,2X0100хХ2
0,1,2,3X1100хХ3
0,1,2,3,4X1000хХ4
0,1,2,3,4,5X1010хХ5
0,1,2,3,4,5,6X1100хХ6
0,1,2,3,4,5,6,7X1110хХ7

Значение битов 3-7 в регистре Scan Limit не имеет значения. От количества активных индикаторов зависит частота их обновления, которая рассчитывается по следующей формуле: 6400/N, где N – количество активных индикаторов, например, при использовании всех 8-ми индикаторов частота обновления составит 800Гц.

Регистр No-Op используется для обращения к конкретному драйверу при использовании каскадного подключения нескольких драйверов, при этом линии CS (LOAD) всех драйверов необходимо соединить вместе, линии CLK также соединить вместе. Например, чтобы обратиться к четвертому драйверу в цепочке, сначала необходимо отправить пакет данных для этого драйвера, а затем установить 0 на линии DIN, и отправить еще 3 пакета. Таким образом, для первых 3-х драйверов обращение произойдет к регистру No-Op, не повлияв на их работу, а в 4-й драйвер будет доставлен требуемый пакет данных.

В регистре Shutdown активным является только 0-й бит, если значение этого бита установить в 0, то драйвер перейдет в спящий режим, и отключит индикаторы, при этом содержимое регистров не изменяется, при установке бита в 1 драйвер просыпается. В спящем режиме ток потребления составляет 250 мкА.

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

На следующей картинке представлена схема подключения цифрового табло (заказать можно тут) на драйвере MAX7219 к микроконтроллеру PIC16F628A:
MAX7219 схема подключения к микроконтроллеру PIC16F628A

Рассмотрим код программы микроконтроллера:

В начале программы идет настройка регистров порта B, выключение компараторов. Далее вызывается подпрограмма инициализации драйвера MAX7219 (init_lcd), где производится настройка внутренних регистров драйвера. В начале инициализации вызывается подпрограмма паузы 2 мс, для того чтобы драйвер полностью включился и вошел в рабочий режим, иначе он не будет реагировать на команды. Инициализация выполняется путем последовательной отправки пакетов данных, и включает следующие этапы:

1. Отключение тестового режима (запись числа 0x00 в регистр драйвера Display Test);
2. Выход из спящего режима и переход в рабочий (запись числа 0x01 в регистр драйвера Shutdown);
3. Установка интенсивности свечения 15/32 (запись числа 0x07 в регистр драйвера Intensity);
4. Включение декодирование для всех индикаторов (запись числа 0x00 в регистр драйвера Decode Mode);
5. Установка 8-ми активных индикаторов (запись числа 0x07 в регистр драйвера Scan Limit).

В подпрограмме инициализации значения регистров Intensity, Decode Mode, Scan Limit могут иметь другие значения, в зависимости от требуемых параметров.

Отправка пакета данных на драйвер выполняется следующим образом: в регистр adr_ind записывается адрес регистра, к которому идет обращение, в регистр data_ind записывается значение, которое необходимо передать. Далее вызывается подпрограмма передачи пакета данных (send) по протоколу SPI, где сначала передается содержимое регистра adr_ind, а затем data_ind.

После выхода из подпрограммы инициализации, на драйвер отправляются данные, которые необходимо отобразить на индикаторах. Для примера на индикаторы слева-направо выводятся символы AHEPbcdo, с отключенным декодированием. Сначала выполняется отключение декодирования, далее в регистры драйвера Digit 0 – Digit 7 последовательно загружаются байты для каждого символа. В программе передаваемые байты представлены в виде двоичных чисел, для более удобной настройки символа выводимого на индикатор, настройка выполняется согласно вышеприведенной таблице соответствия битов регистра Digit X и сегментов индикатора.

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

Драйвер имеет 16 выходов, соответственно к нему можно подключить светодиодную матрицу 8×8, причем в продаже имеются уже готовые модули на основе драйвера MAX7219 и матрицы 8×8, один из таких модулей я заказал здесь. Ниже представлена схема модуля и его подключение к микроконтроллеру PIC16F628A:
MAX7219 схема подключения матрицы 8x8
Линии драйвера, отвечающие за сегменты a, b, c, d, e, f, g, dp (7-ми сегментного индикатора) подключаются к линиям столбцов матрицы, строки матрицы подключаются к линиям управления индикаторами.
Код программы микроконтроллера представлен ниже:

Как и в первой программе, сначала выполняется настройка регистров микроконтроллера, затем следует инициализация драйвера. Для более удобного восприятия передача данных на драйвер осуществляется с помощью косвенной регистровой адресации. Согласно схеме, содержимое регистров Digit 0 – Digit 7 драйвера будет соответствовать строкам матрицы. Содержимое регистра Digit 0 отображается в первой строке матрицы, Digit 1 во второй и т.д. Старший 7-й бит регистров Digit (0-7) соответствует первому столбцу, 0-й бит восьмому столбцу.

В программе выполняется последовательная запись 8-ми байтов составляющих изображение в регистры ОЗУ с помощью косвенной адресации. Далее вызывается подпрограмма vivod, для отправки данных на драйвер, 8 байт данных поочередно извлекаются из регистров ОЗУ и отправляются на драйвер с помощью подпрограммы отправки пакета данных (send). При этом адресный регистр adr_ind инкрементируется от 1 до 8, соответственно данные записываются в регистры c Digit 0 по Digit 7, то есть с первой строки матрицы по восьмую (сверху-вниз).

В программе выполняется вывод 6-ти изображений (символы R, L, цифра 15 и три узора) сменяющих друг друга через 2 сек. Составить желаемое изображение просто, всего необходимо записать 8 байт на 8 строк матрицы, первый байт соответствует первой строке матрицы, на следующей картинке можно посмотреть данное соответствие:
MAX7219 схема загрузки матрицы 8x8
Способ вывода изображения в программе зависит от ориентации модуля с матрицей в пространстве относительно зрителя, я подобрал ориентацию для получения наиболее простого и понятного кода. Например, если повернуть модуль на 180 градусов, то в программе для текущих данных придется делать зеркальную симметрию в двух плоскостях, другой вариант, это составить байты данных, учитывая текущую ориентацию.

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

MAX7219 модуль с матрицей 8x8MAX7219 подключение семисегментного индикатораMAX7219 подключение матрицы 8x8

На следующем видеоролике можно увидеть результат работы вышеприведенных программ:

Прошивка МК и исходник для матрицы 8×8

У этой записи 8 комментариев

  1. Доброго времени суток, подскажите пожалуйста можно ли использовать данный драйвер для управления диодными лентами (7 сегментный индикатор из диодной ленты) с напряжением 12В?

    1. Подключить можно, если дополнительно поставить транзисторы на выходы MAX7219

  2. Я купил сборку из 4-х матриц matrix 8х8. Не подскажите можно ли развернуть матрицу на 180 гр. Только не программно, а воткнуть на плату. Не сгорит она при этом. Спрашиваю, т.к какой скеч не загружу в ардуино результат один – что-то происходит только на нескольких вертикальных рядах, остальные просто горят. Инфа и видео тут https://yadi.sk/d/hXDLDtV_3QJWFT
    Благодарю за помощь.

    1. Неправильное подключение не навредит матрице.

      На некоторых матрицах с обратной стороны можно увидеть подписанные номера выводов, но бывают матрицы где нумерация не видна и определить сразу не получится. У меня например модель матрицы нанесена на стороне где расположены выводы 1-8, а так надо мультиметром прозванивать и смотреть какие сегменты загораются. Например по рисунку их схемы в статье, если поднести плюсовой щуп к 13 выводу, а минусовой щуп к 9, то должен загореться сегмент в первой строке и в первом столбце (1-1). Если расположить матрицу так же как на схеме то это будет крайний левый и верхний сегмент.

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

      Фото с нумерацией матрицы и модуля MAX7219:
      Цоколевка матрицы 8x8 MAX7219

      1. Спасибо огромное. Завелась, работает.

  3. А можно ли использовать встроенный (USART) микроконтроллера?

  4. Здравствуйте, у вас ошибка в таблице
    При включенном декодировании:
    6 это 0110 и 3 это тоже 0110?)

  5. Здравствуйте, не подскажете ваши примеры в си.?

Имя (обязательно)Email (обязательно)Веб-сайт

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