LCD UC1609 Русский текст

OfficialGalkin
OfficialGalkin аватар
Offline
Зарегистрирован: 29.06.2019

Купил я значит дисплей. Все вроде бы хорошо, но нет русского шрифта. Готовой русификации под библиотеку ERM19264_UC1609 тоже не нашел, решил сам дописать шрифт. 

Проверено на библиотеке версии 1.3

Что нужно для вывода? Идем в Документы -> Arduino -> libraries -> ERM19264_UC1609 -> src

Нам нужно отредактировать файл ERM19264_graphics_font.h

Ищем там //Default Standard extended ASCII 5x8 font. и меняем массив на новый

static const unsigned char UC_Font_One[] PROGMEM = {
    0x00, 0x00, 0x00, 0x00, 0x00,   
	0x3E, 0x5B, 0x4F, 0x5B, 0x3E,  // :)
	0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 
	0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 
	0x18, 0x3C, 0x7E, 0x3C, 0x18, 
	0x1C, 0x57, 0x7D, 0x57, 0x1C, 
	0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 
	0x00, 0x18, 0x3C, 0x18, 0x00, 
	0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 
	0x00, 0x18, 0x24, 0x18, 0x00, 
	0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 
	0x30, 0x48, 0x3A, 0x06, 0x0E, 
	0x26, 0x29, 0x79, 0x29, 0x26, 
	0x40, 0x7F, 0x05, 0x05, 0x07, 
	0x40, 0x7F, 0x05, 0x25, 0x3F, 
	0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 
	0x7F, 0x3E, 0x1C, 0x1C, 0x08, 
	0x08, 0x1C, 0x1C, 0x3E, 0x7F, 
	0x14, 0x22, 0x7F, 0x22, 0x14, 
	0x5F, 0x5F, 0x00, 0x5F, 0x5F, 
	0x06, 0x09, 0x7F, 0x01, 0x7F, 
	0x00, 0x66, 0x89, 0x95, 0x6A, 
	0x60, 0x60, 0x60, 0x60, 0x60, 
	0x94, 0xA2, 0xFF, 0xA2, 0x94, 
	0x08, 0x04, 0x7E, 0x04, 0x08, 
	0x10, 0x20, 0x7E, 0x20, 0x10, 
	0x08, 0x08, 0x2A, 0x1C, 0x08, 
	0x08, 0x1C, 0x2A, 0x08, 0x08, 
	0x1E, 0x10, 0x10, 0x10, 0x10, 
	0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 
	0x30, 0x38, 0x3E, 0x38, 0x30, 
	0x06, 0x0E, 0x3E, 0x0E, 0x06, 
	0x00, 0x00, 0x00, 0x00, 0x00,  // Space
	0x00, 0x00, 0x5F, 0x00, 0x00,  // !
	0x00, 0x07, 0x00, 0x07, 0x00, 
	0x14, 0x7F, 0x14, 0x7F, 0x14, 
	0x24, 0x2A, 0x7F, 0x2A, 0x12, 
	0x23, 0x13, 0x08, 0x64, 0x62, 
	0x36, 0x49, 0x56, 0x20, 0x50, 
	0x00, 0x08, 0x07, 0x03, 0x00, 
	0x00, 0x1C, 0x22, 0x41, 0x00, 
	0x00, 0x41, 0x22, 0x1C, 0x00, 
	0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 
	0x08, 0x08, 0x3E, 0x08, 0x08, 
	0x00, 0x80, 0x70, 0x30, 0x00, 
	0x08, 0x08, 0x08, 0x08, 0x08, 
	0x00, 0x00, 0x60, 0x60, 0x00, 
	0x20, 0x10, 0x08, 0x04, 0x02, 
	0x3E, 0x51, 0x49, 0x45, 0x3E, 
	0x00, 0x42, 0x7F, 0x40, 0x00, 
	0x72, 0x49, 0x49, 0x49, 0x46, 
	0x21, 0x41, 0x49, 0x4D, 0x33, 
	0x18, 0x14, 0x12, 0x7F, 0x10, 
	0x27, 0x45, 0x45, 0x45, 0x39, 
	0x3C, 0x4A, 0x49, 0x49, 0x31, 
	0x41, 0x21, 0x11, 0x09, 0x07, 
	0x36, 0x49, 0x49, 0x49, 0x36, 
	0x46, 0x49, 0x49, 0x29, 0x1E, 
	0x00, 0x00, 0x14, 0x00, 0x00, 
	0x00, 0x40, 0x34, 0x00, 0x00, 
	0x00, 0x08, 0x14, 0x22, 0x41, 
	0x14, 0x14, 0x14, 0x14, 0x14, 
	0x00, 0x41, 0x22, 0x14, 0x08, 
	0x02, 0x01, 0x59, 0x09, 0x06, 
	0x3E, 0x41, 0x5D, 0x59, 0x4E, 
	0x7C, 0x12, 0x11, 0x12, 0x7C, 
	0x7F, 0x49, 0x49, 0x49, 0x36, 
	0x3E, 0x41, 0x41, 0x41, 0x22, 
	0x7F, 0x41, 0x41, 0x41, 0x3E, 
	0x7F, 0x49, 0x49, 0x49, 0x41, 
	0x7F, 0x09, 0x09, 0x09, 0x01, 
	0x3E, 0x41, 0x41, 0x51, 0x73, 
	0x7F, 0x08, 0x08, 0x08, 0x7F, 
	0x00, 0x41, 0x7F, 0x41, 0x00, 
	0x20, 0x40, 0x41, 0x3F, 0x01, 
	0x7F, 0x08, 0x14, 0x22, 0x41, 
	0x7F, 0x40, 0x40, 0x40, 0x40, 
	0x7F, 0x02, 0x1C, 0x02, 0x7F, 
	0x7F, 0x04, 0x08, 0x10, 0x7F, 
	0x3E, 0x41, 0x41, 0x41, 0x3E, 
	0x7F, 0x09, 0x09, 0x09, 0x06, 
	0x3E, 0x41, 0x51, 0x21, 0x5E, 
	0x7F, 0x09, 0x19, 0x29, 0x46, 
	0x26, 0x49, 0x49, 0x49, 0x32,
	0x03, 0x01, 0x7F, 0x01, 0x03, 
	0x3F, 0x40, 0x40, 0x40, 0x3F, 
	0x1F, 0x20, 0x40, 0x20, 0x1F, 
	0x3F, 0x40, 0x38, 0x40, 0x3F, 
	0x63, 0x14, 0x08, 0x14, 0x63, 
	0x03, 0x04, 0x78, 0x04, 0x03, 
	0x61, 0x59, 0x49, 0x4D, 0x43, 
	0x00, 0x7F, 0x41, 0x41, 0x41, 
	0x02, 0x04, 0x08, 0x10, 0x20, 
	0x00, 0x41, 0x41, 0x41, 0x7F, 
	0x04, 0x02, 0x01, 0x02, 0x04,
    0x40, 0x40, 0x40, 0x40, 0x40, 
    0x00, 0x03, 0x07, 0x08, 0x00, 
	0x20, 0x54, 0x54, 0x78, 0x40, 
	0x7F, 0x28, 0x44, 0x44, 0x38, 
	0x38, 0x44, 0x44, 0x44, 0x28, 
	0x38, 0x44, 0x44, 0x28, 0x7F, 
	0x38, 0x54, 0x54, 0x54, 0x18, 
	0x00, 0x08, 0x7E, 0x09, 0x02, 
	0x18, 0xA4, 0xA4, 0x9C, 0x78, 
	0x7F, 0x08, 0x04, 0x04, 0x78, 
	0x00, 0x44, 0x7D, 0x40, 0x00, 
	0x20, 0x40, 0x40, 0x3D, 0x00, 
	0x7F, 0x10, 0x28, 0x44, 0x00, 
	0x00, 0x41, 0x7F, 0x40, 0x00, 
	0x7C, 0x04, 0x78, 0x04, 0x78, 
	0x7C, 0x08, 0x04, 0x04, 0x78, 
	0x38, 0x44, 0x44, 0x44, 0x38, 
	0xFC, 0x18, 0x24, 0x24, 0x18, 
	0x18, 0x24, 0x24, 0x18, 0xFC, 
	0x7C, 0x08, 0x04, 0x04, 0x08, 
	0x48, 0x54, 0x54, 0x54, 0x24, 
	0x04, 0x04, 0x3F, 0x44, 0x24, 
	0x3C, 0x40, 0x40, 0x20, 0x7C, 
	0x1C, 0x20, 0x40, 0x20, 0x1C, 
	0x3C, 0x40, 0x30, 0x40, 0x3C, 
	0x44, 0x28, 0x10, 0x28, 0x44, 
	0x4C, 0x90, 0x90, 0x90, 0x7C, 
	0x44, 0x64, 0x54, 0x4C, 0x44,  // z
	0x00, 0x08, 0x36, 0x41, 0x00, // {
	0x00, 0x00, 0x77, 0x00, 0x00, // |
	0x00, 0x41, 0x36, 0x08, 0x00  // }
#ifdef UC_FONT_MOD_TWO
	,0x02, 0x01, 0x02, 0x04, 0x02, // capital letter c with cedilla
	0x3C, 0x26, 0x23, 0x26, 0x3C, 
	0x1E, 0xA1, 0xA1, 0x61, 0x12, 
	0x3A, 0x40, 0x40, 0x20, 0x7A, 
	0x38, 0x54, 0x54, 0x55, 0x59, 
	0x21, 0x55, 0x55, 0x79, 0x41, 
	0x22, 0x54, 0x54, 0x78, 0x42, // a-umlaut
	0x21, 0x55, 0x54, 0x78, 0x40, 
	0x20, 0x54, 0x55, 0x79, 0x40, 
	0x0C, 0x1E, 0x52, 0x72, 0x12, 
	0x39, 0x55, 0x55, 0x55, 0x59, 
	0x39, 0x54, 0x54, 0x54, 0x59, 
	0x39, 0x55, 0x54, 0x54, 0x58, 
	0x00, 0x00, 0x45, 0x7C, 0x41, 
	0x00, 0x02, 0x45, 0x7D, 0x42, 
	0x00, 0x01, 0x45, 0x7C, 0x40, 
	0x7D, 0x12, 0x11, 0x12, 0x7D, // A-umlaut
	0xF0, 0x28, 0x25, 0x28, 0xF0, 
	0x7C, 0x54, 0x55, 0x45, 0x00, 
	0x20, 0x54, 0x54, 0x7C, 0x54, 
	0x7C, 0x0A, 0x09, 0x7F, 0x49, 
	0x32, 0x49, 0x49, 0x49, 0x32, 
	0x3A, 0x44, 0x44, 0x44, 0x3A, // o-umlaut
	0x32, 0x4A, 0x48, 0x48, 0x30, 
	0x3A, 0x41, 0x41, 0x21, 0x7A, 
	0x3A, 0x42, 0x40, 0x20, 0x78, 
	0x00, 0x9D, 0xA0, 0xA0, 0x7D, 
	0x3D, 0x42, 0x42, 0x42, 0x3D, // O-umlaut
	0x3D, 0x40, 0x40, 0x40, 0x3D, 
	0x3C, 0x24, 0xFF, 0x24, 0x24, 
	0x48, 0x7E, 0x49, 0x43, 0x66, 
	0x2B, 0x2F, 0xFC, 0x2F, 0x2B, 
	0xFF, 0x09, 0x29, 0xF6, 0x20, 
	0xC0, 0x88, 0x7E, 0x09, 0x03, 
	0x20, 0x54, 0x54, 0x79, 0x41, 
	0x00, 0x00, 0x44, 0x7D, 0x41, 
	0x30, 0x48, 0x48, 0x4A, 0x32, 
	0x38, 0x40, 0x40, 0x22, 0x7A, 
	0x00, 0x7A, 0x0A, 0x0A, 0x72, 
	0x7D, 0x0D, 0x19, 0x31, 0x7D, 
	0x26, 0x29, 0x29, 0x2F, 0x28, 
	0x26, 0x29, 0x29, 0x29, 0x26, 
	0x30, 0x48, 0x4D, 0x40, 0x20, 
	0x38, 0x08, 0x08, 0x08, 0x08, 
	0x08, 0x08, 0x08, 0x08, 0x38, 
	0x2F, 0x10, 0xC8, 0xAC, 0xBA, 
	0x2F, 0x10, 0x28, 0x34, 0xFA, 
	0x00, 0x00, 0x7B, 0x00, 0x00, 
	0x08, 0x14, 0x2A, 0x14, 0x22, 
	0x22, 0x14, 0x2A, 0x14, 0x08, 
	0xAA, 0x00, 0x55, 0x00, 0xAA, 
	0xAA, 0x55, 0xAA, 0x55, 0xAA, 
	0x00, 0x00, 0x00, 0xFF, 0x00, 
	0x10, 0x10, 0x10, 0xFF, 0x00, 
	0x14, 0x14, 0x14, 0xFF, 0x00, 
	0x10, 0x10, 0xFF, 0x00, 0xFF, 
	0x10, 0x10, 0xF0, 0x10, 0xF0, 
	0x14, 0x14, 0x14, 0xFC, 0x00, 
	0x14, 0x14, 0xF7, 0x00, 0xFF, 
	0x00, 0x00, 0xFF, 0x00, 0xFF, 
	0x14, 0x14, 0xF4, 0x04, 0xFC, 
	0x14, 0x14, 0x17, 0x10, 0x1F, 
	0x10, 0x10, 0x1F, 0x10, 0x1F, 
	0x14, 0x14, 0x14, 0x1F, 0x00, 
	0x10, 0x10, 0x10, 0xF0, 0x00, 
	0x00, 0x00, 0x00, 0x1F, 0x10, 
	0x7E, 0x09, 0x09, 0x09, 0x7E, // А -- Заглавные буквы
	0x7F, 0x49, 0x49, 0x49, 0x30, // Б
	0x7F, 0x49, 0x49, 0x49, 0x36, // В
	0x7F, 0x01, 0x01, 0x01, 0x02, // Г
	0x60, 0x30, 0x2F, 0x21, 0x7F, // Д
	0x7F, 0x49, 0x49, 0x49, 0x41, // Е
	0x77, 0x08, 0x3F, 0x08, 0x77, // Ж
	0x20, 0x42, 0x49, 0x49, 0x3E, // З
	0x7F, 0x20, 0x10, 0x08, 0x7F, // И
	0x7C, 0x21, 0x12, 0x09, 0x7C, // Й
	0x7F, 0x08, 0x08, 0x14, 0x63, // К
	0x40, 0x3F, 0x01, 0x01, 0x7F, // Л
	0x7F, 0x02, 0x0C, 0x02, 0x7F, // М
	0x7F, 0x08, 0x08, 0x08, 0x7F, // Н
	0x3E, 0x41, 0x41, 0x41, 0x3E, // О
	0x7F, 0x01, 0x01, 0x01, 0x7F, // П
	0x7F, 0x09, 0x09, 0x09, 0x06, // Р
	0x3E, 0x41, 0x41, 0x41, 0x22, // С
	0x01, 0x01, 0x7F, 0x01, 0x01, // Т
	0x47, 0x48, 0x48, 0x48, 0x3F, // У
	0x0C, 0x12, 0x7F, 0x12, 0x0C, // Ф
	0x41, 0x36, 0x08, 0x36, 0x41, // Х
	0x3F, 0x40, 0x40, 0x7F, 0xC0, // Ц
	0x07, 0x08, 0x08, 0x08, 0x7F, // Ч
	0x7F, 0x40, 0x78, 0x40, 0x7F, // Ш
	0x7F, 0x40, 0x78, 0x40, 0xFF, // Щ
	0x01, 0x7F, 0x48, 0x48, 0x30, // Ъ
	0x7F, 0x48, 0x30, 0x00, 0x7F, // Ы
	0x7F, 0x48, 0x48, 0x48, 0x30, // Ь
	0x22, 0x41, 0x49, 0x49, 0x3E, // Э
	0x7F, 0x08, 0x3E, 0x41, 0x3E, // Ю
	0x46, 0x49, 0x29, 0x19, 0x7F, // Я
	0x20, 0x54, 0x54, 0x78, 0x40, // а -- Маленькие буквы
	0x78, 0x54, 0x54, 0x54, 0x20, // б
	0x7C, 0x54, 0x54, 0x54, 0x28, // в
	0x7C, 0x04, 0x04, 0x04, 0x08, // г
	0xE0, 0x50, 0x4C, 0x44, 0xFC, // д
	0x38, 0x54, 0x54, 0x54, 0x08, // е
	0x6C, 0x10, 0x7C, 0x10, 0x6C, // ж
	0x20, 0x48, 0x44, 0x54, 0x38, // з
	0x7C, 0x20, 0x10, 0x08, 0x7C, // и
	0x7C, 0x21, 0x12, 0x09, 0x7C, // й
	0x7C, 0x10, 0x10, 0x28, 0x44, // к
	0x40, 0x3C, 0x04, 0x04, 0x7C, // л
	0x7C, 0x08, 0x30, 0x08, 0x7C, // м
	0x7C, 0x10, 0x10, 0x10, 0x7C, // н
	0x38, 0x44, 0x44, 0x44, 0x38, // о
	0x7C, 0x04, 0x04, 0x04, 0x7C, // п
	0x7C, 0x14, 0x14, 0x14, 0x08, // р
	0x38, 0x44, 0x44, 0x44, 0x20, // с
	0x04, 0x04, 0x7C, 0x04, 0x04, // т
	0x0C, 0x50, 0x50, 0x50, 0x3C, // у
	0x10, 0x28, 0x7C, 0x28, 0x10, // ф
	0x44, 0x28, 0x10, 0x28, 0x44, // х
	0x3C, 0x40, 0x40, 0x7C, 0xC0, // ц
	0x0C, 0x10, 0x10, 0x10, 0x7C, // ч
	0x7C, 0x40, 0x70, 0x40, 0x7C, // ш
	0x7C, 0x40, 0x70, 0x40, 0xFC, // щ
	0x04, 0x7C, 0x50, 0x50, 0x20, // ъ
	0x7C, 0x50, 0x20, 0x00, 0x7C, // ы
	0x7c, 0x50, 0x50, 0x50, 0x20, // ь
	0x44, 0x54, 0x54, 0x54, 0x38, // э
	0x7c, 0x10, 0x7c, 0x44, 0x7c, // ю
	0x48, 0x5c, 0x54, 0x34, 0x7c  // я




#endif
};

Далее в вашем проекте для вывода символов русского алфавита нужно использовать многим знакомую функцию. Добавляем в конец скетча это:

/* Recode russian fonts from UTF-8 to Windows-1251 */
String rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[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 = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}

Теперь для вывода русского текста нужно всего лишь вызвать эту функцию. Пример:

  mylcd.setTextColor(FOREGROUND);
  mylcd.setTextSize(1);
  mylcd.setCursor(0, 0);
  mylcd.print(rus(F("абвгдежзийклмнопрстуфхцчшщъыьэюяпривет, как дела?")));
  mylcd.setCursor(0, 16);
  mylcd.print(rus(F("АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯПРИВЕТ, КАК ДЕЛА?")));
  mylcd.setCursor(0, 32);
  mylcd.print(rus(F("ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz :;.$=+#@!")));

Всего лишь писать rus("ваш текст")

Русский и английский текст можно выводить одновременно в одной строке. rus("ABCDEFG АБВГД")

Буквы "Ё" нету. 

Dron_S
Offline
Зарегистрирован: 04.10.2016

Приветствую Вас. Постарался повторить всё как написано. Далее взял пример HELLO из библиотеки. Добавил нужные строки в середине, и конце скетча.  Но к сожалению русских букв не увидел, на экране Hello world, а далее абракадабра. Что я делаю не так ?

#include "ERM19264_UC1609.h"

// LCD setup defines 
#define LCDcontrast 0x49 
#define mylcdheight 64
#define mylcdwidth  192
// GPIO 5-wire SPI interface
#define CD 10 // GPIO pin number pick any you want 
#define RST 9 // GPIO pin number pick any you want
#define CS 8  // GPIO pin number pick any you want
// GPIO pin number SCK(UNO 13) , HW SPI , SCK
// GPIO pin number SDA(UNO 11) , HW SPI , MOSI

ERM19264_UC1609  mylcd(CD, RST, CS); // instantiate object

void setup() 
{
  mylcd.LCDbegin(LCDcontrast); // initialize the OLED
  mylcd.LCDFillScreen(0x00, 0);
  mylcd.setTextColor(FOREGROUND);
  mylcd.setFontNum(1);
}

void loop()
{

  // define a buffer to cover whole screen 
  uint8_t  screenBuffer[mylcdwidth * (mylcdheight/8)]; //1536 bytes

  // Declare a multi buffer struct
  MultiBuffer mybuffer;

  // Intialise struct 
  mybuffer.screenbitmap = (uint8_t*) &screenBuffer; // point it to the buffer
  mybuffer.width = mylcdwidth ;
  mybuffer.height = mylcdheight;
  mybuffer.xoffset = 0;
  mybuffer.yoffset = 0;

  // Assign address of struct to be the active buffer pointer 
  mylcd.ActiveBuffer = &mybuffer;

  mylcd.LCDclearBuffer();   // Clear active buffer 
  
  while (1)
  {
    mylcd.setCursor(20, 20);
    mylcd.print(F("Hello world"));
    mylcd.LCDupdate();  // Update screen , write active buffer to screen 
    delay(5000);   

mylcd.setTextColor(FOREGROUND);
mylcd.setTextSize(1);
mylcd.setCursor(0, 0);
mylcd.print(rus(F("абвгдежзийклмнопрстуфхцчшщъыьэюяпривет, как дела?")));
mylcd.setCursor(0, 16);
mylcd.print(rus(F("АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯПРИВЕТ, КАК ДЕЛА?")));
mylcd.setCursor(0, 32);
mylcd.print(rus(F("ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz :;.$=+#@!")));
   
  }
}
/* Recode russian fonts from UTF-8 to Windows-1251 */
String rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[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 = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}