Автор: Юрий Всеволодович Ревич
Работа с текстом на графическом дисплее MT-12864J
Адаптированный отрывок из книги , 3-е издание.
О том, как подключать ЖК-матрицу 128х64 точек MT-12864J и использовать ее для вывода изображений, рассказывается во многих источниках.Здесь мы подробнее остановимся на некоторых нюансах практического применения подобных ЖК-матриц на основе контроллера ks0108, а также рассмотрим их использование для вывода текста с помощью готовых шрифтов из библиотеки
, и вопросы ее модернизации для вывода кириллических символов.
Подключение MT-12864J
К сожалению, контроллер ks0108 имеет параллельный восьмибитовый интерфейс, и с учетом управляющих выводов придется занять аж 13 функциональных контактов платы Arduino Uno. Число соединений можно сократить, если подключить ЖК-модуль через сдвиговый регистр или, что еще проще, дешифратор двоичного кода. В первом случае число линий данных сократится с восьми до одной плюс линия импульсов сдвига, во втором — до трех. Но в обоих случаях о стандартной библиотеке придется забыть, создавать свои схемы подключения и писать свои процедуры вывода.
Потому мы используем стандартный способ, но внесем в него некоторые изменения. Использовать именно те выводы Arduino, что предусмотрены библиотекой GLCD по умолчанию (см. таблицу в указанной или в описании библиотеки , где матрице MT-12864J соответствует вариант «Pinout A»), при таком их количестве не только неудобно, но часто просто невозможно. Не забудем, что ведь мы еще подключаем к контроллеру всякие другие устройства по стандартным коммуникационным портам, и стоит постараться не занимать их выводы по максимуму.
Схема подключения MT-12864J к Arduino Uno
Модернизированная с учетом этого обстоятельства схема подключения к Arduino Uno приведена на рис. 1. Как видите, у нас оставлены свободными контакты D1 и D2 (RX и TX последовательного порта) и контакты А4-A5, участвующие в обмене через порт I2C. Одновременная работа со стандартным подключением, например, SD-карты, требующим выводов интерфейса SPI (11, 12, 13, и, с некоторыми оговорками, 10) здесь уже оказывается невозможной.
Обратим также внимание на резисторы R1 и R2, о которых почему-то авторы статей о графических матрицах часто забывают упомянуть. Переменный или подстроечный резистор R1 служит для регулировки контрастности индикатора, и для нашей матрицы MT-12864J он требуется обязательно. На схеме он подключен так, как рекомендуется в документации фирмы МЭЛТ, однако может подключаться и по схеме потенциометра: одним концом к «земле», другим к питанию 5 В, а средним выводом к контакту Vo индикатора. Номинал его выбирается в пределах 10-20 кОм, и в конечном продукте R1 можно заменить на постоянный резистор подобранного номинала.
Резистор R2 — токоограничивающий для LED-подсветки. В принципе его можно не устанавливать вовсе (и в документации он не упоминается), поэтому на схеме он обозначен пунктиром. Согласно документации МЭЛТ, ток подсветки тогда составит около 64 мА. Установить его следует в двух случаях: если вы хотите уменьшить ток (и, соответственно, пожертвовать яркостью подсветки) или если подсветка питается от отдельного источника с повышенным напряжением. Последний вариант обычно реализуется при смешанном питании, когда при подключении к сетевому источнику подсветка запитывается от нестабилизированного выхода адаптера питания 7 9 В, а при переключении на батарейку отключается вовсе — потребление контроллера модуля при выключенной подсветке составляет всего 4 мА (на подробностях реализации этого способа мы здесь останавливаться не будем). При указанном входном напряжении (7 9 В) резистор R2 должен тогда погасить лишние 2-4 В, соответственно, его номинал должен составлять от 39 до 62 Ом.
Отмечу, что на свету дисплей MT-12864J выглядит даже лучше при отсутствии подсветки — больше контраст и углы обзора, а сама подсветка настолько тусклая, что при посторонней засветке экрана только снижает контраст, ухудшая различимость символов. То есть фактически она требуется только при эксплуатации экрана в темноте. Зато, вопреки ожиданиям, качество дисплея в отсутствии подсветки оказалось вполне на высоте.
Скачать библиотеку GLCD можно с , на момент написания этой статьи последняя версия носит номер 3. Распакуйте ее, как обычно, в папку libraries каталога Arduino. Так как мы меняли контакты, то для начала файл библиотеки, где обозначены выводы, придется причесать в соответствии с нашими потребностями. Для этого необходимо править файл ks0108_Arduino.h (папка libraries\glcd\config).Согласно схеме, установим следующие выводы (в листинге приводятся только строки файла, которые подлежат правке, закомментированы старые номера выводов):
#define glcdData0Pin 2 //8 – так было в оригинале
#define glcdData1Pin 3 //9
#define glcdData2Pin 4 //10
#define glcdData3Pin 5 //11
#define glcdData4Pin 6 //4
#define glcdData5Pin 7 //5
#define glcdData6Pin 8 //6
#define glcdData7Pin 9 //7
#define glcdCSEL1 10 //14
#define glcdCSEL2 11 //15
#define glcdRW 12 //16
#define glcdDI 13 //17
#define glcdEN 14 //18
Русификация модуля MT-12864J
Конечно, никакого специального текстового режима в модулях MT-12864J не существует. Текст в них выводится, просто, как картинка, для чего имеются таблицы шрифтов в виде специальной функции, вызываемой через оператор SelectFont. Чтобы русифицировать этот индикатор, для него придется создать шрифт с русскими символами. Причем создать руками: рекомендуемый Windows, к сожалению, в упор не понимает ничего, кроме английских символов. Это объясняется не столько презрительным отношением англосаксов к иноязычным народам, сколько тем, что в UTF-8, принятой в качестве кодировки для файлов Arduino IDE, только английские символы однозначно автоматически переводятся в однобайтовую кодировку. Нет никаких сомнений, что авторы конвертора могли бы с этой проблемой справиться — но только представьте, какой объем работы им пришлось бы провернуть, чтобы охватить всего десяток-другой самых популярных языков? Так что простим их и вспомним, что все наших руках.
Для этого мы модернизируем имеющийся в комплекте библиотеки GLCD английский шрифт 57 точек, размещающийся в файле SystemFont5x7.h (папка fonts). В принципе никакие особые инструменты для этого не нужны: немного поразмыслив над приведенными там кодами (для наглядности каждый байт следует разложить в двоичное представление и записать все пять штук один над другим), вы легко разберетесь в принципе устройства таблицы и сможете ее менять и дополнять без какого-либо визуального редактора. Вот как, например, кодируется заглавная буква «P» в этой системе (последовательность 0x7F, 0x09, 0x09, 0x09, 0x06):
01111111 0x7F
00001001 0x09
00001001 0x09
00001001 0x09
00000110 0x06
Если еще не догадались, то мысленно поверните битовый массив на 90 градусов влево, и вы увидите букву «Р», образованную единицами. Хитрость дополнения имеющейся таблицы состоит только в том, чтобы русские буквы соответствовали их кодам, получающимся при компиляции текстового файла с программой — вводить текст в программе через номера кодов не слишком удобно, приятнее писать его прямо по-русски.
Правила Arduino IDE для кодирования символов второй половины байтовой таблицы символов (т.е. с номерами более 127) соответствуют младшему байту кодировки UTF-8 (именно в ней сохраняется текстовый файл .ino). В русскоязычной части таблицы UTF-8 младшие байты кодов с 80h по 8Fh занимают строчные буквы от «р» до «я», далее идут подряд 32 заглавные от «А» до «Я» (исключая букву «Ё»), а в кодах от B0h до BFh размещены оставшиеся строчные от «а» до «п». Таким образоÐ
