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хХ0 No-Op Пустой регистр, изменение значения регистра не влияет на работу драйвера.
0хХ1 Digit 0 Данные для 0-го индикатора
0хХ2 Digit 1 Данные для 1-го индикатора
0хХ3 Digit 2 Данные для 2-го индикатора
0хХ4 Digit 3 Данные для 3-го индикатора
0хХ5 Digit 4 Данные для 4-го индикатора
0хХ6 Digit 5 Данные для 5-го индикатора
0хХ7 Digit 6 Данные для 6-го индикатора
0хХ8 Digit 7 Данные для 7-го индикатора
0хХ9 Decode Mode Регистр управления режимом декодирования данных
0хХA Intensity Регистр настройки яркости свечения индикаторов
0хХB Scan Limit Регистр настройки количества активных индикаторов
0хХC Shutdown Регистр управления режимом работы
0хХF Display 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 и
соответствующие сегменты индикатора
DP A B C D E F G
7 6-4 3 2 1 0 7 6 5 4 3 2 1 0
0 X 0 0 0 0 1 1 1 1 1 1 0
1 X 0 0 0 1 0 1 1 0 0 0 0
2 X 0 0 1 0 1 1 0 1 1 0 1
3 X 0 1 1 0 1 1 1 1 0 0 1
4 X 0 1 0 0 0 1 1 0 0 1 1
5 X 0 1 0 1 1 0 1 1 0 1 1
6 X 0 1 1 0 1 0 1 1 1 1 1
7 X 0 1 1 1 1 1 1 0 0 0 0
8 X 1 0 0 0 1 1 1 1 1 1 1
9 X 1 0 0 1 1 1 1 1 0 1 1
X 1 0 1 0 0 0 0 0 0 0 1
E X 1 0 1 1 1 0 0 1 1 1 1
H X 1 1 0 0 0 1 1 0 1 1 1
L X 1 1 0 1 0 0 0 1 1 1 0
P X 1 1 1 0 1 1 0 0 1 1 1
Индикатор погашен X 1 1 1 1 0 0 0 0 0 0 0

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

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

Коэффициент заполнения ШИМ Биты регистра Intensity Шестнадцатеричное значение
MAX7219 MAX7221 D7-D4 D3 D2 D1 D0
1/32 (мин.) 1/16 (мин.) X 0 0 0 0 0хХ0
3/32 2/16 X 0 0 0 1 0хХ1
5/32 3/16 X 0 0 1 0 0хХ2
7/32 4/16 X 0 1 1 0 0хХ3
9/32 5/16 X 0 1 0 0 0хХ4
11/32 6/16 X 0 1 0 1 0хХ5
13/32 7/16 X 0 1 1 0 0хХ6
15/32 8/16 X 0 1 1 1 0хХ7
17/32 9/16 X 1 0 0 0 0хХ8
19/32 10/16 X 1 0 0 1 0хХ9
21/32 11/16 X 1 0 1 0 0хХA
23/32 12/16 X 1 0 1 1 0хХB
25/32 13/16 X 1 1 0 0 0хХC
27/32 14/16 X 1 1 0 1 0хХD
29/32 15/16 X 1 1 1 0 0хХE
31/32(макс.) 15/16(макс.) X 1 1 1 1 0хХF

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

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

Активные индикаторы Биты регистра Scan Limit Шестнадцатеричное значение
D7-D3 D2 D1 D0
0 X 0 0 0 0хХ0
0,1 X 0 0 1 0хХ1
0,1,2 X 0 1 0 0хХ2
0,1,2,3 X 1 1 0 0хХ3
0,1,2,3,4 X 1 0 0 0хХ4
0,1,2,3,4,5 X 1 0 1 0хХ5
0,1,2,3,4,5,6 X 1 1 0 0хХ6
0,1,2,3,4,5,6,7 X 1 1 1 0хХ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

Последние записи:

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *