LCD1602 RUS или НЕ RUS помогите определиться...
- Войдите на сайт для отправки комментариев
Пнд, 08/04/2019 - 17:41
День добрый. Имеется дисплей 1602 вот такого вида:
Использую библиотеку LiquidCrystal_I2C при загрузке примера CustomChars
//YWROBOT //Compatible with the Arduino IDE 1.0 //Library version:1.1 #include <Wire.h> #include <LiquidCrystal_I2C.h> #if defined(ARDUINO) && ARDUINO >= 100 #define printByte(args) write(args); #else #define printByte(args) print(args,BYTE); #endif uint8_t bell[8] = {0x4,0xe,0xe,0xe,0x1f,0x0,0x4}; uint8_t note[8] = {0x2,0x3,0x2,0xe,0x1e,0xc,0x0}; uint8_t clock[8] = {0x0,0xe,0x15,0x17,0x11,0xe,0x0}; uint8_t heart[8] = {0x0,0xa,0x1f,0x1f,0xe,0x4,0x0}; uint8_t duck[8] = {0x0,0xc,0x1d,0xf,0xf,0x6,0x0}; uint8_t check[8] = {0x0,0x1,0x3,0x16,0x1c,0x8,0x0}; uint8_t cross[8] = {0x0,0x1b,0xe,0x4,0xe,0x1b,0x0}; uint8_t retarrow[8] = { 0x1,0x1,0x5,0x9,0x1f,0x8,0x4}; LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display void setup() { lcd.init(); // initialize the lcd lcd.backlight(); lcd.createChar(0, bell); lcd.createChar(1, note); lcd.createChar(2, clock); lcd.createChar(3, heart); lcd.createChar(4, duck); lcd.createChar(5, check); lcd.createChar(6, cross); lcd.createChar(7, retarrow); lcd.home(); lcd.print("Hello world..."); lcd.setCursor(0, 1); lcd.print(" i "); lcd.printByte(3); lcd.print(" arduinos!"); delay(5000); displayKeyCodes(); } // display all keycodes void displayKeyCodes(void) { uint8_t i = 0; while (1) { lcd.clear(); lcd.print("Codes 0x"); lcd.print(i, HEX); lcd.print("-0x"); lcd.print(i+16, HEX); lcd.setCursor(0, 1); for (int j=0; j<16; j++) { lcd.printByte(i+j); } i+=16; delay(4000); } } void loop() { }
На экране выводит последовательно все символы зашитые в дисплей, если я это правильно понял... И среди прочего вот такие картинки:
Т.е. в дисплее русский язык типа есть, но при попытке, что либо писать по русски вылазят иероглифы. Я так понимаю, что в дисплее сдвинута кодовая страница русского языка??? Не подскажите есть ли возможность это поправить???
http://robotosha.ru/electronics/lcd-hd44780.html -> Конвертер кириллицы
Там нет кодовой страницы как таковой)) Есть набор русских букв, причем не имеющих аналогов в английском и все. Так что или изначально конвертировать строки или есть куча подпрограмм которые это делают на лету.
PRC, ну вроде в природе существуют несколько вариантов данных экранок? В одних русский есть и работает без проблем, в других его нет совсем (по крайней мере на ю-тубе у людей по выше указанному скетчу он совсем не выводит ни одной русской буквы) и вот такой вариант как у меня - русские буквы вроде как есть, но без бубна не обойтись.... Или я не прав???
sadman41, как бы не плохо, но в текущий момент мне нужно считывать данные с файлика на SD и выводить данные на экран, пока не доганяю как можно воспользоваться конвертером...
Блин ((((.... Лет 5-ть назад последний раз брал в руки сей модуль, в то время он был еще без I2C и вот точно помню, что мне кто то из добрых людей помог с библиотекой, которая отлично выводила русский текс без какого либо шаманства, без подмены русских букв английскими и прочего, но в этот промежуток времени вмешалась смена работы и все наработки остались на сторой работе, вот не забрал все с компа, не до того было... Плюс I2C внесло свои коррективы...
У меня натуральные Winstar и МЭЛТ имеются и в них точно такие же грабли с таблицами символов. С I2C, без I2C - вообще нет никакой разницы в связи код символа и его вида на экране. Напиши функцию табличной перекодировки и хоть с SD выводи буквы, хоть с ТВ-антенны.
Напиши функцию табличной перекодировки и хоть с SD выводи буквы, хоть с ТВ-антенны.
Мне стыдно признаться, но не знаю как это сделать (((( Можно хотябы методику и кусочек скетча, чтобы я дальше по образу и подобию пытался добить проблемму???
Методика зависит от того, какая кодировка будет на входе в функцию - однобайтовая, двубайтовая, четырёхбайтовая.
Имеется текстовый файл на SD карте, строки длиной 2-3 слова, русскоязычные, хотелось бы читать построчно и выводить на экран строку с определенным номером... С реализацией в сериал порт проблем нет, а экран русские буковки увы не пишет (((
Хотелось бы и на экран выводить buffer
Ещё раз: "какая кодировка будет на входе в функцию"? Arduino IDE рассматривает текст, как UTF-8. На SD-карте может быть и 866 и 1251 и KOI8-R.
ААААА.... Семен Семеныч.... ))))
Файлик в UTF-8
Если бы не ленились, давно бы уже нашли по 'UTF-8 LCD' : http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafruit-gfx-i-vyvod-russkikh-bukv-na-displei-v-kodi?page=8#comment-439948
Всё утро бьюсь над попыткой понять смысл вашей отсылки... Дисплей то у меня совсем не такой как тот о чем идет в топике...
На сколько хватило моих мозгов - мне нужно забрать из вышеупомянутого топика функцию String utf8rus(String source)... Правильно или я совсем не туда???
Ну и если таки туда, то пока прикрутить его к своему дисплею не могу, все равно выводит иероглифы вместо русских букв (((
Можно забрать, конечно.
И модифицировать так, чтобы она после перевода из юникода в однобайтовый код просто смотрела в таблицу соответствия (однобайтовый код -> дисплейный код символа) и подставляла результат в выходную строку. Это в том случае, если нельзя перевести однобайтный код в дисплейный простой математической функцией типа displayCode=rusCode-42;
Тут только таблица поможет, у HD44780 очень причудливо раскиданы русские буквы. Причем имеющие английский аналоги имеются в одном экземпляре.
что то я все сильнее запутываюсь (((
При попытке сделать lcd.print(char(192)); на экране получаю кракозябру вместо "А", но вижу "А" если введу char(65) и последнее понятно это латиница... Если введу char(193), то вместо "Б" опять кракозябра и вот char(128) вижу "Б"...
Тут только таблица поможет, у HD44780 очень причудливо раскиданы русские буквы. Причем имеющие английский аналоги имеются в одном экземпляре.
Это я уже заметил... ну даже если таблицу нарисую, что потом??? Все мозг окончательно вскипел....
А открыть даташит на HD44780 и посмотреть таблицу символов русской раскладки что не позволяет? Тогда таких глупых вопросов возникать больше не будет.
По ходу дела в этом дисплее зашита какая-то специфическая таблица. В диапазоне 0x80..0x90 у винстара пустые клетки, а у МЭЛТ-а спецсимволы: http://www.melt.com.ru/docs/MT-16S2D.pdf (стр.#8)
Так что только вручную соответствие ставить. Сначала на бумажке разрисовать, потом перетаскивать в код. Или искать даташит на конкретную модель LCD.
Нашёл:
По ходу дела в этом дисплее зашита какая-то специфическая таблица. В диапазоне 0x80..0x90 у винстара пустые клетки, а у МЭЛТ-а спецсимволы: http://www.melt.com.ru/docs/MT-16S2D.pdf (стр.#8)
Так что только вручную соответствие ставить. Сначала на бумажке разрисовать, потом перетаскивать в код. Или искать даташит на конкретную модель LCD.
Вот именно по этому и сижу составляю таблицу... Потому что просмотрев парочку от разных дисплеев соответствия не нашел...
Спасибо!!!! Вроде моя табличка!!!!
Т.е. теперь если совсем глупо, то можно с помощью switch case сделать сопоставление на все символы и подменять считанный код элемента строки на соответствующий в таблице??? Ну это если совсем по дилетански????
На первое время пойдёт. Потом придумаете что-нить покомпактней.
Лучше массив сделать. И быстрей и места мало. Тут наверное самый лучший вариант.
Лучше массив сделать. И быстрей и места мало. Тут наверное самый лучший вариант.
Массив размерностью по количеству русских букв и в каждой ячейке соответствующий код из правильной таблицы???
Я завис на получении кода символа строки...
получаю какуюто фигню в монитор
Массив 256 байт, соответствия ASCII индикатору.
Можно извернуться и только кириллицу хранить...
Смысла крохобоничать из-за 128 байт нет))
Когда как... У человека там вон SDFat в планах.
SOS!!!
Почему я не получаю адекватно символ из строки??? Пост 21 - должен же получать... Если вывод как в посте Serial.println(n) - то получаю в монитор набор квадратиков; если Serial.println(n, HEX) - то строки вида FFFFFFD0; если Serial.println(n, DEC) - то "-48", а хотелось бы, что то более похожее на код символа: D09A / 208 154 / 202 .... Указываю для первого символа найденой строки - "К"
У принта бывают закидоны. Не знаю, с чем связано, может компилятор неправильную реализацию функции подбирает (хотя с какого бы ему это делать...), но иногда приходится делать Serial.print((char) n) или Serial.print((byte) n);
По фрагменту кода непонятно что держите в buffer - UTF-8, ASCII...
GVS, для работы с этими дисплеями есть библиотеки LiquidCrystal (в поставке IDE) и LiquidCrystal_I2C. Для первой есть версия с поддержкой кириллицы и UTF8 - LiquidCrystalRus (гуглится). Там есть вся эта перекодировка (таблицы конечно сверить надо). Посмотрите как это делается, а дальше хоть сделайте свою LiquidCrystalRus_I2C, хоть просто в скетч свой нужные функции вставьте.
Буфер это строка все того же файла с SD карты вроде как в формате UTF-8 в чем я уже совсем не уверен... Извратился костылем обозвав считываемый символ как uint8_t n; теперь получаю последовательно два байта от кода в формете UTF-8 DEC вида 208 192, отбрасываю первый байт, а по второму делаю выбор нужного символа из таблицы к дисплею и пытаюсь посимвольно выводить на дисплей, потому как собрать в строку у меня опять не получилось, дисплей выводит ересь (((
Собственно костыль:
И из него вопрос, потому как просто скомуниздил кусок, а что он значит не знаю.... Для чего вот это -
kalapanga, проблема в том, что я по моему уже все эти библиотеки перепробовал, но конкретно с моим дисплеем все равно получаю кракозябры, мы тут коллегиально пришли к выводу, что у него чисто своя кодовая таблица... по этому пока выкрутился написанием выше указаной функции.... До переписывания библиотек боюсь мне еще рости и рости...