Этюд: 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. Да отбрасываются, это особенность контроллера дисплея.