Вопрос по русским буква для моно-дисплея

Kruppa
Offline
Зарегистрирован: 18.12.2015

Добрый день!

Подскажите, пожалуйста, еще один момент по программированию

Так как на моно-дисплей можно выводить русские буквы только кодированием (как я понял), попытался написать небольшой код с переключением (кнопкой) двух простых слов.

Одно слово выводится нормально, а второе  - не получается... Вместо второго слова выходит какая-то абракадабра, состоящая из букв предыдущего слова...
Вот сам код:
 


  #include <LiquidCrystal.h>
   LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
bool x;
byte p[8] = {
  B11111,
  B10001,
  B10001,
  B10001,
  B10001,
  B10001,
  B10001,
  B10001,
};
byte r[8] = {
  B11111,
  B10001,
  B11111,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
};
byte i[8] = {
  B10001,
  B10001,
  B10011,
  B10101,
  B11001,
  B10001,
  B10001,
  B10001,
};
byte v[8] = {
  B11110,
  B10001,
  B10001,
  B11110,
  B10001,
  B10001,
  B10001,
  B11110,
};
byte e[8] = {
  B11111,
  B10000,
  B10000,
  B11111,
  B10000,
  B10000,
  B10000,
  B11111,
};

byte t[8] = {
  B11111,
  B00100,
  B00100,
  B00100,
  B00100,
  B00100,
  B00100,
  B00100,
};
byte ij[8] = {
  B10001,
  B10001,
  B10001,
  B10001,
  B11101,
  B10101,
  B10101,
  B11101,
};
byte j[8] = {
  B10101,
  B10001,
  B10011,
  B10101,
  B11001,
  B10001,
  B10001,
  B10001,
};

byte ju[8] = {
  B10111,
  B10101,
  B10101,
  B11101,
  B10101,
  B10101,
  B10101,
  B10111,
};

byte sh[8]= {
  B10101,
  B10101,
  B10101,
  B10101,
  B10101,
  B10101,
  B10101,
  B11111,
};

byte c[8]= {
  B01110,
  B10001,
  B10000,
  B10000,
  B10000,
  B10000,
  B10001,
  B01110,
};
byte k[8]= {
  B10001,
  B10010,
  B10100,
  B11000,
  B11000,
  B10100,
  B10010,
  B10001,
};

byte a[8]= {
  B00100,
  B01010,
  B10001,
  B10001,
  B11111,
  B10001,
  B10001,
  B10001,
};



int P=0;
int R=1;
int I=2;
int V=3;
int E=4;
int T=5;
int IJ=6;
int J=7;
int JU=8;
int SH=9;
int C=10;
int K=11;
int A=12;

void setup() {

lcd.begin(16, 2);

lcd.createChar(0,p);
lcd.createChar(1,r);
lcd.createChar(2,i);
lcd.createChar(3,v);
lcd.createChar(4,e);
lcd.createChar(5,t);
lcd.createChar(6,ij);
lcd.createChar(7,j);
lcd.createChar(8,ju);
lcd.createChar(9,sh);
lcd.createChar(10,c);

lcd.createChar(11,k);


lcd.createChar(12,a);




  pinMode(7, INPUT);
  pinMode(8, INPUT);
  
}

void loop() {
  
if (digitalRead (7)==HIGH)
{
  x=true;
}

if (digitalRead (8)==HIGH)
{
  x=false;
}
if (x==true)
{
lcd.setCursor(0, 0);
lcd.clear();
lcd.write(K);
lcd.write(C);
lcd.write(JU);
lcd.write(SH);
lcd.write(A);

}
else
{
lcd.setCursor(0, 0);
lcd.clear();
lcd.write(P);
lcd.write(R);
lcd.write(I);
lcd.write(V);
lcd.write(E);
lcd.write(T);
//lcd.print("                ");  
//delay(1000);
}
delay(1000);
    }

 

Клапауций 321
Offline
Зарегистрирован: 17.12.2015

8-мь заказных символов возможно записать в индикатор

Kruppa
Offline
Зарегистрирован: 18.12.2015

8 всего???
А какой тогда лучше использовать недорогой дисплей, чтоб русские символы были?

 

Клапауций 321
Offline
Зарегистрирован: 17.12.2015

Kruppa пишет:

8 всего???
А какой тогда лучше использовать недорогой дисплей, чтоб русские символы были?

в дисплеях типа 1602 зашиты два шрифта, обычно латиница и любой другой на выбор заказчика-покупателя

т.е. купить дисплей с кириллицей.

попробуй печать "Привет мир" - внезапно, ты везучий.

забыл: библиотеку дисплея, поддерживающую кириллицу нужно пользовать.

vvadim
Offline
Зарегистрирован: 23.05.2012

или купи российский дисплей МЭЛТ - он с кириллицей, правда дорогой

Kruppa
Offline
Зарегистрирован: 18.12.2015

Да я уже посмотрел у них, честно говоря, жаба немного душит 540 рублей отдать, когда на алиэкспрессе они по 100-150 рублей продаются. В общем, я приноровился, смешиваю доступные 8 символов с английскими буквами, вроде пока получается))
Спасибо за помощь, ребята! Выручаете прям очень!)

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Kruppa, а что мешает перепрограммировать цифры по мере надобности?  Так можно и весь алфавит выводить:)

Kruppa
Offline
Зарегистрирован: 18.12.2015

А это как?)) Прям в теле функции Loop? Разве так можно/получится?))

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Kruppa, ну я пока предположил, может и не получиться. Пробовать нужно..

Клапауций 321
Offline
Зарегистрирован: 17.12.2015

dimax пишет:

Kruppa, ну я пока предположил, может и не получиться. Пробовать нужно..

была у меня библиотека-приблуда к LiquidCrystal псевдо графику рисующая по координатам - но, ограничение у неё было квадрат 4Х4 символа т.е. 8-мь

думаю, не взлетит больше 8-ми никак

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Клапауций 321, одновременно больше 8 наверное да,  никак.  Но поочереди то можно. В общем при необходимости выкрутится можно) Счас попробую, дисплей под рукой..

Клапауций 321
Offline
Зарегистрирован: 17.12.2015

dimax пишет:

Клапауций 321, одновременно больше 8 наверное да,  никак.  Но поочереди то можно. В общем при необходимости выкрутится можно) Счас попробую, дисплей под рукой..

я тоже так думал, но зачем та библиотека, если можно дисплей в графический пару строками превратить?

попробуй - я завтра подтянусь к дисплею

нашёл потеряшку - нафига я её удалял?

https://bitbucket.org/teckel12/arduino-lcd-bitmap/wiki/Home

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Kruppa, в общем по-очереди можно выводить буфер из 8 знаков, вот пример на основе вашего массива букв.

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

byte p[8] = {
  B11111,
  B10001,
  B10001,
  B10001,
  B10001,
  B10001,
  B10001,
  B10001,
};
byte r[8] = {
  B11111,
  B10001,
  B11111,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
};
byte i[8] = {
  B10001,
  B10001,
  B10011,
  B10101,
  B11001,
  B10001,
  B10001,
  B10001,
};
byte v[8] = {
  B11110,
  B10001,
  B10001,
  B11110,
  B10001,
  B10001,
  B10001,
  B11110,
};
byte e[8] = {
  B11111,
  B10000,
  B10000,
  B11111,
  B10000,
  B10000,
  B10000,
  B11111,
};

byte t[8] = {
  B11111,
  B00100,
  B00100,
  B00100,
  B00100,
  B00100,
  B00100,
  B00100,
};
byte ij[8] = {
  B10001,
  B10001,
  B10001,
  B10001,
  B11101,
  B10101,
  B10101,
  B11101,
};
byte j[8] = {
  B10101,
  B10001,
  B10011,
  B10101,
  B11001,
  B10001,
  B10001,
  B10001,
};

byte ju[8] = {
  B10111,
  B10101,
  B10101,
  B11101,
  B10101,
  B10101,
  B10101,
  B10111,
};

byte sh[8]= {
  B10101,
  B10101,
  B10101,
  B10101,
  B10101,
  B10101,
  B10101,
  B11111,
};

byte c[8]= {
  B01110,
  B10001,
  B10000,
  B10000,
  B10000,
  B10000,
  B10001,
  B01110,
};
byte k[8]= {
  B10001,
  B10010,
  B10100,
  B11000,
  B11000,
  B10100,
  B10010,
  B10001,
};

byte a[8]= {
  B00100,
  B01010,
  B10001,
  B10001,
  B11111,
  B10001,
  B10001,
  B10001,
};  
void setup() {
lcd.begin(16, 2);
}

void loop() {
lcd.setCursor(0, 0);
lcd.createChar(0,p);
lcd.createChar(1,r);
lcd.createChar(2,i);
lcd.createChar(3,v);
lcd.createChar(4,e);
lcd.createChar(5,t);
lcd.begin(16, 2);
lcd.write(byte(0));
lcd.write(1);
lcd.write(2);
lcd.write(3);
lcd.write(4);
lcd.write(5);


delay(2000);

lcd.setCursor(0, 0);
lcd.createChar(0,ij);
lcd.createChar(1,j);
lcd.createChar(2,ju);
lcd.createChar(3,sh);
lcd.createChar(4,k);
lcd.createChar(5,a);
lcd.begin(16, 2);
lcd.write(byte(0));
lcd.write(1);
lcd.write(2);
lcd.write(3);
lcd.write(4);
lcd.write(5);
delay(2000);
}


Из особенностей -нужно инитить дисплей после создания символов, иначе они не попадают в память дисплея

Kruppa
Offline
Зарегистрирован: 18.12.2015

Ого, спасибо!
Сейчас буду разбираться!!
Спасибо еще раз!)

arduinec
Offline
Зарегистрирован: 01.09.2015

Вместо русских букв можно использовать английские буквы, сходные по написанию. Например: в слове BTOPHИK нужно добавить лишь одну букву И, а CPEDA пишется полностью из английских букв.

sergkr1983
Offline
Зарегистрирован: 09.12.2015

А можно  слово "ВТОРНИК" вместо "и" поставить английскую "u". Получиться "BTopHuk". Всё английскими.