Вывод большого количества собственных символов на LCD 16X2
- Войдите на сайт для отправки комментариев
Для одного из проектов, решил нарисовать собственный символ для 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);
}
И тут начинается западло, выводится только часть символов, остальное это хаотичная мозня, если выводить по одному символу, тогда все норм, кажды рисуется как надо, а вот такая толпа уже начинает бредить.
Где то в глубене души понимаю что возможно это от недостатка оперативы, хотя возможно я ошибаюсь.
Подскажите где я ошибся и есть ли какие другие варианты вывода такого количества собственных символов.
Насколько помню, в 1602 можно держать только 8 своих символов одновременно.
Да точно же, сам по форулу лазил и вроде чет типа такого читал.... а есть какой нибудь способ нарисовать задуманный мною рисунок???
Можно применить дисплей 128х64 графический.
Да вообщем то это выход, с 16х2 это уже не прокатит!
как писали выше, дисплеи 16х2, 20х4 и аналогичные из этого семейства имеют память только на 8 пользовательских символов. Т.е. их можно использовать и больше (переопределив перед выводом), но все равно одновременно можно вывести не больше 8 символов.
Ясно, понятно! Всем спасибо за ответы!!
Интересная тема, а вот как вынести эту кучу объявленных переменных в другой файл, надоело код прокручивать.
В главном пишу #include <znaki.cms>
или в #include <znaki.h>
в нем эти byte A_1[8] =
не понимает среда not declared
вынеси не в отдельный файл, а в отдельную вкладку (вторая зеленая строка, с правой стороны треугольничек вниз), IDE сама разобьет на файлы.
ага, создает отдельный ino файл, но в проекте переменные не видны, даже дописать строчку #include <znaki.ino>
DimaP, не всё так плохо, можно чуть поиграться с геометрией, использовать какие-то символы из имеющихся в знакогенераторе,( в частности последний полностью закрашенный значёк ), плюс дорисовать 8 своих. Опытные товарищи ухитрялись и не такое рисовать на 16x2 :))
ага, создает отдельный ino файл, но в проекте переменные не видны, даже дописать строчку #include <znaki.ino>
переименуйте в .h и замените скобки на ковычки
"znaki.h"
Спасибо получилось, а то много мусора было в начале скретча!
Посетила мысль но не знаю возможно?.
Если например одновременно требуется не более 8 своих символов, а в сумме их больше.
В разных функциях инициализировать заново дисплей и создавать необходимый набор символов.
И уже из Loop вызывать тот набор который тебе нужен
Если например одновременно требуется не более 8 своих символов, а в сумме их больше.
Здесь изменяемые символы выведены 1 раз, но их отображение (с загрузкой новых наборов данных) меняется раз в секунду (можно и быстрее):
http://arduino.ru/forum/programmirovanie/etyud-multik-na-lcd-1602
Если например одновременно требуется не более 8 своих символов, а в сумме их больше.
В разных функциях инициализировать заново дисплей и создавать необходимый набор символов.
И уже из Loop вызывать тот набор который тебе нужен
Да, символы переопределать на другие перед выводом возможно, я так иногда делаю.
Но ограничение остается - вывести можно не более 8 своих символов, т.е. если 1й символ отрисовали как "капелька", что-то еще вывели, а затем этот символ переопределили как "уровень батареи" и вывели его в другом месте экрана, то первая "капелька" тоже заменится.