MenuSystem.h + lcd_1602_rus как вывести меню на русском?

mvn77
Offline
Зарегистрирован: 31.03.2017

Я давно написал программу по отправки каждые 8 и 20 00 данных о состоянии реки по смс и с выгрузкой журнала на фтп через sim800l, работаю метеорологом в росгидромете, сначало было на 328 baskom, потом перешел на stm arduino.И клянчить ничего не надо - благо корявых примеров по выводу символов куча.... А путевая только эта библиотека...

b707
Offline
Зарегистрирован: 26.05.2017

mvn77 пишет:

И клянчить ничего не надо - благо корявых примеров по выводу символов куча.... А путевая только эта библиотека...

тогда в чем проблема? - садись, начинай разбираться. Через пару недель - или месяцев - постепенно начнешь въезжать.

Насколько я вижу метереологов в фильмах - они только и делают, что раз в 4 часа данные отправляют, а между этим чаи гоняют. А ты еще и программу написал - значит тебе даже раз в 4 часа никуда бегать не надо :)

mvn77
Offline
Зарегистрирован: 31.03.2017

друХ мой ну скажи мне memcpy_PF - является функцией arduino?

b707
Offline
Зарегистрирован: 26.05.2017

mvn77 пишет:

ТЬак нахера тыкать, если сам пишеш что серьезная работа - сам себе противоречишь...

ничего не противоречу. Я вот начал трехфазные двигатели изучать. Нифига про них не знаю. Задаю глупые вопросы - иногда посылают по ссылкам, иногда просто посылают... Но я не стестняюсь, читаю ссылки, нифига не понимаю - снова спрашиваю. Через 2 недели знакомства с темой начал по ссылкам знакомые слова находить :)

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

mvn77 пишет:

друХ мой ну скажи мне memcpy_PF - является функцией arduino?

ШЕДЕВР ! 

нет, не является :)))

так же как и memcpy :)))

я плачу от смеха, z80, гтдрометеоцентррр... остановите я сойду.

b707
Offline
Зарегистрирован: 26.05.2017

mvn77 пишет:

друХ мой ну скажи мне memcpy_PF - является функцией arduino?

а sin() - это функция ардуино?

нет никаких "функций ардуино", есть язык программирования С++ и библиотеки к нему. Ардуино (на самом де Wiring) - одна из библиотек C++

b707
Offline
Зарегистрирован: 26.05.2017

mvn - так чего ты от нас то хочешь, я все никак не пойму? - если тебе эта программа нужна для работы - заплати. Если это хобби - то разбирайся сам. Иначе какое же это хобби, если кто-то другой за тебя делает.

А так получается какой-то онанизм - "я хочу чтобы библиотку портировали на СТМ32,  сам не могу, потому что знаний нет... учится не хочу, ибо некогда..."  - тут только золотая рыбка нужна

mvn77
Offline
Зарегистрирован: 31.03.2017

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

b707
Offline
Зарегистрирован: 26.05.2017

mvn77 пишет:

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

я уже несколько раз ответил. Каждому из нас приходится сталкиватся с чем-то новым, в чем он ничего не понимает. И ничего в этом ужасного нет. Я уже привел пример с моторами - я не знаю, дойду ли я до нужного уровня или нет. Но если тебе надо на 32 этаж, то ты вставешь и идешь, других вариантов нет.

Странно, что такую банальщину надо писать взрослому человеку.

mvn77
Offline
Зарегистрирован: 31.03.2017

Проще когда тебе с 32го подают руку.. А не когда антисовок за 10 тыр пытается дать ссылку в окно ведущее на нулевой, воруя твое время а по сути жизнь. Я всегда по мере сил помогаю людям, но не даю ссылки - ссылка это по сути отправление на 3 буквы. вторая моя работа это системный администратор в крупной структуре, где спрашивают как включит компьютер, как написать формулу в эксель, или как нарисовать задние в архикаде или в 3д максе, как бы меня не бесила элементарность вопросов я никого ни разу не отправил в ссылку - а всегда помогаю, и только потом советую учить мат часть. Хотя по должностной инструкции моя работа только следить за работоспособностью техники.

 

b707
Offline
Зарегистрирован: 26.05.2017

mvn77 пишет:

 Я всегда по мере сил помогаю людям, но не даю ссылки - ссылка это по сути отправление на 3 буквы

 

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

А если человек обижается, когда ему даешь ссылку - для меня это точный признак недалекого ума. Я таких не очень уважаю и помогать таким не интресно.

b707
Offline
Зарегистрирован: 26.05.2017

вообще, дать ссылку - это отличный тест. Если человек прочитал и вернулся с вопросами - значит с ним можно работать. Если не вернулся - либо ничего не понял или ему не интересно. Если обиделся - это вообще финиш, значит тупой, пусть идет улицы подметать.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

mvn77 пишет:

вторая моя работа это системный администратор в крупной структуре, где спрашивают как включит компьютер, как написать формулу в эксель, или как нарисовать задние в архикаде или в 3д максе, как бы меня не бесила элементарность вопросов я никого ни разу не отправил в ссылку - а всегда помогаю, и только потом советую учить мат часть. Хотя по должностной инструкции моя работа только следить за работоспособностью техники.

Крупная структура админу вообще ничего не платит или все же наличие должностной подразумевает включение в штатное со всеми вытекающими зарплатами-премиями? Предлагаю походить с полгода еще в штук пять мелких конторок и просто из человеколюбия "почистить от вирусов", "поменять краску в принтере", "починить мышку" и т.п. Потом рассказать как оно - забесплатно отвечать на глупые вопросы 20 часов в день.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Во, блин, тут классический пятничный срач, а я пропустил .... сколько попкорна не съедено :((((

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mvn77 пишет:

Вопрос остается открытым. 

Так закройте его уже! Сколько можно? Пятница закончилась!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mvn77 пишет:

wchar_t это вроде как перведенные символы

Точно!

Если гугл-переводчику отправить обычнае char, то он вернёт wchar_t

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mvn77 пишет:

С 2015 не смотря на обилие умников ее так никто и не портировал под stm 32.

Может, потому, что это никому на ... Вашу ссылку ... не нужно?

mvn77
Offline
Зарегистрирован: 31.03.2017

ЕвгенийП пишет:

Во, блин, тут классический пятничный срач, а я пропустил .... сколько попкорна не съедено :((((

Самое главное был пятничный энтузиазм )))))) Мои оппоненты видно ищут похмелиться..... Надеюсь админ почистит тему.... 

mvn77
Offline
Зарегистрирован: 31.03.2017

Если кому понадобится LCD_1602_RUS-master для STM32 то замените содержимое фала LCD_1602_RUS.cpp из оригинальной библиотеки, нижеприведённым кодом.

 

#include <Arduino.h>
#include <avr/pgmspace.h>
#include "LCD_1602_RUS.h"

wchar_t char_utf8[] = L" ";

//user_custom_symbols - количество символов, доступное пользователю для использования в своих целях (не более 8)
//Всего переопределяемых символов в LCD - 8.
//Символы с индексом от 0 до (7 - user_custom_symbols) используются библиотекой
//Символы с индексом от (8 - user_custom_symbols) до 7 - можно переопределять пользователю
//По умолчанию количество переопределяемых символов равно 0
LCD_1602_RUS :: LCD_1602_RUS(uint8_t lcd_Addr, uint8_t lcd_cols, uint8_t lcd_rows, uint8_t user_custom_symbols) : LiquidCrystal_I2C (lcd_Addr, lcd_cols, lcd_rows)
{
  max_symbol_count = 8 - user_custom_symbols;
  symbol_index = 0;
  cursor_col = 0;
  cursor_row = 0;
  ResetAllIndex();//Сброс значений индексов (неинициализированы = 255)
}
void LCD_1602_RUS::clear()
{
  LiquidCrystal_I2C::clear();
  ResetAllIndex();
}
void LCD_1602_RUS::setCursor(uint8_t col, uint8_t row)
{
  cursor_col = col;
  cursor_row = row;
  LiquidCrystal_I2C::setCursor(cursor_col, cursor_row);
}
uint8_t LCD_1602_RUS::getCursorCol()
{
  return cursor_col;
}
uint8_t LCD_1602_RUS::getCursorRow()
{
  return cursor_row;
}

uint8_t LCD_1602_RUS::mbtowc(wchar_t *_chr, char *_str, uint8_t mb_num) {
  if (mb_num != 2) return 0;
  if ((_str[0] & 0xC0) == 0xC0 && (_str[1] & 0x80) == 0x80) {
    *_chr = ((_str[0] & 0x1F) << 6) + (_str[1] & 0x3F);
    return 2;
  }
  else {
    *_chr = _str[0];
    return 1;
  }
}

void LCD_1602_RUS::print(const char *c_str) {
  wchar_t _str;
  int current_char = 0;
  int size = strlen(c_str);

  while (current_char < size)
  {
    current_char += mbtowc(&_str, (char *)c_str + current_char, 2);
    printwc(_str);
    cursor_col++;
  }
}
void LCD_1602_RUS::print(int val, int base) {
  cursor_col += LiquidCrystal_I2C::print(val, base);
}
void LCD_1602_RUS::print(unsigned int val, int base) {
  cursor_col += LiquidCrystal_I2C::print(val, base);
}
void LCD_1602_RUS::print(long val, int base) {
  cursor_col += LiquidCrystal_I2C::print(val, base);
}
void LCD_1602_RUS::print(unsigned long val, int base) {
  cursor_col += LiquidCrystal_I2C::print(val, base);
}
void LCD_1602_RUS::print(char val, int base) {
  cursor_col += LiquidCrystal_I2C::print(val, base);
}
void LCD_1602_RUS::print(unsigned char val, int base) {
  cursor_col += LiquidCrystal_I2C::print(val, base);
}
void LCD_1602_RUS::print(const String &str) {
  wchar_t _str;
  const char *c_str = str.c_str();
  int current_char = 0;
  int size = str.length();

  while (current_char < size)
  {
    current_char += mbtowc(&_str, (char*)c_str + current_char, 2);
    printwc(_str);
    cursor_col++;
  }
}

void LCD_1602_RUS::print(double val, int base) {
  cursor_col += LiquidCrystal_I2C::print(val, base);
}

void LCD_1602_RUS::print(const wchar_t *_str) {
  int current_char  = 0;
  int size = 0;

  //Определяем длину строки (количество символов)
  while (_str[size] != 0)
  {
    size++;
  }

  while (current_char < size)
  {
    printwc(_str[current_char]);
    current_char++;
    cursor_col++;
  }

}
void LCD_1602_RUS::CharSetToLCD(uint8_t *array, uint8_t *index)
{
  uint8_t x, y;

  if (*index == 255) // Если символ еще не создан, то создаем
  {
    x = getCursorCol();
    y = getCursorRow();
    createChar(symbol_index, (uint8_t *)array);// Создаем символ на текущем (по очереди) месте в знакогенераторе (от 0 до MAX_SYMBOL_COUNT)
    setCursor(x, y);
    write(symbol_index);// Выводим символ на экран
    //Запомианем, что букве соответствует определенный индекс
    *index = symbol_index;
    symbol_index++;
    if (symbol_index >= max_symbol_count)
    {
      symbol_index = 0;
      ResetAllIndex();
    }
  }
  else   //Иначе печатаем уже существующий
    write(*index);
}
void LCD_1602_RUS::ResetAllIndex()
{
  symbol_index = 0;
  index_rus_B = 255;
  index_rus_G = 255;
  index_rus_D = 255;
  index_rus_ZH = 255;
  index_rus_Z = 255;
  index_rus_I = 255;
  index_rus_II = 255;
  index_rus_L = 255;
  index_rus_P = 255;
  index_rus_U = 255;
  index_rus_F = 255;
  index_rus_TS = 255;
  index_rus_CH = 255;
  index_rus_SH = 255;
  index_rus_SCH = 255;
  index_rus_tverd = 255;
  index_rus_Y = 255;
  index_rus_myagk = 255;
  index_rus_EE = 255;
  index_rus_YU = 255;
  index_rus_YA = 255;
  index_rus_b = 255;
  index_rus_v = 255;
  index_rus_g = 255;
  index_rus_d = 255;
  index_rus_yo = 255;
  index_rus_zh = 255;
  index_rus_z = 255;
  index_rus_i = 255;
  index_rus_ii = 255;
  index_rus_k = 255;
  index_rus_l = 255;
  index_rus_m = 255;
  index_rus_n = 255;
  index_rus_p = 255;
  index_rus_t = 255;
  index_rus_u = 255;
  index_rus_f = 255;
  index_rus_ts = 255;
  index_rus_ch = 255;
  index_rus_sh = 255;
  index_rus_sch = 255;
  index_rus_tverd_mal = 255;
  index_rus_y = 255;
  index_rus_myagk_mal = 255;
  index_rus_ee = 255;
  index_rus_yu = 255;
  index_rus_ya = 255;
}

void LCD_1602_RUS::printwc(const wchar_t _chr) {
  uint8_t rus_[8];
  switch (_chr)
  {
    //Русский алфавит, требующий новых символов
    //Единовременно может быть заменено только 8 символов
 case 1041: //Б
      memcpy(rus_, rus_B, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_B);
      break;
    case 1043: //Г
      memcpy(rus_, rus_G, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_G);
      break;
    case 1044: //Д
      memcpy(rus_, rus_D, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_D);
      break;
    case 1046: //Ж
      memcpy(rus_, rus_ZH, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_ZH);
      break;
    case 1047: //З
      memcpy(rus_, rus_Z, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_Z);
      break;
    case 1048: //И
      memcpy(rus_, rus_I, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_I);
      break;
    case 1049: //Й
      memcpy(rus_, rus_II, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_II);
      break;
    case 1051: //Л
      memcpy(rus_, rus_L, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_L);
      break;
    case 1055: //П
      memcpy(rus_, rus_P, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_P);
      break;
    case 1059: //У
      memcpy(rus_, rus_U, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_U);
      break;
    case 1060: //Ф
      memcpy(rus_, rus_F, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_F);
      break;
    case 1062: //Ц
      memcpy(rus_, rus_TS, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_TS);
      break;
    case 1063: //Ч
      memcpy(rus_, rus_CH, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_CH);
      break;
    case 1064: //Ш
      memcpy(rus_, rus_SH, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_SH);
      break;
    case 1065: //Щ
      memcpy(rus_, rus_SCH, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_SCH);
      break;
    case 1066: //Ъ
      memcpy(rus_, rus_tverd, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_tverd);
      break;
    case 1067: //Ы
      memcpy(rus_, rus_Y, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_Y);
      break;
    case 1068: //Ь
      memcpy(rus_, rus_myagk, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_myagk);
      break;
    case 1069: //Э
      memcpy(rus_, rus_EE, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_EE);
      break;
    case 1070: //Ю
      memcpy(rus_, rus_YU, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_YU);
      break;
    case 1071: //Я
      memcpy(rus_, rus_YA, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_YA);
      break;
    case 1073: //б
      memcpy(rus_, rus_b, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_b);
      break;
    case 1074: //в
      memcpy(rus_, rus_v, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_v);
      break;
    case 1075: //г
      memcpy(rus_, rus_g, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_g);
      break;
    case 1076: //д
      memcpy(rus_, rus_d, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_d);
      break;
    case 1105: //ё
      memcpy(rus_, rus_yo, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_yo);
      break;
    case 1078: //ж
      memcpy(rus_, rus_zh, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_zh);
      break;
    case 1079: //з
      memcpy(rus_, rus_z, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_z);
      break;
    case 1080: //и
      memcpy(rus_, rus_i, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_i);
      break;
    case 1081: //й
      memcpy(rus_, rus_ii, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_ii);
      break;
    case 1082: //к
      memcpy(rus_, rus_k, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_k);
      break;
    case 1083: //л
      memcpy(rus_, rus_l, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_l);
      break;
    case 1084: //м
      memcpy(rus_, rus_m, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_m);
      break;
    case 1085: //н
      memcpy(rus_, rus_n, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_n);
      break;
    case 1087: //п
      memcpy(rus_, rus_p, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_p);
      break;
    case 1090: //т
      memcpy(rus_, rus_t, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_t);
      break;
    case 1092: //ф
      memcpy(rus_, rus_f, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_f);
      break;
    case 1094: //ц
      memcpy(rus_, rus_ts, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_ts);
      break;
    case 1095: //ч
      memcpy(rus_, rus_ch, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_ch);
      break;
    case 1096: //ш
      memcpy(rus_, rus_sh, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_sh);
      break;
    case 1097: //щ
      memcpy(rus_, rus_sch, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_sch);
      break;
    case 1098: //ъ
      memcpy(rus_, rus_tverd_mal, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_tverd_mal);
      break;
    case 1099: //ы
      memcpy(rus_, rus_y, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_y);
      break;
    case 1100: //ь
      memcpy(rus_, rus_myagk_mal, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_myagk_mal);
      break;
    case 1101: //э
      memcpy(rus_, rus_ee, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_ee);
      break;
    case 1102: //ю
      memcpy(rus_, rus_yu, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_yu);
      break;
    case 1103: //я
      memcpy(rus_, rus_ya, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_ya);
      break;
    //Русский алфавит, использующий одинаковые с английским алфавитом символы
    case 1040: //А
      LiquidCrystal_I2C::print("A");
      break;
    case 1042: //В
      LiquidCrystal_I2C::print("B");
      break;
    case 1045: //Е
      LiquidCrystal_I2C::print("E");
      break;
    case 1025: //Ё
      LiquidCrystal_I2C::print("E");
      break;
    case 1050: //К
      LiquidCrystal_I2C::print("K");
      break;
    case 1052: //M
      LiquidCrystal_I2C::print("M");
      break;
    case 1053: //H
      LiquidCrystal_I2C::print("H");
      break;
    case 1054: //O
      LiquidCrystal_I2C::print("O");
      break;
    case 1056: //P
      LiquidCrystal_I2C::print("P");
      break;
    case 1057: //C
      LiquidCrystal_I2C::print("C");
      break;
    case 1058: //T
      LiquidCrystal_I2C::print("T");
      break;
    case 1061: //X
      LiquidCrystal_I2C::print("X");
      break;
    case 1072: //а
      LiquidCrystal_I2C::print("a");
      break;
    case 1077: //е
      LiquidCrystal_I2C::print("e");
      break;
    case 1086: //o
      LiquidCrystal_I2C::print("o");
      break;
    case 1088: //p
      LiquidCrystal_I2C::print("p");
      break;
    case 1089: //c
      LiquidCrystal_I2C::print("c");
      break;
    case 1091: //y
      LiquidCrystal_I2C::print("y");
      break;
    case 1093: //x
      LiquidCrystal_I2C::print("x");
      break;
    case 0x00B0: //Знак градуса
      LiquidCrystal_I2C::write(223);
      break;
    //Английский алфавит без изменения
    default:
      LiquidCrystal_I2C::print((char)_chr);
      break;
  }
}

//Перевод символа из кодировки ASCII в UTF-8 (для печати расширенных русских символов на LCD)
wchar_t *LCD_1602_RUS::asciiutf8(unsigned char ascii)
{
  if (ascii == 168) *char_utf8 = 0x401; //код ASCII буквы Ё
  else if (ascii == 184) *char_utf8 = 0x451; //код ASCII буквы ё
  else if ((ascii >= 192) && (ascii <= 255)) //остальные буквы русского алфавита
  {
    *char_utf8 = ascii + 848;
  }
  else *char_utf8 = ascii;

  return char_utf8;
}

//Б
const byte rus_B[8]  {
  0b11111,
  0b10000,
  0b10000,
  0b11110,
  0b10001,
  0b10001,
  0b11110,
  0b00000
};
//Г
const byte rus_G[8] PROGMEM = {
  0b11111,
  0b10000,
  0b10000,
  0b10000,
  0b10000,
  0b10000,
  0b10000,
  0b00000
};
//Д
const byte rus_D[8] PROGMEM = {
  0b00110,
  0b01010,
  0b01010,
  0b01010,
  0b01010,
  0b01010,
  0b11111,
  0b10001
};
//Ж
const byte rus_ZH[8] PROGMEM = {
  0b10101,
  0b10101,
  0b10101,
  0b01110,
  0b10101,
  0b10101,
  0b10101,
  0b00000
};
//З
const byte rus_Z[8] PROGMEM = {
  0b01110,
  0b10001,
  0b00001,
  0b00110,
  0b00001,
  0b10001,
  0b01110,
  0b00000
};
//И
const byte rus_I[8] PROGMEM = {
  0b10001,
  0b10001,
  0b10001,
  0b10011,
  0b10101,
  0b11001,
  0b10001,
  0b00000
};
//Й
const byte rus_II[8] PROGMEM = {
  0b10101,
  0b10001,
  0b10001,
  0b10011,
  0b10101,
  0b11001,
  0b10001,
  0b00000
};
//Л
const byte rus_L[8] PROGMEM = {
  0b00111,
  0b01001,
  0b01001,
  0b01001,
  0b01001,
  0b01001,
  0b10001,
  0b00000
};
//П
const byte rus_P[8] PROGMEM = {
  0b11111,
  0b10001,
  0b10001,
  0b10001,
  0b10001,
  0b10001,
  0b10001,
  0b00000
};
//У
const byte rus_U[8] PROGMEM = {
  0b10001,
  0b10001,
  0b10001,
  0b01111,
  0b00001,
  0b10001,
  0b01110,
  0b00000
};
//Ф
const byte rus_F[8] PROGMEM = {
  0b00100,
  0b01110,
  0b10101,
  0b10101,
  0b10101,
  0b01110,
  0b00100,
  0b00000
};
//Ц
const byte rus_TS[8] PROGMEM = {
  0b10010,
  0b10010,
  0b10010,
  0b10010,
  0b10010,
  0b10010,
  0b11111,
  0b00001
};
//Ч
const byte rus_CH[8] PROGMEM = {
  0b10001,
  0b10001,
  0b10001,
  0b01111,
  0b00001,
  0b00001,
  0b00001,
  0b00000
};
//Ш
const byte rus_SH[8] PROGMEM = {
  0b10001,
  0b10001,
  0b10001,
  0b10101,
  0b10101,
  0b10101,
  0b11111,
  0b00000
};
//Щ
const byte rus_SCH[8] PROGMEM = {
  0b10001,
  0b10001,
  0b10001,
  0b10101,
  0b10101,
  0b10101,
  0b11111,
  0b00001
};
//Ъ
const byte rus_tverd[8] PROGMEM = {
  0b11000,
  0b01000,
  0b01000,
  0b01110,
  0b01001,
  0b01001,
  0b01110,
  0b00000
};
//Ы
const byte rus_Y[8] PROGMEM = {
  0b10001,
  0b10001,
  0b10001,
  0b11101,
  0b10011,
  0b10011,
  0b11101,
  0b00000
};
//Ь
const byte rus_myagk[8] PROGMEM = {
  0b10000,
  0b10000,
  0b10000,
  0b11110,
  0b10001,
  0b10001,
  0b11110,
  0b00000
};
//Э
const byte rus_EE[8] PROGMEM = {
  0b01110,
  0b10001,
  0b00001,
  0b00111,
  0b00001,
  0b10001,
  0b01110,
  0b00000
};
//Ю
const byte rus_YU[8] PROGMEM = {
  0b10010,
  0b10101,
  0b10101,
  0b11101,
  0b10101,
  0b10101,
  0b10010,
  0b00000
};
//Я
const byte rus_YA[8] PROGMEM = {
  0b01111,
  0b10001,
  0b10001,
  0b01111,
  0b00101,
  0b01001,
  0b10001,
  0b00000
};
const byte rus_b[8] PROGMEM = {
  0b00011,
  0b01100,
  0b10000,
  0b11110,
  0b10001,
  0b10001,
  0b01110,
  0b00000
};//б
const byte rus_v[8] PROGMEM = {
  0b00000,
  0b00000,
  0b11110,
  0b10001,
  0b11110,
  0b10001,
  0b11110,
  0b00000
};//в
const byte rus_g[8] PROGMEM = {
  0b00000,
  0b00000,
  0b11110,
  0b10000,
  0b10000,
  0b10000,
  0b10000,
  0b00000
};//г
const byte rus_d[8] PROGMEM = {
  0b00000,
  0b00000,
  0b00110,
  0b01010,
  0b01010,
  0b01010,
  0b11111,
  0b10001
};//д
const byte rus_yo[8] PROGMEM = {
  0b01010,
  0b00000,
  0b01110,
  0b10001,
  0b11111,
  0b10000,
  0b01111,
  0b00000
};//ё
const byte rus_zh[8] PROGMEM = {
  0b00000,
  0b00000,
  0b10101,
  0b10101,
  0b01110,
  0b10101,
  0b10101,
  0b00000
};//ж
const byte rus_z[8] PROGMEM = {
  0b00000,
  0b00000,
  0b01110,
  0b10001,
  0b00110,
  0b10001,
  0b01110,
  0b00000
};//з
const byte rus_i[8] PROGMEM = {
  0b00000,
  0b00000,
  0b10001,
  0b10011,
  0b10101,
  0b11001,
  0b10001,
  0b00000
};//и
const byte rus_ii[8] PROGMEM = {
  0b01010,
  0b00100,
  0b10001,
  0b10011,
  0b10101,
  0b11001,
  0b10001,
  0b00000
};//й
const byte rus_k[8] PROGMEM = {
  0b00000,
  0b00000,
  0b10010,
  0b10100,
  0b11000,
  0b10100,
  0b10010,
  0b00000
};//к
const byte rus_l[8] PROGMEM = {
  0b00000,
  0b00000,
  0b00111,
  0b01001,
  0b01001,
  0b01001,
  0b10001,
  0b00000
};//л
const byte rus_m[8] PROGMEM = {
  0b00000,
  0b00000,
  0b10001,
  0b11011,
  0b10101,
  0b10001,
  0b10001,
  0b00000
};//м
const byte rus_n[8] PROGMEM = {
  0b00000,
  0b00000,
  0b10001,
  0b10001,
  0b11111,
  0b10001,
  0b10001,
  0b00000
};//н
const byte rus_p[8] PROGMEM = {
  0b00000,
  0b00000,
  0b11111,
  0b10001,
  0b10001,
  0b10001,
  0b10001,
  0b00000
};//п
const byte rus_t[8] PROGMEM = {
  0b00000,
  0b00000,
  0b11111,
  0b00100,
  0b00100,
  0b00100,
  0b00100,
  0b00000
};//т
const byte rus_f[8] PROGMEM = {
  0b00000,
  0b00000,
  0b00100,
  0b01110,
  0b10101,
  0b01110,
  0b00100,
  0b00000
};//ф
const byte rus_ts[8] PROGMEM = {
  0b00000,
  0b00000,
  0b10010,
  0b10010,
  0b10010,
  0b10010,
  0b11111,
  0b00001
};//ц
const byte rus_ch[8] PROGMEM = {
  0b00000,
  0b00000,
  0b10001,
  0b10001,
  0b01111,
  0b00001,
  0b00001,
  0b00000
};//ч
const byte rus_sh[8] PROGMEM = {
  0b00000,
  0b00000,
  0b10101,
  0b10101,
  0b10101,
  0b10101,
  0b11111,
  0b00000
};//ш
const byte rus_sch[8] PROGMEM = {
  0b00000,
  0b00000,
  0b10101,
  0b10101,
  0b10101,
  0b10101,
  0b11111,
  0b00001
};//щ
const byte rus_tverd_mal[8] PROGMEM = {
  0b00000,
  0b00000,
  0b11000,
  0b01000,
  0b01110,
  0b01001,
  0b01110,
  0b00000
};//ъ
const byte rus_y[8] PROGMEM = {
  0b00000,
  0b00000,
  0b10001,
  0b10001,
  0b11101,
  0b10011,
  0b11101,
  0b00000
};//ы
const byte rus_myagk_mal[8] PROGMEM = {
  0b00000,
  0b00000,
  0b10000,
  0b10000,
  0b11110,
  0b10001,
  0b11110,
  0b00000
};//ь
const byte rus_ee[8] PROGMEM = {
  0b00000,
  0b00000,
  0b01110,
  0b10001,
  0b00111,
  0b10001,
  0b01110,
  0b00000
};//э
const byte rus_yu[8] PROGMEM = {
  0b00000,
  0b00000,
  0b10010,
  0b10101,
  0b11101,
  0b10101,
  0b10010,
  0b00000
};//ю
const byte rus_ya[8] PROGMEM = {
  0b00000,
  0b00000,
  0b01111,
  0b10001,
  0b01111,
  0b00101,
  0b01001,
  0b00000
};//я

 

ssilver2007
Offline
Зарегистрирован: 21.01.2016

Небольшое дополнение: PROGMEM надо убрать для всех символов, а не только для 'rus_B'.

mvn77
Offline
Зарегистрирован: 31.03.2017

Да верно! К сожалению не могу исправить в тексте кода выше. Проверял еденичный симво - хотя и так компилируется и работает без ошибок. Спасибо автору за подсказки.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mvn77 пишет:

Если кому понадобится LCD_1602_RUS-master для STM32 то замените содержимое фала LCD_1602_RUS.cpp из оригинальной библиотеки, нижеприведённым кодом.

Ой, нет, спасибо!

Это только дети всякую каку в рот тянут. Взрослый человек такое в свою программу вставлять не будет.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Короче так. Сегодня Шабат, я пока трезвый и человеколюбивый.

вот пример из этой поделки:

#include <LCD_1602_RUS_STM32.h>

LCD_1602_RUS lcd(0x27, 16, 2);

void setup()
{
  lcd.init();                      // initialize the lcd
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(2, 0);
  lcd.print(L"Теперь можно");
  lcd.setCursor(3, 1);
  lcd.print(L"по-русски");

}

void loop()
{
}

Имя библиотеки я дополнил буквами STM32, чтобы можно было положить ее рядом с оригинальной.

Вот измененный .cpp файл. .h не менялся.

#include <Arduino.h>
#include "LCD_1602_RUS_STM32.h"

wchar_t char_utf8[] = L" ";

//user_custom_symbols - количество символов, доступное пользователю для использования в своих целях (не более 8)
//Всего переопределяемых символов в LCD - 8.
//Символы с индексом от 0 до (7 - user_custom_symbols) используются библиотекой
//Символы с индексом от (8 - user_custom_symbols) до 7 - можно переопределять пользователю
//По умолчанию количество переопределяемых символов равно 0
LCD_1602_RUS :: LCD_1602_RUS(uint8_t lcd_Addr, uint8_t lcd_cols, uint8_t lcd_rows, uint8_t user_custom_symbols) : LiquidCrystal_I2C (lcd_Addr, lcd_cols, lcd_rows)
{
  max_symbol_count = 8 - user_custom_symbols;
  symbol_index = 0;
  cursor_col = 0;
  cursor_row = 0;
  ResetAllIndex();//Сброс значений индексов (неинициализированы = 255)
}
void LCD_1602_RUS::clear()
{
  LiquidCrystal_I2C::clear();
  ResetAllIndex();
}
void LCD_1602_RUS::setCursor(uint8_t col, uint8_t row)
{
  cursor_col = col;
  cursor_row = row;
  LiquidCrystal_I2C::setCursor(cursor_col, cursor_row);
}
uint8_t LCD_1602_RUS::getCursorCol()
{
  return cursor_col;
}
uint8_t LCD_1602_RUS::getCursorRow()
{
  return cursor_row;
}

uint8_t LCD_1602_RUS::mbtowc(wchar_t *_chr, char *_str, uint8_t mb_num) {
  if (mb_num != 2) return 0;
  if ((_str[0] & 0xC0) == 0xC0 && (_str[1] & 0x80) == 0x80) {
    *_chr = ((_str[0] & 0x1F) << 6) + (_str[1] & 0x3F);
    return 2;
  }
  else {
    *_chr = _str[0];
    return 1;
  }
}

void LCD_1602_RUS::print(const char *c_str) {
  wchar_t _str;
  int current_char = 0;
  int size = strlen(c_str);

  while (current_char < size)
  {
    current_char += mbtowc(&_str, (char *)c_str + current_char, 2);
    printwc(_str);
    cursor_col++;
  }
}
void LCD_1602_RUS::print(int val, int base) {
  cursor_col += LiquidCrystal_I2C::print(val, base);
}
void LCD_1602_RUS::print(unsigned int val, int base) {
  cursor_col += LiquidCrystal_I2C::print(val, base);
}
void LCD_1602_RUS::print(long val, int base) {
  cursor_col += LiquidCrystal_I2C::print(val, base);
}
void LCD_1602_RUS::print(unsigned long val, int base) {
  cursor_col += LiquidCrystal_I2C::print(val, base);
}
void LCD_1602_RUS::print(char val, int base) {
  cursor_col += LiquidCrystal_I2C::print(val, base);
}
void LCD_1602_RUS::print(unsigned char val, int base) {
  cursor_col += LiquidCrystal_I2C::print(val, base);
}
void LCD_1602_RUS::print(const String &str) {
  wchar_t _str;
  const char *c_str = str.c_str();
  int current_char = 0;
  int size = str.length();

  while (current_char < size)
  {
    current_char += mbtowc(&_str, (char*)c_str + current_char, 2);
    printwc(_str);
    cursor_col++;
  }
}

void LCD_1602_RUS::print(double val, int base) {
  cursor_col += LiquidCrystal_I2C::print(val, base);
}

void LCD_1602_RUS::print(const wchar_t *_str) {
  int current_char  = 0;
  int size = 0;

  //Определяем длину строки (количество символов)
  while (_str[size] != 0)
  {
    size++;
  }

  while (current_char < size)
  {
    printwc(_str[current_char]);
    current_char++;
    cursor_col++;
  }

}
void LCD_1602_RUS::CharSetToLCD(uint8_t *array, uint8_t *index)
{
  uint8_t x, y;

  if (*index == 255) // Если символ еще не создан, то создаем
  {
    x = getCursorCol();
    y = getCursorRow();
    createChar(symbol_index, (uint8_t *)array);// Создаем символ на текущем (по очереди) месте в знакогенераторе (от 0 до MAX_SYMBOL_COUNT)
    setCursor(x, y);
    write(symbol_index);// Выводим символ на экран
    //Запомианем, что букве соответствует определенный индекс
    *index = symbol_index;
    symbol_index++;
    if (symbol_index >= max_symbol_count)
    {
      symbol_index = 0;
      ResetAllIndex();
    }
  }
  else   //Иначе печатаем уже существующий
    write(*index);
}
void LCD_1602_RUS::ResetAllIndex()
{
  symbol_index = 0;
  index_rus_B = 255;
  index_rus_G = 255;
  index_rus_D = 255;
  index_rus_ZH = 255;
  index_rus_Z = 255;
  index_rus_I = 255;
  index_rus_II = 255;
  index_rus_L = 255;
  index_rus_P = 255;
  index_rus_U = 255;
  index_rus_F = 255;
  index_rus_TS = 255;
  index_rus_CH = 255;
  index_rus_SH = 255;
  index_rus_SCH = 255;
  index_rus_tverd = 255;
  index_rus_Y = 255;
  index_rus_myagk = 255;
  index_rus_EE = 255;
  index_rus_YU = 255;
  index_rus_YA = 255;
  index_rus_b = 255;
  index_rus_v = 255;
  index_rus_g = 255;
  index_rus_d = 255;
  index_rus_yo = 255;
  index_rus_zh = 255;
  index_rus_z = 255;
  index_rus_i = 255;
  index_rus_ii = 255;
  index_rus_k = 255;
  index_rus_l = 255;
  index_rus_m = 255;
  index_rus_n = 255;
  index_rus_p = 255;
  index_rus_t = 255;
  index_rus_u = 255;
  index_rus_f = 255;
  index_rus_ts = 255;
  index_rus_ch = 255;
  index_rus_sh = 255;
  index_rus_sch = 255;
  index_rus_tverd_mal = 255;
  index_rus_y = 255;
  index_rus_myagk_mal = 255;
  index_rus_ee = 255;
  index_rus_yu = 255;
  index_rus_ya = 255;
}

void LCD_1602_RUS::printwc(const wchar_t _chr) {
  uint8_t rus_[8];
  switch (_chr)
  {
    //Русский алфавит, требующий новых символов
    //Единовременно может быть заменено только 8 символов
    case 1041: //Б
      memcpy(rus_, (const char *)rus_B, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_B);
      break;
    case 1043: //Г
      memcpy(rus_, (const char *)rus_G, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_G);
      break;
    case 1044: //Д
      memcpy(rus_, (const char *)rus_D, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_D);
      break;
    case 1046: //Ж
      memcpy(rus_, (const char *)rus_ZH, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_ZH);
      break;
    case 1047: //З
      memcpy(rus_, (const char *)rus_Z, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_Z);
      break;
    case 1048: //И
      memcpy(rus_, (const char *)rus_I, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_I);
      break;
    case 1049: //Й
      memcpy(rus_, (const char *)rus_II, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_II);
      break;
    case 1051: //Л
      memcpy(rus_, (const char *)rus_L, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_L);
      break;
    case 1055: //П
      memcpy(rus_, (const char *)rus_P, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_P);
      break;
    case 1059: //У
      memcpy(rus_, (const char *)rus_U, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_U);
      break;
    case 1060: //Ф
      memcpy(rus_, (const char *)rus_F, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_F);
      break;
    case 1062: //Ц
      memcpy(rus_, (const char *)rus_TS, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_TS);
      break;
    case 1063: //Ч
      memcpy(rus_, (const char *)rus_CH, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_CH);
      break;
    case 1064: //Ш
      memcpy(rus_, (const char *)rus_SH, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_SH);
      break;
    case 1065: //Щ
      memcpy(rus_, (const char *)rus_SCH, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_SCH);
      break;
    case 1066: //Ъ
      memcpy(rus_, (const char *)rus_tverd, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_tverd);
      break;
    case 1067: //Ы
      memcpy(rus_, (const char *)rus_Y, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_Y);
      break;
    case 1068: //Ь
      memcpy(rus_, (const char *)rus_myagk, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_myagk);
      break;
    case 1069: //Э
      memcpy(rus_, (const char *)rus_EE, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_EE);
      break;
    case 1070: //Ю
      memcpy(rus_, (const char *)rus_YU, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_YU);
      break;
    case 1071: //Я
      memcpy(rus_, (const char *)rus_YA, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_YA);
      break;
    case 1073: //б
      memcpy(rus_, (const char *)rus_b, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_b);
      break;
    case 1074: //в
      memcpy(rus_, (const char *)rus_v, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_v);
      break;
    case 1075: //г
      memcpy(rus_, (const char *)rus_g, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_g);
      break;
    case 1076: //д
      memcpy(rus_, (const char *)rus_d, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_d);
      break;
    case 1105: //ё
      memcpy(rus_, (const char *)rus_yo, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_yo);
      break;
    case 1078: //ж
      memcpy(rus_, (const char *)rus_zh, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_zh);
      break;
    case 1079: //з
      memcpy(rus_, (const char *)rus_z, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_z);
      break;
    case 1080: //и
      memcpy(rus_, (const char *)rus_i, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_i);
      break;
    case 1081: //й
      memcpy(rus_, (const char *)rus_ii, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_ii);
      break;
    case 1082: //к
      memcpy(rus_, (const char *)rus_k, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_k);
      break;
    case 1083: //л
      memcpy(rus_, (const char *)rus_l, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_l);
      break;
    case 1084: //м
      memcpy(rus_, (const char *)rus_m, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_m);
      break;
    case 1085: //н
      memcpy(rus_, (const char *)rus_n, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_n);
      break;
    case 1087: //п
      memcpy(rus_, (const char *)rus_p, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_p);
      break;
    case 1090: //т
      memcpy(rus_, (const char *)rus_t, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_t);
      break;
    case 1092: //ф
      memcpy(rus_, (const char *)rus_f, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_f);
      break;
    case 1094: //ц
      memcpy(rus_, (const char *)rus_ts, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_ts);
      break;
    case 1095: //ч
      memcpy(rus_, (const char *)rus_ch, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_ch);
      break;
    case 1096: //ш
      memcpy(rus_, (const char *)rus_sh, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_sh);
      break;
    case 1097: //щ
      memcpy(rus_, (const char *)rus_sch, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_sch);
      break;
    case 1098: //ъ
      memcpy(rus_, (const char *)rus_tverd_mal, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_tverd_mal);
      break;
    case 1099: //ы
      memcpy(rus_, (const char *)rus_y, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_y);
      break;
    case 1100: //ь
      memcpy(rus_, (const char *)rus_myagk_mal, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_myagk_mal);
      break;
    case 1101: //э
      memcpy(rus_, (const char *)rus_ee, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_ee);
      break;
    case 1102: //ю
      memcpy(rus_, (const char *)rus_yu, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_yu);
      break;
    case 1103: //я
      memcpy(rus_, (const char *)rus_ya, 8);
      CharSetToLCD((uint8_t *)rus_, &index_rus_ya);
      break;
    //Русский алфавит, использующий одинаковые с английским алфавитом символы
    case 1040: //А
      LiquidCrystal_I2C::print("A");
      break;
    case 1042: //В
      LiquidCrystal_I2C::print("B");
      break;
    case 1045: //Е
      LiquidCrystal_I2C::print("E");
      break;
    case 1025: //Ё
      LiquidCrystal_I2C::print("E");
      break;
    case 1050: //К
      LiquidCrystal_I2C::print("K");
      break;
    case 1052: //M
      LiquidCrystal_I2C::print("M");
      break;
    case 1053: //H
      LiquidCrystal_I2C::print("H");
      break;
    case 1054: //O
      LiquidCrystal_I2C::print("O");
      break;
    case 1056: //P
      LiquidCrystal_I2C::print("P");
      break;
    case 1057: //C
      LiquidCrystal_I2C::print("C");
      break;
    case 1058: //T
      LiquidCrystal_I2C::print("T");
      break;
    case 1061: //X
      LiquidCrystal_I2C::print("X");
      break;
    case 1072: //а
      LiquidCrystal_I2C::print("a");
      break;
    case 1077: //е
      LiquidCrystal_I2C::print("e");
      break;
    case 1086: //o
      LiquidCrystal_I2C::print("o");
      break;
    case 1088: //p
      LiquidCrystal_I2C::print("p");
      break;
    case 1089: //c
      LiquidCrystal_I2C::print("c");
      break;
    case 1091: //y
      LiquidCrystal_I2C::print("y");
      break;
    case 1093: //x
      LiquidCrystal_I2C::print("x");
      break;
    case 0x00B0: //Знак градуса
      LiquidCrystal_I2C::write(223);
      break;
    //Английский алфавит без изменения
    default:
      LiquidCrystal_I2C::print((char)_chr);
      break;
  }
}

//Перевод символа из кодировки ASCII в UTF-8 (для печати расширенных русских символов на LCD)
wchar_t *LCD_1602_RUS::asciiutf8(unsigned char ascii)
{
  if (ascii == 168) *char_utf8 = 0x401; //код ASCII буквы Ё
  else if (ascii == 184) *char_utf8 = 0x451; //код ASCII буквы ё
  else if ((ascii >= 192) && (ascii <= 255)) //остальные буквы русского алфавита
  {
    *char_utf8 = ascii + 848;
  }
  else *char_utf8 = ascii;

  return char_utf8;
}

//Б
const byte rus_B[8] = {
  0b11111,
  0b10000,
  0b10000,
  0b11110,
  0b10001,
  0b10001,
  0b11110,
  0b00000
};
//Г
const byte rus_G[8] = {
  0b11111,
  0b10000,
  0b10000,
  0b10000,
  0b10000,
  0b10000,
  0b10000,
  0b00000
};
//Д
const byte rus_D[8] = {
  0b00110,
  0b01010,
  0b01010,
  0b01010,
  0b01010,
  0b01010,
  0b11111,
  0b10001
};
//Ж
const byte rus_ZH[8] = {
  0b10101,
  0b10101,
  0b10101,
  0b01110,
  0b10101,
  0b10101,
  0b10101,
  0b00000
};
//З
const byte rus_Z[8]  = {
  0b01110,
  0b10001,
  0b00001,
  0b00110,
  0b00001,
  0b10001,
  0b01110,
  0b00000
};
//И
const byte rus_I[8]  = {
  0b10001,
  0b10001,
  0b10001,
  0b10011,
  0b10101,
  0b11001,
  0b10001,
  0b00000
};
//Й
const byte rus_II[8]  = {
  0b10101,
  0b10001,
  0b10001,
  0b10011,
  0b10101,
  0b11001,
  0b10001,
  0b00000
};
//Л
const byte rus_L[8]  = {
  0b00111,
  0b01001,
  0b01001,
  0b01001,
  0b01001,
  0b01001,
  0b10001,
  0b00000
};
//П
const byte rus_P[8]  = {
  0b11111,
  0b10001,
  0b10001,
  0b10001,
  0b10001,
  0b10001,
  0b10001,
  0b00000
};
//У
const byte rus_U[8]  = {
  0b10001,
  0b10001,
  0b10001,
  0b01111,
  0b00001,
  0b10001,
  0b01110,
  0b00000
};
//Ф
const byte rus_F[8]  = {
  0b00100,
  0b01110,
  0b10101,
  0b10101,
  0b10101,
  0b01110,
  0b00100,
  0b00000
};
//Ц
const byte rus_TS[8]  = {
  0b10010,
  0b10010,
  0b10010,
  0b10010,
  0b10010,
  0b10010,
  0b11111,
  0b00001
};
//Ч
const byte rus_CH[8] = {
  0b10001,
  0b10001,
  0b10001,
  0b01111,
  0b00001,
  0b00001,
  0b00001,
  0b00000
};
//Ш
const byte rus_SH[8]  = {
  0b10001,
  0b10001,
  0b10001,
  0b10101,
  0b10101,
  0b10101,
  0b11111,
  0b00000
};
//Щ
const byte rus_SCH[8]  = {
  0b10001,
  0b10001,
  0b10001,
  0b10101,
  0b10101,
  0b10101,
  0b11111,
  0b00001
};
//Ъ
const byte rus_tverd[8]  = {
  0b11000,
  0b01000,
  0b01000,
  0b01110,
  0b01001,
  0b01001,
  0b01110,
  0b00000
};
//Ы
const byte rus_Y[8]  = {
  0b10001,
  0b10001,
  0b10001,
  0b11101,
  0b10011,
  0b10011,
  0b11101,
  0b00000
};
//Ь
const byte rus_myagk[8] = {
  0b10000,
  0b10000,
  0b10000,
  0b11110,
  0b10001,
  0b10001,
  0b11110,
  0b00000
};
//Э
const byte rus_EE[8]  = {
  0b01110,
  0b10001,
  0b00001,
  0b00111,
  0b00001,
  0b10001,
  0b01110,
  0b00000
};
//Ю
const byte rus_YU[8]  = {
  0b10010,
  0b10101,
  0b10101,
  0b11101,
  0b10101,
  0b10101,
  0b10010,
  0b00000
};
//Я
const byte rus_YA[8]  = {
  0b01111,
  0b10001,
  0b10001,
  0b01111,
  0b00101,
  0b01001,
  0b10001,
  0b00000
};
const byte rus_b[8]  = {
  0b00011,
  0b01100,
  0b10000,
  0b11110,
  0b10001,
  0b10001,
  0b01110,
  0b00000
};//б
const byte rus_v[8]  = {
  0b00000,
  0b00000,
  0b11110,
  0b10001,
  0b11110,
  0b10001,
  0b11110,
  0b00000
};//в
const byte rus_g[8]  = {
  0b00000,
  0b00000,
  0b11110,
  0b10000,
  0b10000,
  0b10000,
  0b10000,
  0b00000
};//г
const byte rus_d[8]  = {
  0b00000,
  0b00000,
  0b00110,
  0b01010,
  0b01010,
  0b01010,
  0b11111,
  0b10001
};//д
const byte rus_yo[8]  = {
  0b01010,
  0b00000,
  0b01110,
  0b10001,
  0b11111,
  0b10000,
  0b01111,
  0b00000
};//ё
const byte rus_zh[8]  = {
  0b00000,
  0b00000,
  0b10101,
  0b10101,
  0b01110,
  0b10101,
  0b10101,
  0b00000
};//ж
const byte rus_z[8]  = {
  0b00000,
  0b00000,
  0b01110,
  0b10001,
  0b00110,
  0b10001,
  0b01110,
  0b00000
};//з
const byte rus_i[8]  = {
  0b00000,
  0b00000,
  0b10001,
  0b10011,
  0b10101,
  0b11001,
  0b10001,
  0b00000
};//и
const byte rus_ii[8]  = {
  0b01010,
  0b00100,
  0b10001,
  0b10011,
  0b10101,
  0b11001,
  0b10001,
  0b00000
};//й
const byte rus_k[8]  = {
  0b00000,
  0b00000,
  0b10010,
  0b10100,
  0b11000,
  0b10100,
  0b10010,
  0b00000
};//к
const byte rus_l[8]  = {
  0b00000,
  0b00000,
  0b00111,
  0b01001,
  0b01001,
  0b01001,
  0b10001,
  0b00000
};//л
const byte rus_m[8]  = {
  0b00000,
  0b00000,
  0b10001,
  0b11011,
  0b10101,
  0b10001,
  0b10001,
  0b00000
};//м
const byte rus_n[8]  = {
  0b00000,
  0b00000,
  0b10001,
  0b10001,
  0b11111,
  0b10001,
  0b10001,
  0b00000
};//н
const byte rus_p[8]  = {
  0b00000,
  0b00000,
  0b11111,
  0b10001,
  0b10001,
  0b10001,
  0b10001,
  0b00000
};//п
const byte rus_t[8]  = {
  0b00000,
  0b00000,
  0b11111,
  0b00100,
  0b00100,
  0b00100,
  0b00100,
  0b00000
};//т
const byte rus_f[8]  = {
  0b00000,
  0b00000,
  0b00100,
  0b01110,
  0b10101,
  0b01110,
  0b00100,
  0b00000
};//ф
const byte rus_ts[8]  = {
  0b00000,
  0b00000,
  0b10010,
  0b10010,
  0b10010,
  0b10010,
  0b11111,
  0b00001
};//ц
const byte rus_ch[8]  = {
  0b00000,
  0b00000,
  0b10001,
  0b10001,
  0b01111,
  0b00001,
  0b00001,
  0b00000
};//ч
const byte rus_sh[8] = {
  0b00000,
  0b00000,
  0b10101,
  0b10101,
  0b10101,
  0b10101,
  0b11111,
  0b00000
};//ш
const byte rus_sch[8]  = {
  0b00000,
  0b00000,
  0b10101,
  0b10101,
  0b10101,
  0b10101,
  0b11111,
  0b00001
};//щ
const byte rus_tverd_mal[8]  = {
  0b00000,
  0b00000,
  0b11000,
  0b01000,
  0b01110,
  0b01001,
  0b01110,
  0b00000
};//ъ
const byte rus_y[8]  = {
  0b00000,
  0b00000,
  0b10001,
  0b10001,
  0b11101,
  0b10011,
  0b11101,
  0b00000
};//ы
const byte rus_myagk_mal[8]  = {
  0b00000,
  0b00000,
  0b10000,
  0b10000,
  0b11110,
  0b10001,
  0b11110,
  0b00000
};//ь
const byte rus_ee[8]  = {
  0b00000,
  0b00000,
  0b01110,
  0b10001,
  0b00111,
  0b10001,
  0b01110,
  0b00000
};//э
const byte rus_yu[8]  = {
  0b00000,
  0b00000,
  0b10010,
  0b10101,
  0b11101,
  0b10101,
  0b10010,
  0b00000
};//ю
const byte rus_ya[8]  = {
  0b00000,
  0b00000,
  0b01111,
  0b10001,
  0b01111,
  0b00101,
  0b01001,
  0b00000
};//я

изменения - убрать все о PROGMEM, но оставить const. Изменить преобразование  типа вместо (uint32_t) , (const char *).

------------------------------

В целом библиотека - дикое говно, но раз люди плачут - вот версия для СТМ32.

Требования по СТМ: последняя версия и среды и стм32дуино. В более ранней - на другом компе у меня не собрался даже пример из ЛиквидКристаллИ2С - обычной. А в новой - он уже нормально собирается под СТМ32.

---------------------------

Ну и, по доброй традиции, пруф-видео на утубе.

mvn77
Offline
Зарегистрирован: 31.03.2017

Все пятница закончилась! Хоре ругатся.

А по поводу "помойки" - напиши лучше и обсудим. Только эта помойка единственная в своем роде и самая используемая в виду дешивизны китайских дисплеев. И нас это устраивает на все 100. А если по поводу "взорслых дядек" они пишут в другой более взрослой среде, а ардуино изночально писалась для школьников.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Сам напиши. Тебе же надо. Мне вот не надо я и не пишу.