Экран на контроллере RA8875 и чип шрифтов GT21L16T1W

PIW2004
Offline
Зарегистрирован: 24.09.2013

Имеется TFT экран на базе контроллера RA8875, так же на борту установлен чип со шрифтами GT21L16T1W, После небольшей доработки стандартной библиотеки для этого экрана удалось инициализировать чип шрифтов и вывести текст с их использованием.

Но возникла проблемка.

Штатно за вывод текста отвечает вот этот код:

Основная часть где вводим текст



char string[ ] = "Hello 123456 Привет 123456";
tft.textWrite(string);

А это как обрабатывается команда textWrite в библиотеке



void Adafruit_RA8875::textWrite(const char* buffer, uint16_t len) 
{
  if (len == 0) len = strlen(buffer);
  writeCommand(RA8875_MRWC);
  for (uint16_t i=0;i<len;i++)
  {writeData(buffer[i]);
#if defined(__AVR__)
    if (_textScale > 1) delay(1);
#elif defined(__arm__)
    if (_textScale > 0) delay(1);
#endif
  }
}

Но возникает проблема, для правильной кодировки символов, с кодом каждого символа необходимо произвести дополнительные манипуляции, взято из даташита на GT21L16T1W.



BaseAdd=0x56BDE +425*34
if (FontCode>=0x0400) and (FontCode<=0x045F) then
Address = (FontCode– 0x0400) * 34+BaseAdd
Else if (FontCode>=0x0490) and (FontCode<=0x04a3) then
Address = (FontCode– 0x0490+96) *  34+BaseAdd

(Код сравнения символов и назначения чуть длиннее, но суть та же, арифметические операции к коду символа)

Попробовал сделать вот так:



void Adafruit_RA8875::textWrite(const char* buffer, uint16_t len) 
{
  if (len == 0) len = strlen(buffer);
  writeCommand(RA8875_MRWC);
  for (uint16_t i=0;i<len;i++)
  {char temp = buffer[i];
if (temp >= 0x0400 && temp <= 0x045F)  {temp = temp - 0x0400 * 34 + 0x5A450;}
else if (temp >= 0x0490 && temp <= 0x04A3) {temp = temp - 0x0490 + 96 * 34 + 0x5A450;}
    writeData(temp);
#if defined(__AVR__)
    if (_textScale > 1) delay(1);
#elif defined(__arm__)
    if (_textScale > 0) delay(1);
#endif
  }
}

Но выдаёт ошибки:

assignment of read-only location '*(buffer + ((unsigned int)i))'

По переводу на русский означает, что переменная только для чтения, но я же произвожу операции с temp, а не buffer?!

И вторая ошибка

 invalid conversion from 'const char*' to 'char'

Понимаю, что явно ошибки в преобразовании и сравнении, но т.к. опыта в написании мало, прошу помощи.

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Когда найдёте ошибку, то в строках 7 и 8 добавьте скобки, потому что умножение, например, более приоритетная операция нежели сложение или вычитание.

PIW2004
Offline
Зарегистрирован: 24.09.2013

kisoft пишет:

Когда найдёте ошибку, то в строках 7 и 8 добавьте скобки, потому что умножение, например, более приоритетная операция нежели сложение или вычитание.

Спасибо, учту.