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