Микросхема драйвер 7 сегментным символьных индикаторов. Дополнительные пояснения по управления эффектами

Отличительные особенности:

  • Высокоскоростной 26 МГц SPI/QSPI/MICROWIRE™ - совместимый последовательный интерфейс
  • Напряжение питания от 2.7 В до 5.5 В
  • Обеспечивает управление индикаторами:
    до 16 знаковых разрядов (7 сегментов)
    до 8 знаковых разрядов (14 сегментов)
    до 128 дискретных светодиодов
    комбинация типов индикаторов
  • Обеспечивает управление монохромными и двухцветными светодиодными индикаторами с общим катодом
  • Встроенный 104- символьный ASCII шрифт для 14-ти и 16-ти сегментных индикаторов и шестнадцатиричный шрифт для 7-ми сегментных индикаторов
  • Автоматическое управление мерцанием для каждого сегмента
  • Режим отключения питания с экономией энергопотребления, потребляемый ток 10 мкА (тип.)
  • 16-ти ступенчатое цифровое поразрядное управление уровнем яркости
  • Очистка индикатора при включении питания
  • Драйверы сегментов имеют ограничение скорости нарастания выходного напряжения для ограничения EMI
  • Пять входов портов общего назначения могут быть сконфигурированы для опроса и подавления дребезга до 32 ключей с одновременным нажатием n- ключей
  • Выходной сигнал прерывания IRQ в режиме подавления дребезга сканируемого ключа
  • Корпуса 36-pin SSOP и 40-pin DIP
  • Стандартное исполнение с автомобильным диапазоном рабочих температур

Области применения:

  • Телевизионные приставки, декодеры
  • Цифровые измерительные приборы
  • Бытовая техника
  • Автомобильные приложения
  • Цифровые графические индикаторы
  • Аудио/ видео техника

Функциональная схема:

Типовая схема включения:

Расположение выводов:

Описание:

ИС MAX6954 является компактным драйвером индикатора, обеспечивающим согласование микропроцессоров с различными вариантами 7-ми / 14-ти и 16-ти сегментных светодиодных индикаторов с использованием 4-х проводного, последовательного SPI™, или QSPI™- совместимого интерфейса. Последовательный интерфейс может каскадироваться через несколько ИС. ИС MAX6954 способна управлять индикаторами, содержащими: до 16-ти знаковых разрядов (7 сегментов); до 8 знаковых разрядов (14 сегментов); до 128 дискретных светодиодов, при низком напряжении питания, начиная от 2.7 В. Драйвер имеет пять каналов расширителя I/O (или портов I/O общего назначения), несколько, или все, из которых, могут быть сконфигурированы для опроса и подавления дребезга матричной клавиатуры, состоящей, максимально, из 32 ключей.

В ИС встроен: полный 104- символьный, 14-ти и 16-ти сегментный шрифт ASCII, шестнадцатиричный шрифт для 7-ми сегментных индикаторов, цепи мультиплексного сканирования, катодные и анодные драйверы и статическая RAM, сохраняющая состояние каждого разряда. Максимальный ток сегмента для всех разрядов индикатора устанавливается с использованием одного внешнего резистора. Интенсивность свечения разрядов может регулироваться независимо для каждого из разрядов с использованием встроенной, 16-ти ступенчатой, цифровой системы управления яркостью. ИС MAX6954 имеет режим отключения питания с экономией энергопотребления, регистр ограничения сканирования, позволяющий пользователю устанавливать отображение от 1 до 16 знаковых разрядов, систему управления мерцанием сегментов (при необходимости, синхронизируется для работы в много- драйверном режиме) и тестовый режим, принудительно включающий все светодиодные сегменты в положение «включено». Драйверы светодиодных сегментов имеют ограничение скорости нарастания выходного напряжения для ограничения EMI.

Уффф… Наконец-то добрался до паяльника! Сейчас сделаем что-нибуть интересненькое.

Раньше мы сказали «А», собрав , теперь мы просто обязаны сказать «Б» и сделать устройство вывода, чем мы сегодня и займемся. В качестве устройства «Б» у нас будет выступать 7-сегментный индикатор. Но не просто один индикатор, а целая линейка семисегментных индикаторов, причем неограниченной длинны и с кучей эффектов отображения! Интересно? Ну, тогда, начнем!

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

Часто, когда идет речь о семисегментных индикаторах, подразумевается включение их в схему с динамической индикацией, при этом, по очереди засвечивается только один символ, и при частоте выше 50Гц, создается иллюзия, что светятся все символы одновременно. Эта схема настолько распространена, что 3-4х циферные индикаторы имеют выводы только под динамическую индикацию. У такого способа включения, конечно, есть свои плюсы, но когда речь идет о количестве цифр больше чем четыре (а тем более, если не известно, сколько их вообще будет) – начинаются проблемы с этой самой динамической индикацией — падает яркость свечения становиться заметно мерцание. Очевидно, что для линейки семисегментных индикаторов неограниченной длинны, такой способ включения абсолютно не подходит. Как же быть в таком случае? Поступим нестандартно – включим наши индикаторы на статическое (постоянное) свечение. Чтобы такое подключение стало возможным, нам понадобятся одноциферные семисегментные индикаторы – вот, например, такие:

Кроме того, для засветки нужных сегментов индикатора, нам нужен драйвер светодиодов. Чтобы не увеличивать стоимость нашей линейки (микросхема-драйвер довольно дорогая) будем применять дешевые и распространенные сдвиговые регистры 74HC164 . Это немного ухудшит яркость свечения, но значительно удешевит все устройство. Для управления линейкой будем использовать микроконтроллер ATtiny13 – больший не нужен. Сдвиговые регистры управляются всего двумя линиями (Data , Clock ) и включаются последовательно, а значит, нет разницы для схемы управления регистрами, сколько их там стоит в линейке три или сто двадцать три. Значит, можно сделать нашу линейку безразмерной, то есть к линейке можно в любое время подключить дополнительные индикаторы или убрать ненужные. Схема устройства выглядит следующим образом:

Как видно из схемы, семисегментные индикаторы с регистром 74HC164 установливаются на отдельные платы с разъемами по обе стороны для того, чтобы можно было собрать несколько индикаторов в линейку. Плата управления (драйвер линейки) на ATtiny13 управляет всеми индикаторами вне зависимости от их количества. Более того, в прошивке предусмотрена возможность для того, чтобы в линейку можно было включать вперемешку индикаторы с общим анодом и общим катодом. Символы отображаются справа налево. Этот вариант отображения удобен для случая, когда неизвестно, сколько индикаторов включено в линейке – последние введенные символы всегда находятся в первых индикаторах. Кроме сигнала данных (Data ) и сигнала тактирования данных (Clock ), драйвером формируется сигнал “/OE ” (Output Enable) для того чтобы избежать мерцания сегментов при сдвиге символов по регистру. В момент сдвига данных по регистру драйвер выставляет на линии /ОЕ высокий уровень, схема управления индикаторами по этому уровню сигнала должна запретить вывод данных на индикатор. В данном схемном решении этот сигнал не задействован по причине отсутствия в сдвиговых регистрах 74HC164 ножки переводящей выходы в высокоомное состояние, но можно этим сигналом отключать общий вывод индикатора (через транзистор) или использовать другую микросхему, имеющую соответствующий вход.

Алгоритм работы устройства.
Я долго размышлял над тем, как сделать управление линейкой простым и не обременительным для микроконтроллера Вашего проекта. Главная цель, которую я преследовал, максимально переложить функции управления на драйвер линейки, но в тоже время не потерять возможности гибкого управления со стороны Вашего проекта. В результате был разработан следующий алгоритм работы:

Драйвер линейки взаимодействует с Вашим проектом по UART (Скорость 9600 , 8 бит данных, 1 стоп бит, бита четности нет ). Драйвер работает как на прием, так и на передачу (хотя последнее не столь важно и можно данную возможность не использовать, тем самым свести управление драйвером всего к одной линии).
В драйвер могут передаваться цифры, буквы латиницы, управляющие символы. Передача осуществляется в ASCII коде (пример: цифры -“123”, буквы-“Аbc”, управляющие символы-“>”). Другие символы игнорируются.

Драйвер, по UART, отправляет символы окончания эффектов. Их всего два — “V ” и “D ”. Это нужно для того, чтобы знать когда окончился эффект и можно отправить следующую команду эффекта для формирования сложных составных эффектов.

Переданные, для отображения, цифры и буквы латиницы записываются в буфер (размер буфера может быть 16, 32, 64 знака и выбирается по нуждам проекта). Переполнения буфера нет, он циклический (новые символы пишутся поверх самых старых). Управляющие символы в буфер не записываются – они активируют свои функции немедленно в момент приема по UART (например: при посылке строк “abcd>” и “ab>cd” результат будет идентичен). На линейку индикаторов символы попадают из буфера, при этом способ их отображения зависит от активированных эффектов. Такой вариант наименее ресурсоемок для контроллера Вашего проекта, так как введенная в буфер строка символов отображается с различными эффектами посредством лишь ресурсов драйвера.

По умолчанию драйвер отображает полученные символы на линейке без каких либо эффектов. Если по UART передавать цифры или букв латиницы (например, “1”, “4”, “A“, ”S” ”d” …) они сразу будут отображаться на линейке справа налево, причем следующий символ будет сдвигать влево предыдущий.
Далее идет описание всех символов которые можно отправить в драйвер.


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


Управляющие символы.
Для выбора режима работы линейки или активации спецэффектов нужно передать по УАРТ специальные символы. Как я писал раньше, управляющие символы начинают работать немедленно, после приема по UART, и в буфер они не попадают. Соответственно их можно пересылать прямо в строке сообщения.
Пример : “_Аbc>”, где “Аbc”-отображаемое сообщение, а “_” и “>”-управляющие символы.


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

“)” – разрешение автоматического отображения буфера (по умолчанию активировано).
При включенном автоматическом обновлении буфер, с определенным периодом, перерисовывается на линейке. Каждый принятый по UART и записанный в буфер символ сразу же отобразится на линейке.

“(“ – запрет автоматического отображения буфера.
Все принятые по UART символы продолжают записываться в буфер драйвера, но на линейке не происходит ни каких изменений (“светится” последнее сообщение). Запрет автоматического обновления линейки может понадобиться в том случае, если нужно вывести сразу всю строчку целиком, а не посимвольно, или для того, чтобы подготовить следующее сообщение, не изменяя предыдущее.
Пример : переданная по UART строка “(2314” ни как не отобразится на линейке, но в буфере запишется. Если дальше включить автоматическое отображение — “)”, то на линейке мы увидим наше слово “2314”. Для того, чтобы выводить строку сообщения целиком, а не по факту передачи символов по UART, нужно послать следующую комбинацию “(2314)”. Это актуально если символы 2, 3, 1, 4 передаются по UART не сразу, а в течении определенного времени.

“!” – принудительный вывод буфера на линейку .
Нужен для того, чтобы однократно отобразить буфер на линейке, при отключенном автоматическом обновлении.
Пример : запретили автоматическое отображение “(“, передали символы “2314”, принудительно их отображаем “!”.

“_” (знак подчеркивания) – очистка буфера.
После приема этого символа буфер немедленно очистится. Если запрещено автоматическое отображение буфера, на линейке не произойдет никаких изменений, так как очищается только буфер. Для очистки линейки, в этом случае, нужно запустить автоматическое отображение буфера или послать символ принудительного вывода буфера “!”.

”[“ – включение режима инверсии символов.
В режиме инверсии, выводимые на линейку символы, инвертируются (побитно). Такой режим нужен, если Вы умудрились соединить в одну линейку вперемешку индикаторы с общим анодом и общим катодом. При подаче инверсного сигнала на индикатор противоположного подключения последний отобразит символ корректно. Даже если вся линейка индикаторов не соответствует прошивке в начале сеанса достаточно послать символ ”[“ и дальше все будет работать корректно.

“]” – выключение режима инверсии символов (по умолчанию активировано).
Пример : Если прошивка для индикаторов с общим анодом, а индикаторы включены так: ОА-ОК—ОА. Передаем строку «35» получим на линейке 345. Если передать так — «345» то получим «3-черте-что-5».

“*“ – посимвольное «исчезновения» содержимого линейки.
Символы на линейке последовательно гасят свои сегменты, пока совсем не «исчезнут» (содержимое буфера остается нетронутым). По окончании эффекта в UART выдается символ “D

“^“ – посимвольное «проявление» содержимого линейки.
Символы на линейке последовательно зажигают свои сегменты до полного «проявления» (содержимое буфера остается нетронутым). По окончании эффекта в UART выдается символ “D ” автоматическое отображение буфера разрешено.

Для полноты эффекта линейка индикаторов должна быть пуста, запрещено автоматическое отображение буфера и в буфере должно находиться проявляемое слово (сделать это можно следующей строчкой “)_!проявляемое слово”). Данный эффект хорош после исчезновения предыдущего слова по “*”.


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

“>“ – Автоматический скроллинг содержимого линейки вправо (бегущая строка).

“<“ – Автоматический скроллинг содержимого линейки влево (бегущая строка).
Содержимое буфера не изменяется. Эффект бесконечен (движение по кругу), ни какие символы по UART не возвращаются. Остановить можно символом “|“.

“|“ – Остановка скроллинга.
Позиция отображения возвращается в нормальное состояние.


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

“\“ – Вертикальный сдвиг-появление символов линейки вверх (появление вверх – с пустого места до полных символов). По окончании эффекта в UART выдается символ “V

“/“ – Вертикальный сдвиг-исчезновение символов линейки вверх (исчезновение вверх – с полных символов до пустого места). По окончании эффекта в UART выдается символ “V ” и запрещается автоматическое отображение буфера.

“:“ – Вертикальный сдвиг-появление символов линейки вниз (появление вниз – с пустого места до полных символов). По окончании эффекта в UART выдается символ “V ”, автоматическое отображение буфера разрешено.

“;“ – Вертикальный сдвиг-исчезновение символов линейки вниз (исчезновение вниз – с полных символов до пустого места). По окончании эффекта в UART выдается символ “V ” и запрещается автоматическое отображение буфера.

Вот пример реализации движения по меню посредством эффектов пакета:

А это пример информационного сообщения:


Пакет управляющих символов для изменения скорости эффектов.
Следующие символы изменяют скорость прохождения эффектов.

“-“ – активируется нормальная скорость.

“+“ – активируется повышенная скорость.

Дополнительные пояснения по управления эффектами.

— Все эффекты работают независимо друг от друга. Это значит, что Вы можете запустить сразу несколько эффектов одновременно! Строка вида «_Start>*; » очистит буфер, запишет в него слово «START», запустит бегущую строку вправо, во время пробега она будет исчезать посегментно и в придачу опускатся вниз. При помощи различных комбинаций можно получить совершенно новые эффекты. Экспериментируйте!

— При подаче взаимно исключающих команд, например ”<” и “>” – сработает последняя — “>”.

— Во время действия спецэффектов можно заполнять буфер новыми словами. Они сразу же начнут участвовать в эффекте.

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


Прошивки для индикаторов с общим анодом (OA)
- Прошивка для ATtiny13 драйвера линейки 7-сегментных индикаторов. Буфер - 16 символов. Индикаторы с общим анодом.
- Прошивка для ATtiny13 драйвера линейки 7-сегментных индикаторов. Буфер - 32 символов. Индикаторы с общим анодом.

Прошивки для индикаторов с общим катодом (OK)
- Прошивка для ATtiny13 драйвера линейки 7-сегментных индикаторов. Буфер - 16 символов. Индикаторы с общим катодом.
- Прошивка для ATtiny13 драйвера линейки 7-сегментных индикаторов. Буфер - 32 символов. Индикаторы с общим катодом.

Фьюзы для всех прошивок одинаковы
- Фьзы для прошивок драйвера линейки

Размер буфера следует выбирать, по возможности, наименьшим. Меньший буфер меньше шумит сегментами индикаторов при сдвигах и обновлениях линейки (это касается только схем без гашения индикаторов сигналом /ОЕ).

Сегодня будет представлен еще один способ сэкономить кучу ножек микроконтроллера в тех случаях когда нужно подключить семисегментные светодиодные индикаторы. Речь пойдет о использовании специализированного драйвера MAX7221 - это драйвера позволяют управлять семисегментными индикаторами (с общим катодом), светодиодными линейками или же с помощью него можно рулить до 64 светодиодами одновременно. Сами драйвера управляются по SPI интерфейсу, с максимальной поддерживаемой частотой работы интерфейса до 10 МГц.

Распиновка ножек микросхемы:

1 - DIN. Последовательный ввод данных. Данные загружаются в 16-ти разрядный сдвиговый регистр по переднему фронту тактового сигнала.

2,3,5-8,10,11 - DIG0-DIG7. Выводы для подключения общих катодов индикаторов.

4,9 - GND. Выводы для подключения земли

12 - LOAD (CS ) в MAX7221 данные загружаются в приёмный сдвиговый регистр только когда сигнал CS находится в состоянии низкого уровня (то есть только когда микросхема "выбрана", если говорить в терминах интерфейса SPI). Запоминаются и поступают к обработке также последние 16 принятых бит, происходит это также по переднему фронту сигнала CS .

13 - CLK. Вход сигнала тактирования, по которому происходит запись данных.

14-17, 20-23 - SEG A-SEG G, DP. Выводы для подключения сегментов семисегментных индикаторов.

18 - ISET. К этому выводу подключается резистор (вторая нога резистора - к плюсу), позволяющий задавать пиковый ток сегмента и таким образом устанавливать яркость свечения сегментов. Минимальное сопротивление этого резистора должно быть 9,53 кОм, что примерно соответствует току сегмента 40мА.

19 - V+. Сюда подключается "+" питания.

24 - DOUT. Последовательный вывод данных. Эта нога понадобится если нужно будет соединить вместе два или более драйвера.

Принцип работы с микросхемой MAX7221

По сути MAX7221 (и его аналог MAX7219) по принципу работы схож с регистром 74HC595 , с той лишь разницей что в микросхему загружается 16 бит данных. Первые загружаемые 8 бит необходимы для выбора регистра, в который нужно записать данные. Следующие 8 бит - те данные которые нужно записать в регистр. Говоря проще, сначала сообщаем микросхеме куда записать данные, а затем записываем нужные данные по выбранному адресу.

Чем интересен этот драйвер, так это тем, что он имеет два режима работы. Первый - работа в режиме обычного буфера с прямым управлением каждого сегмента.

Второй режим, так называемый BCD code B , который позволяет упростить вывод информации на индикатор за счет встроенного декодера символов. Символов кстати совсем немного, всего 16 - это цифры 0-9, знак "-", пустой символ и 4 быквы - "E", "H", "L", "P" (интересно какое слово можно составить?:)). Например, для того чтобы вывести во второй разряд цифру 2, нам нужно будет отправить адрес второго разряда (8 бит) и затем просто отправить двойку (еще 8 бит). Об этом режиме работы поговорим в следующей статье, сейчас же будет рассмотрен пример как работать с драйвером в режиме без декодирования.

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

Регистр No Op понадобится при совместном подключении нескольких драйверов. Для того, чтобы обратиться, например, к третьему драйверу в цепочке, не влияя на работу первых двух, - нужно для первых двух обратиться к регистру "No-op". Поскольку адрес этого регистра равен нулю, то сделать это очень просто: сначала за 16 тактов отправляем данные для третьего регистра, потом устанавливаем линию данных в ноль и отщёлкиваем ещё 2 раза по 16 тактов. В результате первый отправленный пакет будет загружен в третий регистр, а следующие два пакета (загруженные в первый и второй регистры) будут иметь адрес ноль, то есть будут обращаться к регистру "No-op".

Digit 0-7 регистры, отвечающие за управление разрядами индикатора. Нумерация разрядов идет слева направо. Это очень удобно, например чтобы сменить одну цифру на индикаторе обращаемся по адресу регистра отвечающего за разряд, тем самым не трогая все остальные разряды.

Регистр Decode Mode отвечает за режимы работы драйвера, о которых говорилось чуть выше: им можно выставить режим декодирования символов BCD code B и режим без декодирования No decode.

Через регистр Intensity осуществляется программная(!) настройка яркости свечения индикатора. Удобная штука на разные случаи, от возможности энергосбережения до индикации разных режимов работы девайса. Всего можно выбрать один из 16 уровней яркости.

Регистром Scan Limit устанавливается число используемых разрядов индикатора. Если планируется использовать не все 8, а меньше, то рекомендуется отключать неиспользуемые. От этого будет зависеть частота обновления индикатора, а также пиковый ток через сегменты. Когда задействованы все 8 разрядов, частота обновления составляет около 800 Гц. При уменьшении количества разрядов частота возрастает, ее можно определить по формуле 8*800/N (где N - число разрядов). Пиковый ток через сегменты также возрастает при отключении неиспользуемых разрядов.

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

Энергопотребление в этом режиме падает до 150 мкА.

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

После запитывания все регистры драйвера сброшены, поэтому в первую очередь нужно провести настройку. Настройки драйвера (запись нужных значений в регистры Decode Mode, Intensity, Scan Limit, Shutdown и Display Test ) необходимо производить каждый раз после подачи питания, эти значения не сохраняются.

Работа с драйвером в режиме No-decode

В режиме No decode мы можем управлять каждым сегментом любого разряда напрямую. С оответствие сегментов индикатора битам в регистре Digit представлено на картинке ниже и для того чтобы зажечь определенный сегмент необходимо записать в соответствующий бит единицу .


Для примера: нам нужно вывести в первый разряд 8-и разрядного индикатора цифру 1. Сначала отправляем первые 8 бит адреса регистра соответствующего первому разряду (см. таблицу с картой адресов регистров). Нумерация разрядов индикатора идет слева направо (вот таким образом 0.1.2.3.4.5.6.7.), поэтому первый справа разряд (Digit 7), будет иметь адрес &h08 , это значение и отправляем. Затем отправляем данные которые должны включить сегменты В и С, по таблице соответствия (см. выше) за эти сегменты отвечают биты D5 и D4. Таким образом следующие 8 бит которые мы должны отправить будут такие: 00110000 , или если в шестнадцатеричном представлении - &h48 . Подобным образом можем управлять и другими разрядами и сегментами индикатора. Ничего сложного, правда? ;)

А теперь небольшой рабочий пример. У меня оказался только четырехразрядный индикатор, для демонстрации возможностей вполне сгодится. Соединил по схеме ниже. Неиспользуемые выводы можно оставлять болтаться в воздухе. Микроконтроллер Attiny2313 тактируется от внутреннего генератора на 8 МГц, напряжение питания схемы 5 вольт.

Демо код в Bascom-AVR

$regfile = "attiny2313.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 10
$framesize = 40

Config Portd = Output

Cs Alias Portd . 1
Ser_clk Alias Portd . 2
Ser_data Alias Portd . 3

Dim A As Word
Dim Digit (8 ) as Byte
Dim Y As Byte
Dim Disp_num As Byte
Dim Disp_data As Byte
Dim Digit_str As String * 4
Dim Temp_str As String * 3
Gosub Max7219_setup

Digit_str = "Good" "строка которую выведем на дисплей
Gosub Prepare "вызываем подпрограмму подготовки и отправки данных

Wait 3

Do "в главном цикле просто выводим увеличивающее на 1 число
Waitms 200
Incr A "переменная значение которой выводим на индикатор
Digit_str = Str (a )
Digit_str = Format (digit_str , "0000" )
Gosub Prepare
Loop

End

"Подготовка данных для передачи
Prepare :
Do
For Y = 1 To 4
Temp_str = Mid (digit_str , Y , 1 )
Select Case Temp_str
Case "0" : Temp_str = "126" "&b01111110
Case "1" : Temp_str = "48" "&b00110000
Case "2" : Temp_str = "109" "&b01101101
Case "3" : Temp_str = "121" "&b01111001
Case "4" : Temp_str = "51" "&b00110011
Case "5" : Temp_str = "91" "&b01011011
Case "6" : Temp_str = "95" "&b01011111
Case "7" : Temp_str = "112" "&b01110000
Case "8" : Temp_str = "127" "&b01111111
Case "9" : Temp_str = "123" "&b01111011
Case "." : Temp_str = "128" "&b10000000
"можно и самостоятельно ввести нужные символы
Case "A" : Temp_str = "119" "&b01110111
Case "C" : Temp_str = "78" "&b01001110
Case "E" : Temp_str = "79" "&b01001111
Case "G" : Temp_str = "94" "&b01011110
Case "o" : Temp_str = "29" "&b00011101
Case "d" : Temp_str = "61" "&b00111101
Case " " : Temp_str = "0" "&b00000000
"и так далее...
End Select
Digit (y ) = Val (temp_str )

Disp_num = Y "знакоместо (разряд) на который выводим текущую цифру

Disp_data = Digit (y ) "данные которые отправляем на выбранный разряд
Gosub Disp_write
Next Y
Loop Until Y = 5 "когда вывели данные на все 4 разряда возвращаемся в главный цикл
Return

"Передаем данные в max7221
Disp_write :
Ser_data = 0
Ser_clk = 0
Cs = 0
Shiftout Ser_data , Ser_clk , Disp_num , 1 "отправляем номер разряда
Shiftout Ser_data , Ser_clk , Disp_data , 1 "отправляем данные в этот разряд
Cs = 1
Return

"инициализации и настройка регистров max7221
Max7219_setup :
Disp_num = & H0C : Disp_data = 0 "режим Shutdown (0-включен, 1-выключен)
Gosub Disp_write
Disp_num = & H09 : Disp_data = 0 "режим прямого управления сегментами индикатора
Gosub Disp_write
Disp_num = & H0A : Disp_data = 10 "уровень свечения сегментов (0-минимум, 15-максимум)
Gosub Disp_write
Disp_num = & H0B : Disp_data = 3 "число используемых разрядов (счет от 0)
Gosub Disp_write
Disp_num = & H0F : Disp_data = 0 "тестовый режим выключен (0-выключен, 1-включен)
Gosub Disp_write
Disp_num = & H0C : Disp_data = 1
Gosub Disp_write
Return



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