Помогите подправить шрифт для LCD L2F50 от Siemens S65

VetalST
Offline
Зарегистрирован: 29.12.2015

Друзья, уперся в проблему и не знаю куда дальше копать.

Нашол на сайте http://compcar.ru/forum/showthread.php?t=7237  подключение и библиотеку для LCD L2F50 от Siemens S65.

Библиотеку я подправил под Arduino IDE версии 1.0.6.

Подправил кусок кода для правельного расположения текста.

Как на сайте http://forum.arduino.cc/index.php?topic=51440.15

В файле S65Display.cpp

uint8_t S65Display::drawChar(uint8_t x, uint8_t y, char c, uint8_t size, uint16_t color, uint16_t bg_color)
{
  uint8_t ret, h, w; // h,w sind Laufvariablen für Höhe und Weite
#if FONT_WIDTH <= 8
  uint8_t data;
#elif FONT_WIDTH <= 16
  uint16_t data;
#elif FONT_WIDTH <= 32
  uint32_t data;
#endif
  uint8_t i, j, width, height;
  const prog_uint8_t *ptr, *ptr_tmp;

  i      = (uint8_t)c;
#if FONT_WIDTH <= 8
  ptr    = &font_PGM[(i-FONT_START)*(8*FONT_HEIGHT/8)];
#elif FONT_WIDTH <= 16
  ptr    = &font_PGM[(i-FONT_START)*(16*FONT_HEIGHT/8)];
#elif FONT_WIDTH <= 32
  ptr    = &font_PGM[(i-FONT_START)*(32*FONT_HEIGHT/8)];
#endif
  width  = FONT_WIDTH;
  height = FONT_HEIGHT;

  if(size <= 1)
  {
    ret = x+width;
    if(ret > S65_WIDTH)
    {
      return S65_WIDTH+1;
    }

    setArea(x, y, (x+width-1), (y+height-1));

    s65_drawStart();
    ptr_tmp = ptr;
	for(w=width; w!=0; w--) // 
	{
	ptr    = ptr_tmp;
	//Serial.print("w="); Serial.println(w); delay(50);
	for(h= height; h!=0; h--) 
    {
	#if FONT_WIDTH <= 8
		data = pgm_read_byte(ptr); ptr+=1;
	#elif FONT_WIDTH <= 16
		data = pgm_read_word(ptr); ptr+=2;
	#elif FONT_WIDTH <= 32
		data = pgm_read_dword(ptr); ptr+=4;
	#endif
    
	    if(CHECK_BIT(data,w)) // hier Sprung in die Funktion CHECK_BIT(var,pos) 
							  // die ist in S6%Dislay.h angelegt
							  // und sieht so aus:
							  // #define CHECK_BIT(var,pos) ((var & (1 << pos)) == (1 << pos))

			{
			s65_draw(color);
			}
			else
			{
			s65_draw(bg_color);
			}
	    }
	}
    s65_drawStop();
  }
  else
  {
    ret = x+(width*size);
    if(ret > S65_WIDTH)
    {
      return S65_WIDTH+1;
    }

    s65_setArea(x, y, (x+(width*size)-1), (y+(height*size)-1));

    s65_drawStart();
      ptr_tmp = ptr;
	for(w=width; w!=0; w--) // 
	{
	ptr    = ptr_tmp;
	//Serial.print("w="); Serial.println(w); delay(50);
	for(h= height; h!=0; h--)
    {
	#if FONT_WIDTH <= 8
      data = pgm_read_byte(ptr); ptr+=1;
	#elif FONT_WIDTH <= 16
      data = pgm_read_word(ptr); ptr+=2;
	#elif FONT_WIDTH <= 32
      data = pgm_read_dword(ptr); ptr+=4;
	#endif
     
        
          if(CHECK_BIT(data,w))
          {
            for(j=size; j!=0; j--)
            {
              s65_draw(color);
            }
          }
          else
          {
            for(j=size; j!=0; j--)
            {
              s65_draw(bg_color);
            }
			}
			}
         
    }
    s65_drawStop();
  }

  return ret;
}

И добавил в файле S65Display.h

#define CHECK_BIT(var,pos) ((var & (1 << pos)) == (1 << pos))

Все работает.

Но захотелось мне вывести русский язык и здесть начались проблеммы.

Шрифты все работают, меняются в fonts.h.

Нашел чужой шрифт, выводит слова на русском, но через букву добавляет мусор. 

На англ. все в порядке.

Отключил #define FONT_END7F в fonts.h чтобы от 0x80 до 0xbf были русские буквы.

В шрифте англ. и русские буквы ни чего лишнего но и знаки и цифры конечно. Все стандартно.

Пока не разобрался как, и какой программой под этот дисплей шрифт сделать.

Но шрифт нормальный может в uint8_t S65Display::drawChar(uint8_t x, uint8_t y, char c, uint8_t size, uint16_t color, uint16_t bg_color) проблема.

Подскажите где копать. 

Как это можно исправить.



В шрифте 8х8 выводит / палочку перед русской буквой.

Это 12х15 выводит мусор перед русской буквой.

 

Вот быблиотека S65Display_V2_rus http://yadi.sk/d/ovGNZY4apsB39

Поключение экрана в моей библиотеке S65Display_V2_rus :

CS_PIN          (8) //PORTB 0
RST_PIN         (7) // PORTD 7
RS_PIN          (10)//PORTB 2
DAT_PIN         (11)//PORTB 3
CLK_PIN         (13)//PORTB 5
 
Освободил (9) // PORTB 1 вывод для подключения других бибилиотек ардуино.
 
32bit
Offline
Зарегистрирован: 16.02.2016

А я разобрался

32bit
Offline
Зарегистрирован: 16.02.2016

Функции тут ни при чем. Это сама IDE кидает мусор перед русскими буквами

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

32bit пишет:

Функции тут ни при чем. Это сама IDE кидает мусор перед русскими буквами

Разве дисплей подключен к IDE? IDE не работает на ардуине и, соответсвенно, никакой мусор никуда бросать не в состоянии.

32bit
Offline
Зарегистрирован: 16.02.2016

asam пишет:

32bit пишет:

Функции тут ни при чем. Это сама IDE кидает мусор перед русскими буквами

Разве дисплей подключен к IDE? IDE не работает на ардуине и, соответсвенно, никакой мусор никуда бросать не в состоянии.

 

Только когда в IDE пишешь русскими буквами, она компилит с мусором. Я игрался с кодировками, так и не подобрал нужную. Поэтому просто ловил этот мусор по кодам символов

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

32bit пишет:

когда в IDE пишешь русскими буквами, она компилит с мусором. Я игрался с кодировками, так и не подобрал нужную. Поэтому просто ловил этот мусор по кодам символов

Ну, опять же IDE сама ничего не компилит. Она вызывает gcc для этого. А, проблемы, насколько я понимаю, из-за юникода.

32bit
Offline
Зарегистрирован: 16.02.2016

Про IDE это я образно. Понятно что проблемы из-за кодировки. Ведь если записать русские буквы через IDE в контроллер, то в сериал отображаться корректно они не будут. И дисплей поэтому мусор показывает. Но вот как по другому отправить в функцию без мусора 

drawText(5, 5, "этот текст передастся с мусором", 1, RED, BLACK)

 

32bit
Offline
Зарегистрирован: 16.02.2016

Кстати мусор этот идет кодом 208 и 209

32bit
Offline
Зарегистрирован: 16.02.2016

C "а" по "о" идет код 208, а с "у" и далее код 209

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

32bit пишет:

C "а" по "о" идет код 208, а с "у" и далее код 209

Родное сердце! Открой для себя кодировку UTF-8 Узнаешь много нового ;)))))))))