Можно ли вывести на lcd собственные символы без createChar?

Да, можно вывести собственные символы на LCD без использования функции createChar(). Один из подходов к этому - использование пользовательского шрифта.

Для начала вам понадобится создать пользовательский шрифт, который будет содержать ваши собственные символы. Чтобы создать пользовательский шрифт, вы должны определить символы в виде матрицы точек. Каждая матрица представляет один символ и состоит из 8 байтов, где каждый бит представляет отдельную точку на символе. Например, если вы хотите создать символ в виде стрелки, можно определить матрицу точек следующим образом:

byte arrow[8] = {
B00100,
B01110,
B11111,
B00100,
B00100,
B00100,
B00100,
B00000
};

Где каждая строка представляет отдельные байты, а B представляет двоичный формат.

После определения пользовательского шрифта, вы можете использовать библиотеки для работы с LCD, такие как LiquidCrystal или LCD HD44780 для вывода символов на экран. Вам нужно будет скопировать определение пользовательского шрифта в файл конфигурации библиотеки и затем использовать функции библиотеки для вывода символов на экран.

Обратите внимание, что не все LCD дисплеи поддерживают пользовательские символы, поэтому у вас должен быть подходящий дисплей для этой функции. Также имейте в виду, что каждый дисплей может иметь свою специфическую документацию и конфигурацию, поэтому вам может потребоваться изучить документацию вашего конкретного дисплея для подробной информации о том, как использовать пользовательские символы.

Вот пример кода для использования пользовательского шрифта на LCD с использованием библиотеки LiquidCrystal:

#include <LiquidCrystal.h>

// объявляем пользовательский шрифт
byte arrow[8] = {
  B00100,
  B01110,
  B11111,
  B00100,
  B00100,
  B00100,
  B00100,
  B00000
};

// инициализация объекта LiquidCrystal
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  // инициализация LCD
  lcd.begin(16, 2);
  
  // загрузка пользовательского шрифта
  lcd.createChar(0, arrow);
  
  // вывод символа на экран
  lcd.setCursor(0, 0);
  lcd.write((uint8_t)0); // выводим пользовательский символ с индексом 0
}

void loop() {
  // ваш код
}

В этом примере создается пользовательский шрифт в виде матрицы точек для символа стрелки. Затем, в настройке программы, пользовательский шрифт загружается в память LCD с помощью функции createChar(). Затем, в основном цикле программы, символ с индексом 0 выводится на экран с помощью функции write(). Это пример инициализации LCD и использования пользовательского шрифта, вы можете модифицировать его для своих нужд.

В заключение, вы можете выводить собственные символы на LCD без использования createChar() путем создания пользовательского шрифта и загрузки его в память LCD с помощью соответствующей функции из библиотеки. Важно убедиться, что ваш LCD дисплей поддерживает пользовательские символы и изучить документацию вашего конкретного дисплея для подробной информации о том, как использовать данный функционал.