Русификация TFT-дисплея с контроллером RA8875

Gor_Spb
Offline
Зарегистрирован: 12.02.2019

Всем добрый день.

Купил 7" дюймовый дисплей с контроллером RA8875 https://www.buydisplay.com/default/serial-spi-arduino-7-inch-tft-lcd-touch-shield-ra8875-for-mega-due-uno

В контроллере не предусмотрена кириллица, поэтому пришлось купить там же микросхему флэш-памяти с прошивкой кириллицы.  Вывод фонтов на экран занял некоторое время, но благодаря negavoid (СПАСИБО БОЛЬШОЕ!)

  http://arduino.ru/forum/proekty/wemos-d1-ili9341-wifi-chasy-s-pogodoi-iz-dvukh-detalei-dlya-lenivykh-i-novichkov

подкорректировал скетч и получилось (см.фото).

//***********************************************************************************
//Проверка функции преобразования 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;
}

arduinec
Offline
Зарегистрирован: 01.09.2015

Зачем в функции utf8rus_ROM() в цикле стоят строки tft.setFontSpacing (0) ? Расстояние между символами запоминается в строке?

Если в строке 100 написать n <= 0xAF, то строка 101 будет не нужна.

Исходный код и описание функции utf8rus() здесь: http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafru...

Gor_Spb
Offline
Зарегистрирован: 12.02.2019

Добрый день.

3. Выражаю Вам arduinec  благодарность как автору за исходный текст преобразования. Так получилось, что мне попался вначале проект negavoid.

2. Строка 101 действительно  не нужна.

1. Фонты кириллицы имеют большую ширину, чем латиница, что особенно видно при одновременном выводе и тех и других.

Спасибо за замечания.

arduinec
Offline
Зарегистрирован: 01.09.2015

Gor_Spb пишет:

1. Фонты кириллицы имеют большую ширину, чем латиница, что особенно видно при одновременном выводе и тех и других.

Похоже не поняли мой вопрос:

Цитата:

Зачем в функции utf8rus_ROM() в цикле стоят строки tft.setFontSpacing (0) ? Расстояние между символами запоминается в строке?

Если расстояние между символами не запоминается в строке, то при выходе из функции utf8rus_ROM() будет применена последняя функция tft.setFontSpacing (), а все предыдущие её установки в цикле while() пропадут. Может лучше убрать tft.setFontSpacing () из utf8rus_ROM() ?

Gor_Spb
Offline
Зарегистрирован: 12.02.2019

Да, функцию tft.setFontSpacing () лучше убрать. Она была включена для проверки скорости прорисовки текста после очистки памяти.