lcd.createChar() позволяет использовать только 8 произвольных символов
У меня есть teensy4.1 с ЖК-экраном размером 16 на 2 и ЖК-интерфейсом I2C. Я пытался написать кучу пользовательских символов на жидкокристаллическом экране, чтобы перевернуть какой-нибудь текст.
моя проблема в том, что он работает нормально, но только для 8 пользовательских символов. любое большее, чем это, приводит к странным результатам. при цикле, равном 16, печатаются первые 8 символов. если задано более 8 символов, используются только последние назначенные символы.
Я закомментировал все пользовательские символы, кроме первых 8, и перебираю их в цикле из 16 итераций. это повторяется с самого начала. -- Я думаю, это работает так, как я и ожидал. Если я определю более 8 пользовательских символов, будут выведены только последние 8 назначенных символов.
Вот фотография этого в действии:
вот мой код:
#include <Adafruit_LiquidCrystal.h>
Adafruit_LiquidCrystal lcd(0);
//перевернутые символы символов... символы по умолчанию - 7x5, 1 пиксель с пробелом внизу
//эти символы размером 7x5 с пробелом в верхнем
byte uA[8] = { B00000, B10001, B10001, B10001, B11111, B10001, B10001, B01110};
byte uB[8] = { B00000, B01111, B10001, B10001, B01111, B10001, B10001, B01111};
byte uC[8] = { B00000, B01110, B10001, B00001, B00001, B00001, B10001, B01110};
byte uD[8] = { B00000, B00111, B01001, B10001, B10001, B10001, B01001, B00111};
byte uE[8] = { B00000, B11111, B00001, B00001, B01111, B00001, B00001, B11111};
byte uF[8] = { B00000, B00001, B00001, B00001, B01111, B00001, B00001, B11111};
byte uG[8] = { B00000, B11110, B10001, B10001, B11101, B00001, B10001, B01110};
byte uH[8] = { B00000, B10001, B10001, B10001, B11111, B10001, B10001, B10001};
byte uI[8] = { B00000, B01110, B00100, B00100, B00100, B00100, B00100, B01110};
byte uJ[8] = { B00000, B00110, B01001, B01000, B01000, B01000, B01000, B11100};
byte uK[8] = { B00000, B10001, B01001, B00101, B00011, B00101, B01001, B10001};
byte uL[8] = { B00000, B01111, B00001, B00001, B00001, B00001, B00001, B00001};
byte uM[8] = { B00000, B10001, B10001, B10001, B10101, B10101, B11011, B10001};
byte uN[8] = { B00000, B10001, B10001, B11001, B10101, B10011, B10001, B10001};
byte uO[8] = { B00000, B01110, B10001, B10001, B10001, B10001, B10001, B01110};
byte uP[8] = { B00000, B00001, B00001, B00001, B01111, B10001, B10001, B01111};
byte uQ[8] = { B00000, B10110, B01001, B10101, B10001, B10001, B10001, B01110};
byte uR[8] = { B00000, B10001, B01001, B00101, B01111, B10001, B10001, B01111};
byte uS[8] = { B00000, B01111, B10000, B10000, B01110, B00001, B00001, B11110};
byte uT[8] = { B00000, B00100, B00100, B00100, B00100, B00100, B00100, B11111};
byte uU[8] = { B00000, B01110, B10001, B10001, B10001, B10001, B10001, B10001};
byte uV[8] = { B00000, B00100, B01010, B10001, B10001, B10001, B10001, B10001};
byte uW[8] = { B00000, B01010, B10101, B10101, B10101, B10001, B10001, B10001};
byte uX[8] = { B00000, B10001, B10001, B01010, B00100, B01010, B10001, B10001};
byte uY[8] = { B00000, B00100, B00100, B00100, B01010, B10001, B10001, B10001};
byte uZ[8] = { B00000, B11111, B00001, B00010, B00100, B01000, B10000, B11111};
//карманный
byte cornerA[]={B11111,B10000,B10000,B10000,B10000,B10000,B10000,B10000};//верхний левый
byte cornerB[]={B10000,B10000,B10000,B10000,B10000,B10000,B10000,B11111};// btm левый
byte cornerC[]={B11111,B00001,B00001,B00001,B00001,B00001,B00001,B00001};// верхний правый
byte cornerD[]={B00001,B00001,B00001,B00001,B00001,B00001,B00001,B11111};// btm правый
void flip(char *text);
void setup() {
Serial.begin(9600);
lcd.begin(16,2); //
//
lcd.createChar(0,uA);
lcd.createChar(1,uB);
lcd.createChar(2,uC);
lcd.createChar(3,uD);
lcd.createChar(4,uE);
lcd.createChar(5,uF);
lcd.createChar(6,uG);
lcd.createChar(7,uH);
lcd.createChar(8,uI);
lcd.createChar(9,uJ);
lcd.createChar(10,uK);
lcd.createChar(11,uL);
lcd.createChar(12,uM);
lcd.createChar(13,uN);
lcd.createChar(14,uO);
lcd.createChar(15,uP);
/*lcd.createChar(16,uQ);
lcd.createChar(17,uR);
lcd.createChar(18,uS);
lcd.createChar(19,uT);
lcd.createChar(20,uU);
lcd.createChar(21,uV);
lcd.createChar(22,uW);
lcd.createChar(23,uX);
lcd.createChar(24,uY);
lcd.createChar(25,uZ);
lcd.createChar(26,cornerA);
lcd.createChar(27,cornerB);
lcd.createChar(28,cornerC);
lcd.createChar(29,cornerD);
*/
//покрытие ascii, вероятно, как n+66
//setCursor будет выглядеть так: (столбец, строка) 16 столбцов, 2 строки, обе начинаются с 0
lcd.setCursor(0,0);
for (int i=0; i<16;i++){
lcd.write(i); //печатает ABCDEFGHABCDEFGH
lcd.setCursor(i+1,0);
delay (500);
}
lcd.setCursor(0,1);
lcd.print("LIMIT 8 CHARS?");
}
void loop() {}
Я хотел бы создать более 8 пользовательских символов, правильно ли я подхожу к этому? есть ли где-то предел, который я могу изменить?
@j0h, 👍2
Обсуждение1 ответ
Лучший ответ:
Эти дисплеи допускают только до 8 пользовательских символов. Аппаратное обеспечение просто имеет символьную память не более чем на 8 символов. Они будут сопоставлены с кодами символов от 0 до 7 и от 8 до 15. Код символа 8 всегда выводит тот же символ, что и код 0, 9 - как 1 и так далее.
Так что нет, невозможно использовать более 8 пользовательских символов одновременно. Конечно, вы можете изменять символы динамически, чтобы в определенном месте экрана всегда отображался изменяющийся значок пользовательского символа.
Черт возьми, это есть в техническом описании. Сначала я попробовал изменить библиотеку, но это не сработало. https://cdn-shop.adafruit.com/datasheets/HD44780.pdf, @j0h
Да, вы можете изменить библиотеку, но вы не можете изменить аппаратное обеспечение..., @PMF
- устаревшее преобразование из строковой константы в 'char*'
- Печать string and integer LCD
- как быстро loop() работает в Arduino
- как отправить аргумент объектам ESP8266WebServer в функции
- Ошибка: "'lcd' does not name a type" при использовании библиотеки LiquidCrystal.
- Arduino синтаксический анализ строки с использованием sscanf
- Объявление переменной внутри основного цикла
- Как создать проект ардуино с несколькими исходными файлами?
Обратите внимание, что некоторые буквы не нужно переворачивать:
HINOSXZ
. Для других вы можете использовать двойников:M
→W
,P
→d
,b
→p
,d' →
q`..., @Edgar Bonet@EdgarBonet: И (в зависимости от набора символов в конкретном используемом устройстве) могут быть и другие полезные символы. Большинство дисплеев HD44780 содержат некоторые символы катаканы, поэтому, например,
E
→ヨ
также могут быть использованы., @psmears