Этюд: 2 строки по 40 символов на LCD 1602
- Войдите на сайт для отправки комментариев
Сб, 07/05/2016 - 12:36
Решил тоже небольшой этюд написать.
При разборке одного большого проекта, освоил работу с дисплеем LCD 1602 на контроллере HD44780 и выяснил интересную вещь. Хотя LCD 1602 может отображать только 2 строки по 16 символов, но в контроллере HD44780 память заложена на 2 строки по 40 символов. И в эту память можно выводить символы. А отобразить выведенные данные можно с помощью команд сдвига экрана (в библиотеке LiquidCrystal они называются scrollDisplayLeft и scrollDisplayRight). При этом сдвигаются обе строки экрана.
Для демонстрации решил вывести большие двухстрочные цифры. Так и появился нижеприведенный скетч.
#include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7); char number[10][2][4] = { "\1\2\1", "\1\3\1", "\2\1 ", "\3\1\3", "\2\4\1", "\1\5\3", "\2\4\1", "\3\5\1", "\1 \1", "\2\2\1", "\1\4\2", "\3\5\1", "\1\4\2", "\1\5\1", "\2\4\1", " \1 ", "\1\4\1", "\1\5\1", "\1\4\1", "\3\5\1" }; byte i; void setup() { byte pillar[8] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; byte upper1[8] = { 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00 }; byte lower1[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F }; byte upper2[8] = { 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F }; byte lower2[8] = { 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F }; lcd.begin(16, 2); lcd.noCursor(); lcd.createChar(1, pillar); lcd.createChar(2, upper1); lcd.createChar(3, lower1); lcd.createChar(4, upper2); lcd.createChar(5, lower2); for (i=0; i<=9; i++) { numprint(i, 4*i); } delay(2000); } void loop() { for (i=0; i<40; i++) { lcd.scrollDisplayLeft(); delay(1000); } for (i=0; i<16; i++) { lcd.scrollDisplayLeft(); } delay(5000); for (i=0; i<8; i++) { lcd.scrollDisplayLeft(); } delay(5000); for (i=0; i<16; i++) { lcd.scrollDisplayRight(); } delay(5000); for (i=0; i<8; i++) { lcd.scrollDisplayRight(); } delay(5000); } void numprint(byte num, byte poz) { lcd.setCursor(poz, 0); lcd.print(number[num][0]); lcd.setCursor(poz, 1); lcd.print(number[num][1]); }
Успехов в использовании данной возможности!
Вот интересно, откуда взялась функция "numprint" в 36й строке?!
Компилятор матерится, что таковой не существует...
Вот интересно, откуда взялась функция "numprint" в 36й строке?!
Компилятор матерится, что таковой не существует...
Она находится ниже. Если матерится, то пернесите выше использования.
Вот интересно, откуда взялась функция "numprint" в 36й строке?!
А скетч до строки 69 дочитать?
Компилятор матерится, что таковой не существует...
К сожалению, некоторые версии IDE позволяли подобную вольность. Переставьте функцию в начало скетча, до её вызова.
Спасибо, так и сделал уже... Компилка в норме, пробую залить...
У меня побежали очень большие цыфры
Чтобы функции не переносить, их достаточно объявить.
Здравствуйте! Помогите с пониманием кода!
1. Символ '0' в массиве не получается использовать из-за особенностей char \0 это символ конца строки?
2. Именно поэтому размер массива объявлена 10-2-4 на конце четыре, а не три?
3. Но теперь пользовательских символов можно создать только семь, а не 8?
4. Составляя цифру, байт 0х1F имеет 8 знаков, а символ только 5 в ширину. Первые три просто отбрасываются?
Код мне очень понравился краткость и простым наглядным конструктором цифр, легко модернизируется шрифт. Огромная благодарность автору !
Вместо кода "нулевого символа" можно отправлять \10 будет показан нулевой пользовательский символ.
1. Символ '0' в массиве не получается использовать из-за особенностей char \0 это символ конца строки?
2. Именно поэтому размер массива объявлена 10-2-4 на конце четыре, а не три?
3. Но теперь пользовательских символов можно создать только семь, а не 8?
4. Составляя цифру, байт 0х1F имеет 8 знаков, а символ только 5 в ширину. Первые три просто отбрасываются?
1. Да. 2. Да.
3. Для отображения нулевого пользовательского символа можно использовать: lcd.write(byte(0));
Пример есть здесь: http://arduino.ru/forum/programmirovanie/etyud-multik-na-lcd-1602
4. Да отбрасываются, это особенность контроллера дисплея.