lcd.createChar() позволяет использовать только 8 произвольных символов

У меня есть teensy4.1 с ЖК-экраном размером 16 на 2 и ЖК-интерфейсом I2C. Я пытался написать кучу пользовательских символов на жидкокристаллическом экране, чтобы перевернуть какой-нибудь текст.

моя проблема в том, что он работает нормально, но только для 8 пользовательских символов. любое большее, чем это, приводит к странным результатам. при цикле, равном 16, печатаются первые 8 символов. если задано более 8 символов, используются только последние назначенные символы.

Я закомментировал все пользовательские символы, кроме первых 8, и перебираю их в цикле из 16 итераций. это повторяется с самого начала. -- Я думаю, это работает так, как я и ожидал. Если я определю более 8 пользовательских символов, будут выведены только последние 8 назначенных символов.

Вот фотография этого в действии: customChar limits to 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 пользовательских символов, правильно ли я подхожу к этому? есть ли где-то предел, который я могу изменить?

, 👍2

Обсуждение

Обратите внимание, что некоторые буквы не нужно переворачивать: HINOSXZ. Для других вы можете использовать двойников: MW, Pd, bp, d' → q`..., @Edgar Bonet

@EdgarBonet: И (в зависимости от набора символов в конкретном используемом устройстве) могут быть и другие полезные символы. Большинство дисплеев HD44780 содержат некоторые символы катаканы, поэтому, например, E также могут быть использованы., @psmears


1 ответ


Лучший ответ:

6

Эти дисплеи допускают только до 8 пользовательских символов. Аппаратное обеспечение просто имеет символьную память не более чем на 8 символов. Они будут сопоставлены с кодами символов от 0 до 7 и от 8 до 15. Код символа 8 всегда выводит тот же символ, что и код 0, 9 - как 1 и так далее.

Так что нет, невозможно использовать более 8 пользовательских символов одновременно. Конечно, вы можете изменять символы динамически, чтобы в определенном месте экрана всегда отображался изменяющийся значок пользовательского символа.

,

Черт возьми, это есть в техническом описании. Сначала я попробовал изменить библиотеку, но это не сработало. https://cdn-shop.adafruit.com/datasheets/HD44780.pdf, @j0h

Да, вы можете изменить библиотеку, но вы не можете изменить аппаратное обеспечение..., @PMF