===== Эксперимент 30. Пользовательские символы LCD =====
Иногда на дисплее требуется отобразить символы, которых нет в стандартном знакогенераторе. Для таких случаев дисплей поддерживает функцию пользовательских символов. В дисплей встроена память для размещения 8 пользовательских символов. Сначала пользователь записывает в дисплей информацию о дополнительных символах, а потом может использовать их для отображения. Попробуем создать пару своих символов. Вот таких:
{{ :products:esp-iot:s.png?nolink |}}
Смайлик и буква Ж. На символе смайлика мы подписали цифры 0 и 1. 0 соответствует выключеному пикселю, а 1 - включенному. Теперь, когда мы знаем какими должны быть наши символы, мы можем запрограммировать их и отобразить.
==== Схема эксперимента ====
{{ :products:esp-iot:13-0_mont.png?direct&600 |}}
//Рисунок 1. Монтажная схема эксперимента//
==== Программный код эксперимента ====
#include
#define DEFAULT_I2C_ADDR 0x3F // Или 0x27 в зависимости от твоей платы IoT
LCDI2C_Generic lcd(DEFAULT_I2C_ADDR, 16, 2);
byte char1[8] = {
0b00000,
0b00000,
0b01010,
0b01010,
0b00000,
0b10001,
0b01110,
0b00000
};
byte char2[8] = {
0b10101,
0b10101,
0b10101,
0b01110,
0b10101,
0b10101,
0b10101,
0b00000
};
void setup() {
lcd.init();
lcd.setBacklight(0);
lcd.createChar(0, char1);
lcd.createChar(1, char2);
lcd.setCursor(0, 0);
lcd.write(byte(0));
lcd.write(byte(1));
}
void loop() {
}
В программе мы как обычно подключили библиотеки, задали адрес контроллера дисплея на шине I2C, настроили контроллер I2C и дисплей, включили подсветку. После этого мы объявляем массив ''char1'':
byte char1[8] = {
0b00000,
0b00000,
0b01010,
0b01010,
0b00000,
0b10001,
0b01110,
0b00000
};
Массив состоит из чисел, записанных в двоичной системе счисления. В этой форме очень удобно записывать, ведь единице соответствует включенный пиксель на данном месте, нулю — выключенный. В массиве 8 чисел — по одному на строку. Чтобы компилятор понял, что числа записаны в двоичной системе счисления они начинаются со специальных символов ''0b''. Можно было бы записать эти данные и в обычной десятичной системе, но только это не было бы наглядно. Например 0b10001 это десятичное число 17.
Таким же образом мы создаем второй символ. Теперь, когда символы созданы, их нужно записать в память дисплея.
lcd.createChar(0, char1);
lcd.createChar(1, char2);
Символ из переменной ''char1'' записываем в память дисплея по адресу 0, а символ ''char2'' по адресу 1.
Ставим курсор в левый верхний угол, на место первого символа. Это нулевое место нулевой строки так как нумерация мест и строк ведется от нуля:
lcd.setCursor(0, 0);
Печатаем на дисплее символы. Они выводятся туда, куда мы поставили курсор:
lcd.write(byte(0));
lcd.write(byte(1));
Первый символ появился на первой строке в первом знакоместе, а второй на втором знакоместе благодаря тому, что курсор автоматически переместился на второе знакоместа после печати первого символа.
==== Дополнительное задание ====
* Создай свой символ, например, подмигивающий или грустный смайлик
* Отобрази его на второй строке по середине