+7 (495) 662-44-14

Главная / Форум
  • РУС / ENG
(495) 662-44-14 Многоканальный телефон Не дозвонились?
Форумы >>ЖК индикаторы >>RE: Вывод своих символов на экране 20*4
RE: Вывод своих символов на экране 20*4

Maksss
Пользователи

Сообщений: 4
Регистрация: 09.07.2015

Добрый день! Столкнулся со следующей проблемой при выводе на знакосинтезирующий дисплей совместно с ардуиной. Составляю собственные символы, но если вывожу больше 7 штук - то начинается выводиться какая то не понятная кракозябра:
8й и далее символы выводятся не верно. Должно быть написано: HOMEr-beer.ru, первые 4 буквы самодельные
А выводится (см приклепленное изображение, под номером 1), первые 7 символов заменяются последними сгенерированными, а 8й и далее - какой то фигней.
Код следующий:

Код:
void ArdBir1 (byte posX, byte posY){

byte Sym_H11[8] = {
B01100,
B01100,
B01100,
B01100,
B01100,
B01100,
B01100,
B01111};

byte Sym_H12[8] = {
B00110,
B00110,
B00110,
B00110,
B00110,
B00110,
B00110,
B11110};

byte Sym_H21[8] = {
B01111,
B01100,
B01100,
B01100,
B01100,
B01100,
B01100,
B01100};

byte Sym_H22[8] = {
B11110,
B00110,
B00110,
B00110,
B00110,
B00110,
B00110,
B00110};

byte Sym_O11[8] = {
B01111,
B01111,
B01100,
B01100,
B01100,
B01100,
B01100,
B01100};

byte Sym_O12[8] = {
B11110,
B11110,
B00110,
B00110,
B00110,
B00110,
B00110,
B00110};

byte Sym_O21[8] = {
B01100,
B01100,
B01100,
B01100,
B01100,
B01100,
B01111,
B01111};

byte Sym_O22[8] = {
B00110,
B00110,
B00110,
B00110,
B00110,
B00110,
B11110,
B11110};

byte Sym_M11[8] = {
B01000,
B01100,
B01100,
B01110,
B01110,
B01110,
B01111,
B01101};

byte Sym_M12[8] = {
B00010,
B00110,
B00110,
B01110,
B01110,
B01110,
B11110,
B10110};

byte Sym_M21[8] = {
B01101,
B01100,
B01100,
B01100,
B01100,
B01100,
B01100,
B01100};

byte Sym_M22[8] = {
B10110,
B00110,
B00110,
B00110,
B00110,
B00110,
B00110,
B00110};

byte Sym_E11[8] = {
B01111,
B01111,
B01100,
B01100,
B01100,
B01100,
B01100,
B01111};

byte Sym_E12[8] = {
B11110,
B11110,
B00110,
B00000,
B00000,
B00000,
B01100,
B11100};

byte Sym_E21[8] = {
B01111,
B01100,
B01100,
B01100,
B01100,
B01100,
B01111,
B01111};

byte Sym_E22[8] = {
B11100,
B01100,
B00000,
B00000,
B00000,
B00110,
B11110,
B11110};

lcd.clear();

lcd.createChar(1, Sym_H11);
lcd.createChar(2, Sym_H12);
lcd.createChar(3, Sym_H21);
lcd.createChar(4, Sym_H22);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(2);
lcd.setCursor(1,2);
lcd.write(3);
lcd.setCursor(2,2);
lcd.write(4);

lcd.createChar(5, Sym_O11);
lcd.createChar(6, Sym_O12);
lcd.createChar(7, Sym_O21);
lcd.createChar(8, Sym_O22);
lcd.setCursor(3,1);
lcd.write(5);
lcd.setCursor(4,1);
lcd.write(6);
lcd.setCursor(3,2);
lcd.write(7);
lcd.setCursor(4,2);
lcd.write(8);

lcd.createChar(9, Sym_M11);
lcd.createChar(10, Sym_M12);
lcd.createChar(11, Sym_M21);
lcd.createChar(12, Sym_M22);
lcd.setCursor(5,1);
lcd.write(9);
lcd.setCursor(6,1);
lcd.write(10);
lcd.setCursor(5,2);
lcd.write(11);
lcd.setCursor(6,2);
lcd.write(12);

lcd.createChar(13, Sym_E11);
lcd.createChar(14, Sym_E12);
lcd.createChar(15, Sym_E21);
lcd.createChar(16, Sym_E22);
lcd.setCursor(7,1);
lcd.write(13);
lcd.setCursor(8,1);
lcd.write(14);
lcd.setCursor(7,2);
lcd.write(15);
lcd.setCursor(8,2);
lcd.write(16);

display_lcd(10,2,"R-beer.ru",100000);
lcd.clear();
}


Если вывожу 8 символов, то вижу следующее (см номер 2 в прикрепленном изображении)
Код такой:

Код:
void ArdBir1 (byte posX, byte posY){

byte Sym_H11[8] = {
B01100,
B01100,
B01100,
B01100,
B01100,
B01100,
B01100,
B01111};

byte Sym_H12[8] = {
B00110,
B00110,
B00110,
B00110,
B00110,
B00110,
B00110,
B11110};

byte Sym_H21[8] = {
B01111,
B01100,
B01100,
B01100,
B01100,
B01100,
B01100,
B01100};

byte Sym_H22[8] = {
B11110,
B00110,
B00110,
B00110,
B00110,
B00110,
B00110,
B00110};

byte Sym_O11[8] = {
B01111,
B01111,
B01100,
B01100,
B01100,
B01100,
B01100,
B01100};

byte Sym_O12[8] = {
B11110,
B11110,
B00110,
B00110,
B00110,
B00110,
B00110,
B00110};

byte Sym_O21[8] = {
B01100,
B01100,
B01100,
B01100,
B01100,
B01100,
B01111,
B01111};

byte Sym_O22[8] = {
B00110,
B00110,
B00110,
B00110,
B00110,
B00110,
B11110,
B11110};

byte Sym_M11[8] = {
B01000,
B01100,
B01100,
B01110,
B01110,
B01110,
B01111,
B01101};

byte Sym_M12[8] = {
B00010,
B00110,
B00110,
B01110,
B01110,
B01110,
B11110,
B10110};

byte Sym_M21[8] = {
B01101,
B01100,
B01100,
B01100,
B01100,
B01100,
B01100,
B01100};

byte Sym_M22[8] = {
B10110,
B00110,
B00110,
B00110,
B00110,
B00110,
B00110,
B00110};

byte Sym_E11[8] = {
B01111,
B01111,
B01100,
B01100,
B01100,
B01100,
B01100,
B01111};

byte Sym_E12[8] = {
B11110,
B11110,
B00110,
B00000,
B00000,
B00000,
B01100,
B11100};

byte Sym_E21[8] = {
B01111,
B01100,
B01100,
B01100,
B01100,
B01100,
B01111,
B01111};

byte Sym_E22[8] = {
B11100,
B01100,
B00000,
B00000,
B00000,
B00110,
B11110,
B11110};

lcd.clear();

lcd.createChar(1, Sym_H11);
lcd.createChar(2, Sym_H12);
lcd.createChar(3, Sym_H21);
lcd.createChar(4, Sym_H22);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(2);
lcd.setCursor(1,2);
lcd.write(3);
lcd.setCursor(2,2);
lcd.write(4);

lcd.createChar(5, Sym_O11);
lcd.createChar(6, Sym_O12);
lcd.createChar(7, Sym_O21);
lcd.createChar(8, Sym_O22);
lcd.setCursor(3,1);
lcd.write(5);
lcd.setCursor(4,1);
lcd.write(6);
lcd.setCursor(3,2);
lcd.write(7);
lcd.setCursor(4,2);
lcd.write(8);


display_lcd(10,2,"R-beer.ru",100000);
lcd.clear();
}

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение

Maksss
Пользователи

Сообщений: 4
Регистрация: 09.07.2015

Петухов_Дмитрий
Пользователи

Сообщений: 1162
Регистрация: 25.11.2009

Так, ну во первых в индикаторе есть лишь 8 программируемых символов, с кодами от 0 до 7. Вы же выводите символы 1-8, так что последний 8-й символ берётся не ваш, а встроенный, выглядит как 'Ь", именно он и есть в соответствующем месте на картинке №2.

Во вторых, при выводе 16-ти "программируемых" символов реально выводятся лишь 7 (с кодами 1-7), далее все символы берутся из встроенного знакогенератора с кодами 8-16. Посмотрите внимательнее на картинку №1 и встроенный знакогенератор, именно они и видны.

В третьих, вызов "lcd.createChar(8, Sym_O22);" (и далее с номерами символов большими 7) формально некорректен, 8-й (и далее) символ не является программируемым и поменять его изображение нельзя. Что произойдёт при данном вызове - лучше не выяснять, скорее всего поменяется изображение символа с кодом "x&0x07", но это без всякой гарантии.

Так что обе картинки абсолютно корректно отображают выполнение вашей программы. Но совсем не то что Вы хотели и ожидали.

Вывести больше двух произвольных больших символов вряд ли получится, 8-ми программируемых для этого просто не хватит, ну за исключением некоторых специальных случаев (типа повтора всего или части большого символа несколько раз или использования встроенных символов).

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение

Петухов_Дмитрий
Пользователи

Сообщений: 1162
Регистрация: 25.11.2009

Можно сделать мигание первых больших символов, т.е. выводить как бы бегущей строкой, чтобы в любой момент на индикаторе было их не более двух штук (разных).
Если мигание сделать с высокой скоростью, порядка 15-20-30 Гц, то визуально они могут даже стать не мигающими, но меньшей интенсивности. Но только при естественном освещении (или лампами накаливания)! Люминесцентные (дневного света) и многие светодиодные лампы сами по себе мигают с частотой сети (или выше) и из-за биения частот (сети, кадровой развёртки индикатора, частоты мигания символов) будут визуальные артефакты на индикаторе.

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение

Maksss
Пользователи

Сообщений: 4
Регистрация: 09.07.2015

Понял, спасибо, попробую так и сделать.
Про то, что он выводит всего 8 символов так и подумал, потому что все время выводились одни и те же символы в зависимости от значения. Спасибо за разъяснение!

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение
Сейчас на форуме (гостей: 6, пользователей: 0 , из них : 0 )