- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Занимательная электроника - Юрий Ревич
Шрифт:
Интервал:
Закладка:
Отметим, что на свету дисплей MT-12864J при отсутствии подсветки выглядит даже лучше — больше контраст и углы обзора, а сама подсветка настолько тусклая, что при посторонней засветке экрана только снижает контраст, ухудшая различимость символов. То есть фактически она требуется только при эксплуатации экрана в темноте. Зато, вопреки ожиданиям, качество дисплея в отсутствии подсветки оказалось вполне на высоте.
Скачать библиотеку GLCD можно с официального ресурса по ссылке, приведенной в сноске 5. На момент подготовки этой книги последняя версия библиотеки носит номер 3. Распакуйте ее, как обычно, в папку libraries каталога Arduino. Так как мы меняли контакты, то для начала файл библиотеки, где обозначены выводы, придется «причесать» в соответствии с нашими потребностями. Для этого разыщите в папке librariesglcdconfig файл ks0108_Arduino.h. Согласно схеме (см. рис. 21.4), установите следующие выводы (в листинге приводятся только строки файла, которые подлежат правке, а старые номера выводов закомментированы):
#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 //1
#define glcdCSEL1 10 //14
#define glcdCSEL2 11 //15
#define glcdRW 12 //16
#define glcdDI 11 //15
#define glcdEN 14 //18
Русификация модуля MT-12864JНикакого специального текстового режима в модулях MT-12864J не существует. Текст в них выводится просто как картинка, для чего имеются таблицы шрифтов в виде специальной функции, вызываемой через оператор SeiectFont. Чтобы русифицировать этот индикатор, для него придется создать шрифт с русскими символами. Причем создать «руками» — рекомендуемый в описании библиотеки конвертер шрифтов Windows, к сожалению, не понимает никаких символов, кроме служебных и английских. Это объясняется тем, что в UTF-8, принятой в качестве кодировки для файлов Arduino IDE, только эти символы из стандартной таблицы ASCII однозначно переводятся в однобайтовую кодировку. Нет никаких сомнений, что авторы конвертера могли бы с этой проблемой справиться, — но только представьте, какой объем работы им пришлось бы провернуть, чтобы охватить всего десяток-другой самых популярных языков? Так что простим их и вспомним, что благодаря открытому коду все в наших руках.
Для этого мы модернизируем имеющийся в комплекте библиотеки GLCD английский шрифт 5x7 точек, размещающийся в файле SystemFont5x7.h (папка fonts). Никакие особые инструменты для этого не нужны — немного поразмыслив над приведенными там кодами (для наглядности каждый байт следует разложить в двоичное представление и записать все пять штук один над другим), вы легко разберетесь в принципе устройства таблицы и сможете ее менять и дополнять без какого-либо визуального редактора. Вот как, например, кодируется заглавная буква «Р» в этой системе (последовательность 0x7F, 0x09, 0x09, 0x09, 0х06):
01111111 0x7F
00001001 0x09
00001001 0x09
00001001 0x09
00000110 0x06
Если вы еще не догадались, то мысленно поверните байтовый массив на 90 градусов влево, и вы увидите букву «Р», образованную единицами. Хитрость дополнения имеющейся таблицы состоит только в том, чтобы русские буквы соответствовали их кодам, получающимся при компиляции текстового файла с программой, — вводить текст в программе через номера кодов не слишком удобно, приятнее писать его прямо по-русски.
Правила Arduino IDE для кодирования символов второй половины байтовой таблицы символов (т. е. с номерами более 127) соответствуют младшему байту кодировки UTF-8 (именно в ней сохраняется текстовый файл программы. ino). В русскоязычной части таблицы UTF-8 младшие байты кодов с 80h no 8Fh занимают строчные буквы от «р» до «я», далее идут подряд 32 заглавные от «А» до «Я» (исключая букву «Ё»), а в кодах от B0h до BFh размещены оставшиеся строчные от «а» до «п». Таким образом у нас еще остается в конце байтовой таблицы незадействованная часть размером в целых 64 символа (с кодами от C0h до FFh), куда можно при надобности поместить различные служебные символы, отсутствующие в оригинале (вроде степеней или индексов). При самостоятельном дополнении таблицы не забывайте, что номера символов должны идти подряд, начиная с указанного в заголовке функции System5x7 кода 0x20 (что соответствует пробелу во всех разновидностях кодировок, основанных на ASCII). А общее количество символов следует указать в последнем параметре функции — в оригинале там стоит 0x60 (десятичное 96), у нас это число возрастает до 0хА0 (160).
Один из таких отсутствующих символов нам понадобится уже в следующей главе — ни в системном английском шрифте, ни в доработанных разными умельцами вариантах не содержится значка градуса. Чтобы больше ничего не менять в заголовке файла, мы не будем дополнять таблицу, а подставим этот- значок вместо одного из редко используемых символов. Закодированный в этой системе символ градуса будет выглядеть так: 0х00, 0х00, 0x0f, 0x09, 0x0f. Для замены я выбрал знак «» («обратный слэш»), номер которого в таблице равен 0х5С. Вместо значка градуса в операторе вывода тогда придется указывать либо его код (в среде Arduino IDE это удобнее делать в восьмеричном виде так: «134»), либо просто двойной «обратный слэш» в соответствии с правилами синтаксиса языка С.
Кроме указанных изменений, в этом шрифте я исправил цифру 0 — вместо перечеркнутого «0» скопировал для символа 0x30 строку для буквы «О» (символ номер 0x4F). Перечеркнутый ноль давно удален из всех шрифтов в пользовательских устройствах, что иногда даже бывает неудобно, — например, когда требуется воспроизвести пароль с цифрами и буквами вперемешку. И только в таблицах шрифтов для подобных индикаторов он по инерции задержался с доисторических времен господства АЦПУ и алфавитно-цифровых терминалов, но в современном антураже выглядит довольно дико. Обидно, что для строчных дисплеев со встроенными шрифтами, подобных тем, что вы также увидите в следующей главе, этот символ так просто исправить не удастся.
Архив с файлом русифицированного шрифта под именем SystemFont5x7R.h вы можете скачать с сайта автора (http://revich.lib.ru/AVR/Rus_Lcd.zip). При его создании использованы наработки пользователя SkyFort с сайта Robocraft.ru, который и проделал основную работу по прорисовке русских символов и переводу их в hex-коды, применяя какой-то хитрый софт. Файлы шрифта можно размещать прямо в папке с библиотекой GLCD (там же, где размещается файл библиотеки glcd.h) или в ее подпапке fonts. В последнем случае в директиве #include к имени файла придется добавлять название каталога (ПО образцу: #include "fonts/SystemFont5x7.h"). В том же архиве имеется файл тестовой программы-примера ProbaJ_CD.ino, который выводит подряд символы русского алфавита и цифр, значок градуса и в нижней строке — наименование дисплея «MT-12864J»:
#include <glcd.h> //подключим библиотеку
#include "SystemFont5x7R.h" //файл шрифта
void setup () {
GLCD.Init(); //инициализация
GLCD. ClearScreen ();
}
void loop ()
{
GLCD.SelectFont(System5x7); //выбираем шрифт
GLCD.CursorToXY(0,0); //установим курсор в начальную позицию
GLCD. println ("АБВГДЕЖЗИЙКЛМНОП");
GLCD.println("PCTyOXU41imbbIb3roH");
GLCD.println ("абвгдежзийклмноп");
GLCD.println("рстуфхцчшщъыьэюя");
GLCD.println("1234567890");
GLCD.CursorToXY(19*6,4*8); //установим курсор в предпоследнюю позицию 5-й строки
GLCD.print(\С); //градус С
GLCD.CursorToXY(4*6,7*8); //установим курсор в позицию 4 строки 8
GLCD.print("MT-12864J");
}
Из приведенного примера понятно, как обращаться с текстом при выводе. Текстовая зона с данным шрифтом содержит 8 строк по 21-му символу в каждой. При выводе строки длиннее 21 символа, ее конец автоматически перейдет на другую строку. Для принудительного перевода строки используйте функцию GLCD.println ().
Чтобы правильно позиционировать вывод текста, следует иметь в виду, что библиотечная функция cursorToXY() рассчитана на графический экран 128x64 точки. По этой причине при выводе текста указывать положение курсора удобно так, как показано в примере, с учетом того, что символ занимает 6 точек по ширине, а строка — 8 точек по высоте. Поскольку позиции в строке и сами строки нумеруются с нуля, то вывод символа в предпоследнюю (20-ю, т. е. номер 19) позицию пятой (т. е. номер 4) строки предваряем оператором cursorToXY (19*6,4*8).
Обратите внимание, что вывод на такой дисплей всегда должен начинаться с функции установки курсора на определенную позицию — чтобы выводимые символы заменяли старые на том же месте. Иначе в следующем цикле функции loop () строки быстро поползут вверх, не давая разглядеть результата. Результат выполнения тестовой программы приведен на рис. 21.5. Фото сделано при выключенной подсветке — на снимке она была бы практически не видна.

