Динамическиый вывод "своих" символов на 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 байт памяти и точки зажигаются в соотвествии с символом назначеным этому байту. Данные о символах зашиты в ПЗУ дисплея при производстве. Так что бороться только используя транслит.