Динамическиый вывод "своих" символов на LCD. Как бороться?
- Войдите на сайт для отправки комментариев
Пт, 25/10/2013 - 18:51
Случилось так, что достался мне экранчик 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() {
}
Если сказано что 8 символов значит памяти на там на 8 символов. Даннные для отрисовки берет из нее же. это вам не графический экран где каждой точке соответсвует 1 бит памяти. Это знакосинтезирующий где каждому символу соответсвует 1 байт памяти и точки зажигаются в соотвествии с символом назначеным этому байту. Данные о символах зашиты в ПЗУ дисплея при производстве. Так что бороться только используя транслит.