#1 2020-02-17 10:57:05

luminofor
Участник
Зарегистрирован: 2020-01-28
Сообщений: 18

Отображение кириллицы на TFT LCD

Всем привет! Заранее прошу прощения за возможно нубский и сто раз обмусоленный вопрос. Поиск по форуму ощутимых результатов не принес.
Есть дисплей. Если покопаться в его официальной библиотеке, то легко увидеть несколько файлов, содержащих шрифты. Содержимое, скажем латинской буквы "А" размером 16 пикселей выглядит так

// @1056 'A' (11 pixels wide)
  0x00, 0x00, //            
  0x00, 0x00, //            
  0x3F, 0x00, //   ######   
  0x0F, 0x00, //     ####   
  0x09, 0x00, //     #  #   
  0x19, 0x80, //    ##  ##  
  0x19, 0x80, //    ##  ##  
  0x1F, 0x80, //    ######  
  0x30, 0xC0, //   ##    ## 
  0x30, 0xC0, //   ##    ## 
  0x79, 0xE0, //  ####  ####
  0x00, 0x00, //
  0x00, 0x00, //            
  0x00, 0x00, //            
  0x00, 0x00, //            
  0x00, 0x00, //

На просторах интернета нашлась программа The Dot Factory. В ней очень много настроек и она умеет из любого встроенного в винду шрифта сделать файл, похожий с оригинальным файлом со шрифтом от дисплея. Похожий, но видимо не совсем. При попытке добавить файл в проект, я получаю ошибку. Если просто тупо заменить в оригинальном файле латинскую букву "A" на "Ф", то можно добиться вывода именно "Ф".

// @4408 'Ф' (16 pixels wide)
	0x00, 0x00, //                 
	0x00, 0x00, //                 
	0x00, 0x00, //                 
	0x00, 0x00, //                 
	0x07, 0xC0, //      #####      
	0x01, 0x00, //        #        
	0x0F, 0xE0, //     #######     
	0x11, 0x10, //    #   #   #    
	0x21, 0x08, //   #    #    #   
	0x21, 0x08, //   #    #    #   
	0x21, 0x08, //   #    #    #   
	0x11, 0x10, //    #   #   #    
	0x0F, 0xE0, //     #######     
	0x01, 0x00, //        #        
	0x07, 0xC0, //      #####      
	0x00, 0x00, //                 
	0x00, 0x00, //                 
	0x00, 0x00, //                 
	0x00, 0x00, //      

Но это как бы не правильно, долго и неудобно
Кто нибудь имеет опыт с решением такого вопроса?

Редактировался luminofor (2020-02-17 10:58:49)

#2 2020-02-19 12:38:52

luminofor
Участник
Зарегистрирован: 2020-01-28
Сообщений: 18

Re: Отображение кириллицы на TFT LCD

Примерно разобрался. Могу сделать любой латинский шрифт и вывести на дисплей. Нужно сгенерировать его программой, заменить код в библиотечном шрифте на сгенерированный, поправить в конце файла ширину и высоту в битах. Ну или создать с нуля файл со шрифтом и описать его в файле fonts.h
А вот с кириллицей проблема. Долго не мог понять почему. Дело в длине слова, описывающего массив с символами. Оно занимает 128 байт. (0-127)
Если я, в конце латинских букв присоединяю кириллицу, то вызывая например символ с номером 127, я получу букву "А". А если 128, то уже абракадабру.
То есть открывается два варианта.
1. Искать где в библиотеке можно расширить диапазон массива. Но тут есть пара проблем. Массив идет сплошной. А между последним символом таблицы ASCII и "А" на кириллице есть 40 других символов, которые тоже нужно забить в массив (хоть пустые), чтобы "А" попала на свое законное 160-е место и комп нормально все понимал при компиляции.
2. Просто тупо исправить латиницу на кирилицу, в тексте программы писать латиницей, а вывод будет кириллицей.
Есть еще один вариант, но для программеров - написать свою библиотеку вывода символов на дисплей  big_smile

#3 2020-02-19 14:47:49

Kino
Участник
Зарегистрирован: 2019-02-28
Сообщений: 30

Re: Отображение кириллицы на TFT LCD

Там нет явного указания размера массива, иначе компилятор бы ругнулся, соответственно можно обратится к любому элементу, т.е. проблема не в массиве а где-то еще.

#4 2020-02-19 16:03:02

luminofor
Участник
Зарегистрирован: 2020-01-28
Сообщений: 18

Re: Отображение кириллицы на TFT LCD

Кажись нарыл кое что полезное.
В файле GUI_Paint.h есть например строка

void Paint_DrawChar(UWORD Xstart, UWORD Ystart, const char Acsii_Char, sFONT* Font, UWORD Color_Background, UWORD Color_Foreground);

Это функция, выводящая отдельный символ из массива символов.
В ней указан тип константы char, которая может принимать значение от -127 до 127, то есть функция не может обратиться по адресу больше чем 127 (если от нуля считать)
Если я в этом файле меняю все типы константы на unsigned char (от 0 до 255) и потом во всех связанных с этим местах в файле GUI_Paint.cpp, то я могу по номеру символа в массиве вывести символ кириллицы.
Как бы УРА!
Но пока не совсем.
По одному символу выводить текст накладно, есть для этого другая функция Paint_DrawString_EN. Она должна выводить набор символов, используя Paint_DrawChar. Но она выводит не правильно. Вместь любых букв, я получаю "с" + пробел или "т" + пробел.
Пока не пойму где еще копнуть.
Но прогресс есть, это радует.

#5 2020-02-19 18:39:24

luminofor
Участник
Зарегистрирован: 2020-01-28
Сообщений: 18

Re: Отображение кириллицы на TFT LCD

ЕСС, товарищи, ЕСС!!! lol
Не скажу что все тупо просто, но есть не сложное решение!
Кодировкой по умолчанию, используемой компилятором Arduino IDE является UTF-8. А в ней килиллица кодируется двухбайтным числом. Поэтому-то при выводе строки на кириллице отображаются два символа и не те, что надо.
Есть костыль. Используем внешний редактор. Например Notepad++
В настройках IDE ставим галочку "Использовать внешний редактор"
Открываем скетч и в IDE и в Notepad++, в Notepad++ идем во вкладку "Кодировки"-"Кодировки"-"Windows-1251"
Пишем текст, который нужно вывести на дисплей кириллицей, сохраняем скетч, переходим в IDE, заливаем. Профит!
Кстати, в посте №2 я ошибся. Между последним читаемым символом "~" в стандартной таблице ASCII и первым символом "А" в кириллице (в кодировке Windows-1251) 66 символов. Поэтому в таблицу шрифта нужно добавить 66 пустых символов (допустим пробелов)

Редактировался luminofor (2020-02-19 18:40:26)

#6 2020-02-19 22:11:00

luminofor
Участник
Зарегистрирован: 2020-01-28
Сообщений: 18

Re: Отображение кириллицы на TFT LCD

Вот результат моих мучений. Всем сочувствующим спасибо big_smile
2020_02_19_18_46_48_800.jpgi.gif
Есть отдельное замечание по символам Ё и ё. Если вы хотите их использовать, их надо поместить в массиве по номеру 168 и 184 соответственно

Редактировался luminofor (2020-02-19 23:51:36)

#7 2020-02-19 23:03:39

Watchdog
Гость

Re: Отображение кириллицы на TFT LCD

luminofor пишет:

... Всем сочувствующим спасибо big_smile

А про собаку? "The quick brown fox jumps over the lazy dog". smile

#8 2020-02-19 23:49:46

luminofor
Участник
Зарегистрирован: 2020-01-28
Сообщений: 18

Re: Отображение кириллицы на TFT LCD

Watchdog пишет:
luminofor пишет:

... Всем сочувствующим спасибо big_smile

А про собаку? "The quick brown fox jumps over the lazy dog". smile

Нее.., этож у них ТАМ про собак, а у нас ТУТ про булки lol

Редактировался luminofor (2020-02-19 23:50:53)

Быстрое сообщение

Введите сообщение и нажмите Отправить

Подвал раздела