Вывод большого количества собственных символов на LCD 16X2

DimaP.
Offline
Зарегистрирован: 21.04.2013

Для одного из проектов, решил нарисовать собственный символ для lcd дисплея, применив корел создал вот такую вот сетку в которую вписал рисунок

потом как в примере Custom Character начал рисовать собственые символы, вот сооттветственно что получилось



/* битовые маски*/
byte A_1[8] =
{
  B00000,
  B00000,754
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
};
byte A_2 [8]=
{
  B00000,
  B00000,
  B00000,
  B00000,
  B00001,
  B00001,
  B11111,
  B11111,
};
byte A3_6 [8]=
{
  B00000,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111,
  B11111,
  B11111,
};
byte A_7 [8]=
{
  B00000,
  B00011,
  B00011,
  B00011,
  B11111,
  B11111,
  B11111,
  B11111,
};
byte A_8 [8]=
{
  B00000,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
};
byte A9_B9 [8]=
{
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
};
byte A10_11 [8]=
{
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B11111,
  B11011,
  B11011,
};
byte A12_14 [8]=
{
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111,
  B11111,
};
byte A_15 [8]=
{
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B11111,
};
byte A_16 [8]=
{
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B11000,
};
byte B_1 [8]=
{
  B01111,
  B01111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
};
byte B_2 [8]=
{
  B11111,
  B11111,
  B00001,
  B00001,
  B00000,
  B00000,
  B00000,
  B00000,
};
byte B3_6 [8]=
{
  B11111,
  B11111,
  B11111,
  B11111,
  B00000,
  B00000,
  B00000,
  B00000,
};
byte B_7 [8]=
{
  B11111,
  B11111,
  B11111,
  B11111,
  B00011,
  B00011,
  B00011,
  B00000,
};
byte B_8 [8]=
{
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B00000,
};
byte B10_11 [8]=
{
  B11011,
  B11011,
  B11111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
};
byte B12_14 [8]=
{
  B11111,
  B11111,
  B11111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
};
byte B_15 [8]=
{
  B11111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
};
byte B_16 [8]=
{
  B01100,
  B00110,
  B00010,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
};

затем я их объявил с помощью встроенной в библиотеку функции

и во у меня получился такой код




#include <LiquidCrystal.h>

LiquidCrystal lcd(4, 3, 5, 6, 7, 13);// RS, E, DB4, DB5, DB6, DB7

/* битовые маски*/
byte aa[8] =
{
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B01111,
  B01111,
};
byte bb [8]=
{
  B00000,
  B00000,
  B00000,
  B00000,
  B00001,
  B00001,
  B11111,
  B11111,
};
byte cc [8]=
{
  B00000,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111,
  B11111,
  B11111,
};
byte dd [8]=
{
  B00000,
  B00011,
  B00011,
  B00011,
  B11111,
  B11111,
  B11111,
  B11111,
};
byte ee [8]=
{
  B00000,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
};
byte ff [8]=
{
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
};
byte gg [8]=
{
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B11111,
  B11011,
  B11011,
};
byte kk [8]=
{
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111,
  B11111,
};
byte ll [8]=
{
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B11111,
};
byte mm [8]=
{
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B11000,
};
byte nn [8]=
{
  B01111,
  B01111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
};
byte B_2 [8]=
{
  B11111,
  B11111,
  B00001,
  B00001,
  B00000,
  B00000,
  B00000,
  B00000,
};
byte B3_6 [8]=
{
  B11111,
  B11111,
  B11111,
  B11111,
  B00000,
  B00000,
  B00000,
  B00000,
};
byte B_7 [8]=
{
  B11111,
  B11111,
  B11111,
  B11111,
  B00011,
  B00011,
  B00011,
  B00000,
};
byte B_8 [8]=
{
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B00000,
};
byte B10_11 [8]=
{
  B11011,
  B11011,
  B11111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
};
byte B12_14 [8]=
{
  B11111,
  B11111,
  B11111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
};
byte B_15 [8]=
{
  B11111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
};
byte B_16 [8]=
{
  B01100,
  B00110,
  B00010,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
};
void setup() 
{
 
 lcd.begin(16, 2); // дисплей 16 сиимволов в 2 строки
 
 /* ДИКЛАРИРУЕМ НАШУ КАЛЯКУ*/
 lcd.createChar(1, aa);
 lcd.createChar(2, bb);
 lcd.createChar(3, cc);
 lcd.createChar(4, dd);
 lcd.createChar(5, ee);
 lcd.createChar(6, ff);
 lcd.createChar(7, gg);
 lcd.createChar(8, kk);
 lcd.createChar(9, ll);
 lcd.createChar(10, mm);
 lcd.createChar(11, nn);
 lcd.createChar(12, B_2);
 lcd.createChar(13, B3_6);
 lcd.createChar(14, B_7);
 lcd.createChar(15, B_8);
 lcd.createChar(16, B10_11);
 lcd.createChar(17, B12_14);
 lcd.createChar(18, B_15);
 lcd.createChar(19, B_16);
}

void loop() //выводим символы
{
   lcd.setCursor(0, 0);
  lcd.write(1);
  lcd.setCursor(1, 0);
  lcd.write(2);
  lcd.setCursor(2, 0);
  lcd.write(3);
  lcd.setCursor(3, 0);
  lcd.write(3);
  lcd.setCursor(4, 0);
  lcd.write(3);
  lcd.setCursor(5, 0);
  lcd.write(3);
  lcd.setCursor(6, 0);
  lcd.write(4);
  lcd.setCursor(7, 0);
  lcd.write(5);
  lcd.setCursor(8, 0);
  lcd.write(6);  
  lcd.setCursor(9, 0);
  lcd.write(7);
  lcd.setCursor(10, 0);
  lcd.write(7);
  lcd.setCursor(11, 0);
  lcd.write(8);
  lcd.setCursor(12, 0);
  lcd.write(8);
  lcd.setCursor(13, 0);
  lcd.write(8);
  lcd.setCursor(14, 0);
  lcd.write(9);
  lcd.setCursor(15, 0);
  lcd.write(10);
  lcd.setCursor(0, 1);
  lcd.write(11);
  lcd.setCursor(1, 1);
  lcd.write(12);
  lcd.setCursor(2, 1);
  lcd.write(13);
  lcd.setCursor(3, 1);
  lcd.write(13);
  lcd.setCursor(4, 1);
  lcd.write(13);
  lcd.setCursor(5, 1);
  lcd.write(13);
  lcd.setCursor(6, 1);
  lcd.write(14);
  lcd.setCursor(7, 1);
  lcd.write(15);
  lcd.setCursor(8, 1);
  lcd.write(5);
  lcd.setCursor(9, 1);
  lcd.write(16);
  lcd.setCursor(10, 1);
  lcd.write(16);
  lcd.setCursor(11, 1);
  lcd.write(17);
  lcd.setCursor(12, 1);
  lcd.write(17);
  lcd.setCursor(13, 1);
  lcd.write(17);
  lcd.setCursor(14, 1);
  lcd.write(18);
  lcd.setCursor(15, 1);
  lcd.write(19);
  
  
}

И тут начинается западло, выводится только часть символов, остальное это хаотичная мозня, если выводить по одному символу, тогда все норм, кажды рисуется как надо, а вот такая толпа уже начинает бредить.

Где то в глубене души  понимаю что возможно это от недостатка оперативы, хотя возможно я ошибаюсь.

Подскажите где я ошибся и есть ли какие другие варианты вывода такого количества собственных символов.

 

Snubist
Offline
Зарегистрирован: 18.02.2013

Насколько помню, в 1602 можно держать только 8 своих символов одновременно.

DimaP.
Offline
Зарегистрирован: 21.04.2013

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

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

Можно применить дисплей 128х64 графический.

DimaP.
Offline
Зарегистрирован: 21.04.2013

Да вообщем то это выход, с 16х2 это уже не прокатит!

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

как писали выше, дисплеи 16х2, 20х4 и аналогичные из этого семейства имеют память только на 8 пользовательских символов. Т.е. их можно использовать и больше (переопределив перед выводом), но все равно одновременно можно вывести не больше 8 символов.

DimaP.
Offline
Зарегистрирован: 21.04.2013

Ясно, понятно! Всем спасибо за ответы!!

RANDREY
Offline
Зарегистрирован: 10.06.2012

Интересная тема, а вот как вынести эту кучу объявленных переменных в другой файл, надоело код прокручивать. 

В главном пишу #include <znaki.cms>

или в #include <znaki.h>

в нем эти byte A_1[8] =

не понимает среда not declared

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

вынеси не в отдельный файл, а в отдельную вкладку (вторая зеленая строка, с правой стороны треугольничек вниз), IDE сама разобьет на файлы.

RANDREY
Offline
Зарегистрирован: 10.06.2012

ага, создает отдельный ino файл, но в проекте переменные не видны, даже дописать строчку #include <znaki.ino>

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

DimaP, не всё так плохо, можно чуть поиграться с геометрией, использовать какие-то символы из имеющихся в знакогенераторе,( в частности последний полностью закрашенный значёк ),  плюс дорисовать 8 своих. Опытные товарищи ухитрялись и не такое рисовать на 16x2 :))

faraddin
Offline
Зарегистрирован: 11.08.2013

RANDREY пишет:

ага, создает отдельный ino файл, но в проекте переменные не видны, даже дописать строчку #include <znaki.ino>

переименуйте в .h и замените скобки на ковычки

"znaki.h"

RANDREY
Offline
Зарегистрирован: 10.06.2012

Спасибо получилось, а то много мусора было в начале скретча!

serega374
Offline
Зарегистрирован: 10.08.2015

Посетила мысль но не знаю возможно?.

Если например одновременно требуется не более 8 своих символов, а в сумме их больше.

В разных функциях инициализировать заново дисплей и создавать необходимый набор символов.

И уже из Loop вызывать тот набор который тебе нужен

 

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

serega374 пишет:

Если например одновременно требуется не более 8 своих символов, а в сумме их больше.

Здесь изменяемые символы выведены 1 раз, но их отображение (с загрузкой новых наборов данных) меняется раз в секунду (можно и быстрее):
http://arduino.ru/forum/programmirovanie/etyud-multik-na-lcd-1602
 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

serega374 пишет:
Посетила мысль но не знаю возможно?.
Если например одновременно требуется не более 8 своих символов, а в сумме их больше.
В разных функциях инициализировать заново дисплей и создавать необходимый набор символов.
И уже из Loop вызывать тот набор который тебе нужен

Да, символы переопределать на другие перед выводом возможно, я так иногда делаю.

Но ограничение остается - вывести можно не более 8 своих символов, т.е. если 1й символ отрисовали как "капелька", что-то еще вывели, а затем этот символ переопределили как "уровень батареи" и вывели его в другом месте экрана, то первая "капелька" тоже заменится.