Крім усього іншого, cp437font8x8 крупноват для екранчиків 128х64 точки. Оптимальним розміром шрифту для допоміжних написів на такому дисплеї залишається System5x7. Ми тут зосередимося на русифікації саме системного шрифту, хоча читач може за цим зразком самостійно русифікувати і будь-який інший шрифт (особливо, якщо у нього екран побільше).
А в чому проблема?
В процесі цього перетворення кожен символ, як і в будь-якій програмі на будь-якій мові програмування, представляється безпосередньо у вигляді його коду, тобто порядкового номера в таблиці шрифту, з якої програма витягує графічне зображення відповідного символу. У файлі шрифту System5x7.h бібліотеки openGLCD кількість символів представлено змінної font_Char_Count типу uint8_t. тобто не може перевищувати величини одного байта. Тому кириличні символи, які в UTF-8 займають два байти. не можуть бути передані контролера звичайним чином.
Попередні спроби вирішення
У нових версіях Arduino IDE стало все складніше. Бібліотека рішуче відмовляється розуміти двобайтові номера символів, виводячи замість них пусте місце, тому простий переробкою шрифту тут не обійдешся. Доводиться доповнити його функцією перекодування двобайтових символів в однобайтові.
Наприклад, для великої російської літери «Ф» рядок заміни буде такою:
Тут 0xA4 - молодший байт кодування літери «Ф» в UTF-8 (див. Посилання вище). Відповідно до цієї кодуванням складений новий файл шрифту System5x7R.h. В принципі при такому підході в шрифті можна застосовувати будь-яку кодування російських символів і будь-яких інших гліфів, які заманеться вставити в шрифт. Аби їх загальна кількість не перевищувало 128 штук: від початку таблиці до символу 0x7F (127 - останній символ стандартної таблиці ASCII) доцільно залишити шрифт в недоторканності.
Правда, пару вольностей з таблицею ASCII я собі дозволив. Справа в тому, що в оригінальному шрифті System5x7.h значок градуса винесено в останній рядок таблиці, займаючи символ 0x80, який у нас вже відноситься до кирилиці. Щоб не порушувати порядок побудови кириличної таблиці відповідно до UTF-8, цей рядок викинута з файлу. А значок градуса прибудований замість символу ASCII «
»(Номер 0x7E), який в шрифті все одно не використовувався за призначенням. Зате така заміна дозволяє вводити значок градуса в тексті скетчу прямо з клавіатури у вигляді символу «
Схема підключення MT-12864J
Змінний резистор R1 тут підключається відповідно до рекомендації виробника. а резистор R2 служить для обмеження струму підсвічування, якщо вона підключена ні до напрузі 5 В, а прямо до вхідного джерела живлення (висновок Vin Arduino) з більш високою напругою.
Приклад виведення на дисплей MT-12864J російського алфавіту упереміш з латинським, а також цифр і значка градуси, представлений на фото:
Текст скетчу для цього прикладу:
Текст скетчу з висновком російського алфавіту
Так як файли з функцією outstr.h і шрифтом System5x7R.h розміщені в кореневому каталозі модернізованої бібліотеки, то на них треба розміщувати окремі посилання на початку скетчу за допомогою директиви #include. Для англомовних написів зручно і раніше користуватися стандартними функціями println / print. а ось при необхідності переведення рядка в російській тексті необхідно явно вказувати символ «\ n».
Може, спрацює, але швидше за все немає. Я пробував скоротити алгоритм по-всякому, природно (див. Посилання на arduinec'а на початку статті). Проста заміна коду елемента рядка - напрошується. Але ніяким шляхом це не працювало - саме через те, що вихідні символи двобайтові. Рядки типу String я, чесно кажучи, не пробував, але впевнений, що там буде те ж саме: ніде не написано, що String підтримує двобайтові символи (тобто напевно не підтримує - його елементи мають тип char). Тому я плюнув на вишукування, на які пішла купа часу, і зробив тупу заміну символів безпосередньо - нехай компілятор сам розбирається. Ще й тому, до речі, що скорочення часу роботи все одно не вийде, буде тільки скорочення вихідного коду.