Графический дисплей MT-12864J компании Мэлт входит в комплект поставки отладочной платы микроконтроллера К1986ВЕ92QI компании «Миландр». Поэтому вопрос управления им интересует многих пользователей отладочного комплекта. Настоящая статья посвящена разработке дисплейного драйвера, совместимого с API драйверов графических дисплеев компании Keil и описываемого заголовочным файлом GLCD.h.
До недавнего времени авторы этой статьи в своих разработках не использовали графический дисплей MT-12864J, полагая его возможности избыточными и с успехом применяя вместо него символьные дисплеи MT-16S2D и MT-20S4M. Наличие вариантов с напряжением питания 3 В и Windows-совместимая встроенная кодовая страница на базе CP1251 делали дисплеи MT-16S2D и MT-20S4M удобным решением для большинства приборов.
Однако со временем возникла необходимость формировать не только текстовые меню, но и графические изображения. Поэтому в перспективное изделие был заложен дисплей MT-12864J. Для знакомства с возможностями дисплея для отладочной платы компании «Миландр» был разработан драйвер дисплея и ряд демонстрационных проектов. В процессе разработки драйвера и демонстрационных программ были выявлены возможности дисплея, которые могут быть полезны и для приборов с полностью текстовым меню:
К сожалению, более широкие возможности дисплея ведут к усложнению программного драйвера, и задача его разработки не выглядит столь тривиальной, как для символьных дисплеев.
Согласно спецификации на сайте производителя [1], основу дисплея MT-12864J составляют два микроконтроллера К145ВГ10 производства компании «Ангстрем». Каждый из них отвечает только за часть изображения. То есть для вывода изображения на левую половину дисплея (64 × 64 пикселя) необходимо выбрать один контроллер, а для вывода изображения на правую – другой. Выбор соответствующего контроллера осуществляется установкой сигнала логического нуля на выводе E1 или E2.
Для программиста каждый из контроллеров представляет собой подобие статического ОЗУ, разделённого на 8 страниц по 64 байта каждая. Каждый байт может быть записан либо считан с помощью определённой последовательности команд.
Обмен микроконтроллера с дисплеем производится по восьмиразрядной параллельной шине, дополненной рядом управляющих сигналов. Назначение сигналов указано в таблице 1. Там же указаны и порты микроконтроллера К1986ВЕ92QI (маркировка MDR32F9Q2I), к которым подключены соответствующие выводы дисплея.
Система команд одинакова для обоих контроллеров К145ВГ10 и представлена в таблице 2.
Программисту доступны следующие команды:
В режиме данных доступны функции чтения и записи. После чтения данных из активного байта активной страницы ОЗУ контроллера дисплея происходит инкремент адреса байта. Поэтому есть возможность последовательной записи нескольких байтов в дисплей, что может ускорить определённые процедуры чтения и записи.
Как и символьные дисплеи MT-16S2 и MT-20S4, дисплей MT-12864J имеет регистр статуса, который считывается в режиме команд. Назначения битов регистра показаны в таблице 3.
Дисплей MT-12864J не имеет встроенного знакогенератора, поэтому обеспечение дисплея шрифтами – задача программиста. Это, с одной стороны, усложняет управляющую программу, но с другой – позволяет создавать собственные шрифты, не ограничиваясь ни размерами, ни начертанием, ни кодовой таблицей (в символьных дисплеях компании Мэлт присутствуют только две кодовые таблицы: совместимая с кодовой таблицей дисплеев на контроллере HD44700 и альтернативная, совместимая с CP1251). Кроме того, существует возможность инверсного выделения текста.
Для подключения драйверов графических дисплеев компанией Keil разработан специальный программный интерфейс. Прототипы функций драйвера дисплея определены в заголовочном файле GLCD.h и представлены в таблице 4.
Данный файл можно найти, например, в каталоге типа C:\Каталог установки Keil\ARM\Boards\Keil\MCBSTM32C\LCD_Blinky (информация справедлива для версий Keil MDK 4.x. В Keil MDK 5 этот файл, возможно, содержится в пакете поддержки микроконтроллеров STM32 или AT91SAM3x). Изначально, как можно увидеть из примеров программ (листингов), данный API предполагался для управления цветными графическими дисплеями, что следует и из наличия кодов, определяющих различные цвета. Однако для монохромных дисплеев также возможно создание драйверов, содержащих практически все функции, определённые данным API и заголовочным файлом. Название файла драйвера дисплея должно начинаться с GLCD. Например, GLCD_SPI_STM32.c. Текст драйвера дисплея MT-12864J находится в файле GLCD_MT12864.c.
Разработанный драйвер имеет ряд ограничений и особенностей, отличающих его от прототипа:
Дисплей MT-12864J получил широкое распространение среди радиолюбителей и профессионалов. Для различных микроконтроллеров были сделаны собственные драйверы данного дисплея, на которые авторы данной статьи опирались в процессе разработки. В частности, драйвер для близкого по архитектуре дисплея MT-12864A, описанный в статье «Подключаем MT-12864-2YLG» [2].
Основу драйвера дисплея составляют следующие функции:
Данные функции позволяют реализовать обмен данными с дисплеем для вывода на него различной информации – как текстов, так и графических изображений, что доступно для разработчика через функции драйвера.
В спецификации на дисплей [1] начальная настройка описывается как установка на входе RES состояния логического нуля, удержание его в течение 1 мкс и ожидание сброса флагов BUSY и RESET в регистре состояния дисплея.
Однако драйвер, представленный автором статьи «Подключаем MT-12864-2YLG» [2], предполагает более сложную процедуру инициализации:
С программной реализацией данной функции можно ознакомиться в файле GLCD_MT12864.c любого из проектов, выложенных в дополнительных материалах к статье на сайте www.soel.ru (функция GLCD_init()).
В самом начале функции производится настройка всех портов, на выводах которых формируются сигналы управления дисплеем (см. табл. 1). В дальнейшем все управляющие сигналы устанавливаются в состояние логического нуля, в том числе и сигнал сброса. Через 100 мс сигнал сброса восстанавливается в состояние логической единицы. После этого установкой логической единицы на выводе E1 выбирается первый контроллер К145ВГ10 дисплея, отвечающий за левую половину экрана. Контроллеру передаются команды включения дисплея, установки активной ячейки памяти и первой отображаемой строки.
После передачи команд сигнал выбора контроллера снимается и выбирается второй контроллер, отвечающий за правую половину дисплея. Функция ожидает снятия сигнала занятости контроллера и снова передаёт те же команды.
Временны¢е диаграммы сигналов на выводах дисплея показаны в спецификации [1]. Гораздо интереснее посмотреть, как это выглядит с точки зрения программиста. Блок-схема алгоритма записи байта в контроллер показана на рисунке 1, программная реализация содержится в функции LCD_write() файла GLCD_MT12864.c из дополнительных материалов к статье.
Как видно из листинга, в функции отсутствуют процедуры ожидания сброса сигнала занятости и перевода дисплея в режим команд или режим данных. Эти операции вынесены из функции и реализуются в отдельных функциях: передачи команд и передачи данных, описанных в лис-тингах 1 и 2.
Как видно из листингов и блок-схемы алгоритма, ожидание сброса сигнала занятости вынесено в отдельную функцию. Блок-схема алгоритма ожидания сброса сигнала занятости показана на рисунке 2, а программная реализация данного алгоритма представлена в функциях файла GLCD_MT12864.c – LCD_read_status() и LCD_wait_busy() соответственно.
Как и в случае записи, считывание байта и ожидание сброса флага реализованы в разных функциях. Аналогично чтению регистра статуса реализована функция чтения данных из дисплея. В этот раз авторы не стали делать одну функцию чтения байта. Единственное отличие функции чтения данных (LCD_read_data()) в том, что дисплей переводится в режим данных сигналом на выводе A0.
Ещё одна функция – очистка дисплея, которая заливает весь дисплей цветом, указанным, как цвет фона. Фактически, всё сводится к записи в каждую ячейку памяти значения 0x00 или 0xFF. С программной реализацией данной функции также можно ознакомиться в файле GLCD_MT12864.c – функция GLCD_Clear().
Основной задачей дисплея является вывод текстовой информации. Поэтому следующими по важности после функций инициализации и обмена данными с контроллером являются функции вывода на экран текстовой информации. Так как дисплей не имеет собственного знакогенератора, то актуальным является вопрос выбора шрифтов, которые будут использоваться для вывода текстов.
В составе примеров Keil поставляются два шрифта: 6 × 8 и 12 × 16 пикселей. Однако структура данных шрифтов для дисплея MT-12864J не является оптимальной. На рисунке 3 показана структура символа «1» для шрифта 8 × 6, предлагаемого компанией Keil (файл Font_6x8h.h). Как видно из рисунка, символ представляет собой массив значений, каждое из которых описывает расстановку пикселей в одной из восьми строк.
Для дисплея MT-12864J более подходящим является шрифт, структура которого показана на рисунке 4. Здесь значения массива описывают расстановку пикселей в столбцах. Такой структуре соответствует шрифт в проекте «Подключаем MT-12864-2YLG» [2] (размер символа 5 × 8 пикселей), однако таблица шрифта несовместима с CP1251, что ведёт к усложнению функции вывода символов на дисплей.
В обсуждении на форуме разработчиков электроники [3] был выложен проект с комплектом из четырёх шрифтов, совместимых с кодовой таблицей CP1251 [4]. Каждый шрифт находится в отдельном заголовочном файле. Пользователю доступны шрифты размером символа 6 × 8, 12 × 16 пикселей, а также два шрифта размером 7 × 10 пикселей: нормальный и полужирный.
Для использования данных шрифтов вместе с программой в файлы были внесены определённые изменения:
После внесения изменений заголовочные файлы с таблицами знакогенератора были подключены к проекту. Непосредственный вывод символа на дисплей осуществляется функцией GLCD_DrawChar(), среди параметров которой передаются координаты начальной точки символа, ширина и высота символа, а также указатель на массив, описывающий начертание символа в таблице знакогенератора (см. табл. 4). В качестве прототипа была взята функция вывода символов на дисплей из проекта «Подключаем MT-12864-2YLG» [2].
Данная функция позволяет выводить на дисплей символы с произвольным расположением начальной точки, поэтому предусмотрена возможность вывода символа, не вписывающегося в одну страницу. Для символов размером 7 × 10 пикселей предусмотрена также возможность вывода символа, не вписывающегося в две страницы. Также драйвер предусматривает функции вывода символа с указанием строки и знакоместа и вывода символьной строки: GLCD_DisplayChar() и GLCD_DisplayString() соответственно. В качестве параметра fi передаётся тип шрифта, используемого при выводе символа. В прототипе данный параметр может принимать значение «0» для шрифта 6 × 8 пикселей и «1» для шрифта 12 × 16 пикселей. В разработанном драйвере значение «0» соответствует шрифту 6 × 8 пикселей, значение «1» соответствует нормальному шрифту 7 × 10 пикселей, значение «2» соответствует полужирному шрифту 7 × 10 пикселей, а значение «3» – шрифту 12 × 16 пикселей. На рисунке 5 показаны все четыре шрифта на экране дисплея.
Также для работы с текстовой информацией предназначена функция очистки строки. В примерах Keil данная задача решается выводом на дисплей строки с пробелами. Так как разработанный драйвер использует шрифты с шириной, не кратной 8 (что не позволяет заполнить всю строку целым количеством пробелов), был применён метод, сходный с очисткой дисплея: заполнение всех ячеек памяти выбранной страницы памяти значениями 0x00 или 0xFF в зависимости от установленного цвета фона. Для шрифта 7 × 10 пикселей была предусмотрена ситуация, когда очищаемая строка занимает страницу только частично. Фрагмент кода, иллюстрирующий очистку строки высотой 8 пикселей, приведён в листинге 3.
Практически все графические возможности драйвера базируются на функции вывода на экран пикселя с заданными координатами. Данная функция также взята из проекта «Подключаем MT-12864-2YLG» [2] и сводится к следующей последовательности операций:
Программно данная процедура реализуется функцией GLCD_PutPixel() драйвера GLCD_MT12864.c.
Данная функция используется для вывода на экран прямоугольника в функции GLCD_Bargraph(). Сначала в цикле производится вывод на экран границ прямоугольника, а после – заливка цветом текста части, определённой параметром val в процентах, и остальной части – цветом фона. С программной реализацией данной функции также можно ознакомиться в тексте драйвера GLCD_MT12864.c.
Наиболее интересной является функция вывода битового поля GLCD_Bitmap(). Данная функция позволяет вывести на дисплей рисунок, описанный в виде массива значений. Для получения такого массива значений в составе среды Keil uVision присутствует программа Bitmap converter for emWin (C:\Каталог установки Keil\ARM\Segger\emWin\Tool\BmpCvt.exe).
Данная программа позволяет конвертировать любое графическое изображение в различные цветовые форматы, а также сохранять его либо в формате BMP, либо в виде файла с расширением *.c, содержащего массив, описывающий изображение в виде битового поля.
На взгляд авторов, формат лучше всего подходит для преобразования изображений типа «256 градаций серого». В этом случае каждый пиксель изображения описывается одним байтом массива, что облегчает работу с ним.
Для преобразования необходимо открыть исходный графический файл командой File->Open. В окне программы откроется графический файл, а также будут выведены его параметры: разрешение, цветовой формат и коэффициент увеличения программой – zoom (см. рис. 6).
Преобразование цветовой гаммы осуществляется в меню, выпадающем по команде Image->Convert Into (см. рис. 7).
После преобразования в режим «256 градаций серого» (Gray256) изображение выглядит так, как это показано на рисунке 8.
Сохранить преобразованное изображение можно командой File->Save As. В выпадающем меню можно выбрать тип файла. В данном случае это будет «C» bitmap file. После нажатия на кнопку сохранения появится диалоговое окно выбора формата, в котором будет сохранён массив, описывающий изображение. Здесь можно выбрать другой формат, не соответствующий тому, в который было преобразовано изображение (например, можно преобразовать исходное изображение в формат с четырьмя градациями серого, но сохранить в формате «256 градаций серого»). После выбора формата и нажатия кнопки «OK» файл будет сохранён.
Сохранённый файл содержит следующие элементы:
Для демонстрационного проекта будет достаточно массива битового поля. Однако структура, описывающая битовое поле, имеет ряд полезных параметров, которые желательно также сохранить в тексте программы.
Авторы поместили массив битового поля в заголовочный файл, изменив его тип на static unsigned char (возможно также указать тип const unsigned char). Размер изображения в пикселях функция вывода на дисплей битового поля получает в качестве параметров (см. табл. 4). В каждом байте массива находится значение, определяющее степень градации серого у описываемого пикселя. Значение 0x00 соответствует «чёрному» пикселю, а значение 0xFF – «белому». Остальные значения описывают различные степени градации серого. Так как дисплей MT-12864J может воспроизводить только «белые» и «чёрные» пиксели, то в функции производится сравнение значения элемента массива с числом 0x7F, на основании результатов которого определяется цвет пикселя. Если число в массиве больше 0x7F, то цвет пикселя «белый». В противном случае пиксель закрашивается «чёрным» цветом. Фрагмент функции вывода на дисплей битового поля показан в листинге 4.
Образец выведенного на дисплей преобразованного графического изо-бражения показан на рисунке 9. В определённых случаях оказывалось, что с «границей белого», равной 0x7F, качество изображения страдало (см. рис. 10), а само изображение получалось более контрастным в режиме четырёх градаций серого (см. рис. 11).
Последней функцией драйвера, используемой для работы с графическими, а также текстовыми объектами, является функция вертикального скроллинга. В настоящем драйвере она реализована методом копирования одной области экрана в другую с помощью массива. Блок-схема алгоритма приведена на рисунке 12.
Программно данный алгоритм реализуется функцией GLCD_ScrollVertical() драйвера дисплея.
Драйвер дисплея был испытан на отладочной плате микроконтроллера К1986ВЕ92QI и показал хорошие результаты. В дальнейшем, с внесением определённых изменений, планируется его использование для реализации различных меню в разрабатываемых приборах и устройствах [5].
Биоразлагаемые источники питания: необычные технические решения и перспективы
В статье приводятся сведения об инновационных разработках безопасных биоразлагаемых элементов питания как предтечи создания съедобных электронных модулей и блоков для медицинской диагностики организма человека, повышения его живучести и приумножения энергетического потенциала. Черпая вдохновение в свойствах живых организмов, ферментов, использующих окислительно-восстановительные кофакторы для биогенераторов, автор представляет описание перезаряжаемой съедобной АКБ из доступных материалов в проекции создания и других природных источников возобновляемой энергии. 13.09.2024 СЭ №7/2024 457 0 0Россия и все остальные: перспективное партнёрство в области современных электронных технологий, поставок и кадров
В последние годы ориентация сотрудничества российских разработчиков РЭА с международными коллегами и цепочки поставок компонент для РЭА меняются. В ответ на вызовы времени идёт поиск новых поставщиков и новых зарубежных партнёров, рынки которых перенасыщены инвестициями и в целом – заняты. В этой ситуации в поиске взаимовыгодных путей применяют креативные решения. В обзоре рассматриваются временные трудности и перспективы, с которыми сталкиваются разработчики в России, а также особенности и решения, влияющие на достойный выход из кризиса. 13.09.2024 СЭ №7/2024 383 0 0Биометрические системы, информационные киоски (БИК), турникеты и шлюзы с АСО. Обзор оборудования, компонентов и особенностей установки
Повсеместно биометрическую идентификацию рассматривают как перспективный инструмент для быстрых и безопасных операций почти универсального (в самых различных сферах) применения. Несколько лет назад появились биометрические информационные киоски, турникеты и шлюзы. Эти модели постоянно совершенствуются. О новинках, связанных с расширением функционала и защиты современного оборудования, ставших возможными профессиональными усилиями разработчиков РЭА и производителей оборудования, предлагаем ознакомиться в нашем обзоре. Основной акцент в формате импортозамещения современной электроники сделан на серийные модели отечественных производителей. 04.09.2024 СЭ №6/2024 589 0 0Аккумулятор 18650 для радиоканала
Аккумуляторы 18650 имеют рабочие напряжения 3…4,2 В, что не позволяет использовать их непосредственно в схемах с 5-вольтовым питанием. В статье предложено схемное решение формирования требуемого значения напряжения методом накопления импульсов самоиндукции от дросселя. С целью уменьшения потребления энергии формируется режим «сна» для используемого микроконтроллера 12F675 и радиомодуля HC12 в комбинации с отключением общего провода других потребителей энергии электронным ключом на полевом транзисторе. Приведена методика расчёта длительности работы на аккумуляторе в режиме «измерение-сон». 02.09.2024 СЭ №6/2024 402 0 0