Русификация TFT-дисплея с контроллером RA8875
- Войдите на сайт для отправки комментариев
Ср, 03/04/2019 - 10:25
Всем добрый день.
Купил 7" дюймовый дисплей с контроллером RA8875 https://www.buydisplay.com/default/serial-spi-arduino-7-inch-tft-lcd-touch-shield-ra8875-for-mega-due-uno
В контроллере не предусмотрена кириллица, поэтому пришлось купить там же микросхему флэш-памяти с прошивкой кириллицы. Вывод фонтов на экран занял некоторое время, но благодаря negavoid (СПАСИБО БОЛЬШОЕ!)
подкорректировал скетч и получилось (см.фото).
//*********************************************************************************** //Проверка функции преобразования UTF-8 в коды фонтов флэш-памяти ER3304-1(GT30H32S4W) //*********************************************************************************** #include <SPI.h> #include <RA8875.h> #include <SD.h> #define sd_cs 5 //Arduino mega2560 #define RA8875_INT 4 #define RA8875_CS 10 #define RA8875_RESET 9 RA8875 tft = RA8875(RA8875_CS,RA8875_RESET); void setup() { Serial.begin(9600); if (!SD.begin(sd_cs)) { Serial.println("initialization failed!"); return; } Serial.println("RA8875 start"); //initialization routine tft.begin(RA8875_800x480); Serial.println("Found RA8875"); tft.setExternalFontRom (GT30H32S4W,GB2312,STANDARD); //Установка внешней памяти tft.setFont(EXT); tft.setExtFontFamily( ARIAL,true); tft.fillScreen(RA8875_BLACK);//fill screen black tft.changeMode(TEXT); tft.setTextColor(RA8875_RED); //проверка вывода больших цифр tft.setFontScale(3); tft.setFontSize(X32,false); tft.setCursor(30,0); tft.println("0123456789"); tft.setFontSize(X24,false); tft.setCursor(30,110); tft.println("0123456789 x24"); tft.setFontSize(X16,false); tft.setCursor(30,200); tft.println("0123456789 x16"); tft.drawRect(0,0,799,479,RA8875_CYAN); } void loop() { tft.setTextColor(RA8875_GREEN); tft.setFontSize(X24,false); tft.setFontScale(0);//font x1 tft.setCursor (50,350); tft.setExternalFontRom (GT30H32S4W,GB2312,STANDARD); tft.setFont(EXT); tft.setExtFontFamily( ROMAN,true); //установка нового фонта tft.setCursor(10,350); String str1 = utf8rus_ROM("АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ_ABCDEFGHIJKLMNOPQRSTUVWXYZ\ _аввгдеёжзиклмнопрстуфхцчшщъыьэюя_abcdefghijklmnopqrstuvwxyz_01234567890!" ); tft.println( str1); delay(1000); } /*-------- Recode russian fonts from UTF-8 to ROM ----------*/ String utf8rus_ROM(String source) { int i, k; String target; unsigned char n; char m[3] = {'\xA7','0', '\0' }; //кириллица расположена в памяти с адреса 0xA7,0xA1-А(см.DATASHEET) char h[2] = {'0', '\0' }; //латиница k = source.length(); i = 0; while (i < k) { n = source[i]; i++; if (n >= 0xC0) { switch (n) { case 0xD0: { n = source[i]; i++; if (n == 0x81) { n = 0xA7; break; } // Ё if ((n>=0x90) && (n<=0x95)) {n = n + 0x11; break;} // от А до Е if ((n>=0x96) && (n<=0xA0)) {n = n + 0x12; break;} // от Ж до Я if ((n >= 0xA0) && (n <= 0xAF)) {n = n + 0x12; break;} // от Р до Я if ((n >= 0xB0) && (n <= 0xB5)) {n = n + 0x21; break;} // от а до е if ((n >= 0xB6) && (n <= 0xBF)) {n = n + 0x22; break;} // от а до е } case 0xD1: { n = source[i]; i++; if (n == 0x91) {n = 0xD7; break; } // ё if (n >= 0x80 && n <= 0x8F) n = n + 0x62; break; } // от р до я } m[1]=n; target = target + String(m); tft.setFontSpacing (0); } else { h[0]=n; target = target + String(h); tft.setFontSpacing (6); // подборка разрядки шрифта латиницы } } return target; }
Зачем в функции utf8rus_ROM() в цикле стоят строки tft.setFontSpacing (0) ? Расстояние между символами запоминается в строке?
Если в строке 100 написать n <= 0xAF, то строка 101 будет не нужна.
Исходный код и описание функции utf8rus() здесь: http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafru...
Добрый день.
3. Выражаю Вам arduinec благодарность как автору за исходный текст преобразования. Так получилось, что мне попался вначале проект negavoid.
2. Строка 101 действительно не нужна.
1. Фонты кириллицы имеют большую ширину, чем латиница, что особенно видно при одновременном выводе и тех и других.
Спасибо за замечания.
1. Фонты кириллицы имеют большую ширину, чем латиница, что особенно видно при одновременном выводе и тех и других.
Похоже не поняли мой вопрос:
Зачем в функции utf8rus_ROM() в цикле стоят строки tft.setFontSpacing (0) ? Расстояние между символами запоминается в строке?
Если расстояние между символами не запоминается в строке, то при выходе из функции utf8rus_ROM() будет применена последняя функция tft.setFontSpacing (), а все предыдущие её установки в цикле while() пропадут. Может лучше убрать tft.setFontSpacing () из utf8rus_ROM() ?
Да, функцию tft.setFontSpacing () лучше убрать. Она была включена для проверки скорости прорисовки текста после очистки памяти.