Динамическиый вывод "своих" символов на LCD. Как бороться?

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

Случилось так, что достался мне экранчик 16*2 совсем без русских буков. Решил создать "свои" русские буквы, но дело в том, что экран жрёт их всего 8, мне необходимо больше и одновременно.

Задаёшь 8 символов по точкам, выводишь на экран, задаёшь следующие, выводишь... Опа! А не выходит! Хитрый экран перерисовывает уже выведенные символы автоматически! Чудеса да и только!
Есть ли какой-нибудь способ бороться с этой проблемой? Привожу код скетча(сырой, грязный, собранный из кусков). В нём я пытался вывести на экран слово "ПРИВЕТ" так, чтобы каждая буква была на 2 строки, а "П" вообще 2*2.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20,16,2);
void Pri() {
byte a1[8] =
{
  0b00000,
  0b01111,
  0b01010,
  0b00010,
  0b00010,
  0b00010,
  0b00010,
  0b00010,
};
byte a2[8] =
{
  0b00001,
  0b11110,
  0b00100,
  0b00100,
  0b00100,
  0b00100,
  0b00100,
  0b00100,
};
byte a3[8] =
{
  0b00000,
  0b00000,
  0b00000,
  0b01110,
  0b01001,
  0b01001,
  0b01110,
  0b01000,
};

byte a4[8] =
{
  0b00000,
  0b00000,
  0b00000,
  0b01001,
  0b01001,
  0b01001,
  0b01001,
  0b01001,
};

byte b1[8] =
{
  0b00010,
  0b00010,
  0b00010,
  0b00010,
  0b01010,
  0b01110,
  0b00000,
  0b00000,
};

byte b2[8] =
{
  0b00100,
  0b00100,
  0b00100,
  0b00100,
  0b00100,
  0b00100,
  0b00000,
  0b00000,
}; 

byte b3[8] =
{
  0b01000,
  0b01000,
  0b01000,
  0b01000,
  0b01000,
  0b01000,
  0b00000,
  0b00000,
}; 

byte b4[8] =
{
  0b01011,
  0b01011,
  0b01101,
  0b01101,
  0b01001,
  0b01001,
  0b00000,
  0b00000,
};  
 lcd.createChar(0, a1);
  lcd.createChar(1, a2);
  lcd.createChar(2, a3);
  lcd.createChar(3, a4);
  lcd.createChar(4, b1);
  lcd.createChar(5, b2);
  lcd.createChar(6, b3);
  lcd.createChar(7, b4);
  lcd.home();

  for(int i=0; i<=3; i++) {
    lcd.setCursor(i+4, 0);
    lcd.write(i);
  }
  for(int i=0; i<=3; i++) {
    lcd.setCursor(i+4, 1);
    lcd.write(i+4);
  }
}

void vet() {
byte a1[8] =
{
  0b00000,
  0b00000,
  0b00000,
  0b01110,
  0b01001,
  0b01001,
  0b01001,
  0b01110,
};
byte a2[8] =
{
  0b00000,
  0b00000,
  0b00000,
  0b01111,
  0b01000,
  0b01000,
  0b01000,
  0b01000,
};
byte a3[8] =
{
  0b00000,
  0b00000,
  0b00000,
  0b11111,
  0b00100,
  0b00100,
  0b00100,
  0b00100,
};


byte b1[8] =
{
  0b01110,
  0b01001,
  0b01001,
  0b01001,
  0b01001,
  0b01110,
  0b00000,
  0b00000,
};

byte b2[8] =
{
  0b01111,
  0b01000,
  0b01000,
  0b01000,
  0b01000,
  0b01111,
  0b00000,
  0b00000,
}; 

byte b3[8] =
{
  0b00100,
  0b00100,
  0b00100,
  0b00100,
  0b00100,
  0b00100,
  0b00000,
  0b00000,
}; 

 lcd.createChar(0, a1);
  lcd.createChar(1, a2);
  lcd.createChar(2, a3);
  lcd.createChar(4, b1);
  lcd.createChar(5, b2);
  lcd.createChar(6, b3);
  lcd.home();

  for(int i=0; i<=2; i++) {
    lcd.setCursor(i+8, 0);
    lcd.write(i);
  }
  for(int i=0; i<=2; i++) {
    lcd.setCursor(i+8, 1);
    lcd.write(i+4);
  }
}



void setup()
{
  
  lcd.init();                      // initialize the lcd 
  lcd.backlight();
  Pri();
  vet();
}
void loop() {
}

 

 

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Если сказано что 8 символов значит памяти на там на 8 символов. Даннные для отрисовки берет из нее же. это вам не графический экран где каждой точке соответсвует 1 бит памяти. Это знакосинтезирующий где каждому символу соответсвует 1 байт памяти и точки зажигаются в соотвествии с символом назначеным этому байту. Данные о символах зашиты в ПЗУ дисплея при производстве. Так что бороться только используя транслит.