ЖК-дисплей пишет строку внизу без lcd.setCursor и без удаления каких-либо символов выше уже есть?
lcd.cursor и lcd.noCursor не будут работать для того, для чего я хочу их использовать, так как они кажутся «глобальными» типами, говорят и следуют за lcd.setCursor, чего я не хочу, но в остальном именно то, что я хочу сделать; просто поместить строку в самый низ, а также удалить строку, когда захочу, но не удаляя весь символ выше.
Точно так же, как lcd.cursor, но, как сказано, это не будет работать в коде, поскольку линия должна находиться там, где она есть, даже если lcd.setCursor используется в другом месте, но тогда линия курсора следует за той другой точкой, которую я не Не хочется и такого управляемого курсора, который сидит на месте, даже если lcd.setCursor используется в другом месте. Но сначала там символ, а потом строка наоборот не имеет значения, лишь бы там была строка. И я не могу создавать пользовательские символы с линией под ними, так как их числа от 0 до 9 и так много пользовательских символов не могут быть созданы.
Тем не менее, запись в нижнюю строку вполне возможна, и я подумал, что можно что-то сделать с lcd.createChar, не записывая вообще ничего в строки байтов, а в самую нижнюю, но это неожиданно не удалось. Вот что я тестировал:
byte line[8] = {
B,
B,
B,
B,
B,
B,
B,
B11111,
};
И это записывает в самую нижнюю строку, как и ожидалось, но, как ни странно, ВСЕ ЕЩЕ удаляет любой символ, написанный выше, даже если там ничего не должно было быть написано, как я это вижу.
В этом тесте было довольно много мусора и почти полностью удалены написанные символы, но что-то все же осталось, но строка написана вверху, а не внизу, и я думаю, что все это выходит за нормальные границы в реестре или что-то в этом роде:
#include <LiquidCrystal.h>
LiquidCrystal lcd(40, 42, 28, 26, 24, 22);
byte line[1] = {
B00000,
};
byte noline[1] = {
B11111,
};
byte sure[8] = { //По какой-то причине не хотелось использовать "квадрат" в качестве имени
B00000,
B00000,
B01110,
B01110,
B01110,
B01110,
B00000,
B00000,
};
void setup() {
lcd.createChar(0, line);
lcd.createChar(1, noline);
lcd.createChar(2, sure);
lcd.begin(20, 4);
lcd:clear:
}
void loop() {
delay(500);
lcd.setCursor(0, 0);
lcd.write(byte(2));
delay(500);
lcd.setCursor(0, 0);
lcd.write(byte(1));
delay(500);
lcd.setCursor(0, 0);
lcd.write(byte(0));
}
Есть советы, как сделать то же самое с помощью create.Char или любого другого простого способа? Я имею в виду, что lcd.cursor и lcd.noCursor могут это сделать, как тогда это сделать? Это обычный ЖК-дисплей 20x4, если это имеет значение.
@John Everett, 👍0
Обсуждение1 ответ
Я не очень понимаю, что вы имеете в виду под своим первым предложением. Удалось ли вам заставить "аппаратный" курсор отображаться вместе с символом или нет? И если да, то почему это не соответствует вашим требованиям?
Вы должны понимать, что ваш ЖК-дисплей не может отображать частичные символы, такие как строка внизу, оставляя остальную часть символа, которая уже была там, нетронутой. Исключением является аппаратно сгенерированный курсор.
Вы также должны понимать, что createChar всегда ожидает полный символ с 8 строками.
Ваши примеры кода
В первом примере, начиная с byte line[8] = {
, первые 7 "пустых" строк B,
фактически дают значение (двоичное) ноль. . Итак, здесь вы создаете пустой символ с линией внизу, точно так, как вы сказали, что видите на дисплее.
Во втором фрагменте кода вы определяете символы byte line[1] =
и byte noline[1] =
, состоящие всего из 1 байта. createChar ожидает 8 байт. createChar заполнит символы одним байтом, определенным в вашем определении символа, плюс все, что он найдет в 7 ячейках памяти, следующих за вашим фактическим определением (которое, вероятно, будет содержать некоторые случайные данные). Это объясняет "мусор", который вы видите на экране.
Возможное решение
Одним из решений может быть повторное создание каждого символа, под которым должен отображаться курсор, на лету. То есть, если вы хотите, чтобы ваш курсор отображался под буквой «А», вы создаете полный пользовательский символ, который содержит «А», плюс курсор под ним, и вы отображаете его вместо настоящей «А» в этом месте. Когда вы перемещаете курсор, вы снова заменяете «пользовательскую» букву «А» настоящей «А».
Это будет обременительно как по сложности кода, так и по размеру кода (вам придется создать полную карту символов для каждого символа, который вы хотите отобразить), но это вполне осуществимое решение.
- Добавление пользовательской платы в среду разработки Arduino
- Причина предупреждения «avr:build doesn't define a 'build.board' preference», когда build.board явно задан в boards.txt?
- Проблема с Atmega32u4
- Arduino UNO и пользовательский csPin для SD-карт
- Обеспечение совместимости микроконтроллеров с Arduino
- Куда идти после Arduino?
- Как записать с клиентского узла на серверный узел в пользовательскую службу BLE?
Часто вместо использования курсора вы просто мигаете символом, который в данный момент является «выбранным»., @Majenko