Некоторые ошибки слишком хороши, чтобы совершать их только один раз!

Меню навигации для мобильных

Матричные шрифты вывести на экранчик. Проблема?

Автор Slabovik, 19 Фев., 2024, 17:45

« предыдущая - следующая »

Slabovik

#25
Сдвиг вправо. Может быть проблема - надо проверить.
По умолчанию понимаем, что при логическом сдвиге вправо (и влево) на место "освободившегося" бита вписывается '0'. Однако слегка сомневаюсь, что при сдвиге вправо, если старший (знаковый) бит равен 1, в конце концов байт станет 0. При сдвиге с учётом знака, он станет 0xFF.

Здесь конечно явно указано, что байт BitMask беззнаковый, что подразумевает заполнение нулями, но просьба убедиться в этом в отладчике.
BitMask должен принимать значения:
128 - при инициализации
64 - после первого сдвига
32 - после второго
16 - после третьего
8 - после четвёртого
4 - после пятого
2 - после шестого
1 - после седьмого
0 - после восьмого. 0 и вызовет выход из цикла (если он не будет вызван прежде обнулением BitWidth)

Максимальная частота тактирования ST7735 при записи информации 15 МГц
Получается, в режиме RGB (24 бита), в секунду можно перезаписать максимум 625 тыс пикселей. Если дисплей 640x400, то на его перезапись уйдёт 0,4 секунды (без учёта всяких вычислений). В принципе, приемлемо (всё-равно это только гипотетически т.к. чип для дисплеев помельче) :)

Удобнее наверное режим 16 бит/пиксель, хотя бы ровно получается.

Поворот на 90° лучше всего делать командой на дисплей, а не корячиться с подпрограммами
ЦитатаIn vertical addressing mode (MV=1), the Y-address increments after each byte, after the last Y-address (Y=YE), Y wraps around to YS and X increments to address the next column.

In horizontal addressing mode (V=0), the X-address increments after each byte, after the last X-address (X=XE), X wraps around to XS and Y increments to address the next row. After the every last address (X=XE and Y=YE) the address pointers wrap around to address (X=XS and Y=YS).
Впрочем, бывают случаи необходимости текста под 90° к другому тексту...
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

#26
Никаких "боданий" нет и в помине, мысли озвучиваю.
Освободился пораньше, для понимания наконец массива и указателя накидал вот такой код:
  const unsigned char Array[] = { 55, 77, 101, 0, 88, 155, 254, 99};
  unsigned char MatrixByte;
  unsigned char *MatrixPointer = Array;
  do 
  { 
    MatrixByte = *MatrixPointer;
    MatrixPointer++;  
  } while (1);
и смотрел в дебаггере (segger позволяет запустить симуляцию без подключенного мк).
Всё норм, толко предупреждение напрягает:
initializing 'unsigned char *' with an expression of type 'const unsigned char[8]' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers]


:: добавлено 22 Фев., 2024, 16:41
Аааа.
Надо *MatrixPointer объявлять как const.


:: добавлено 22 Фев., 2024, 17:08
Функция (пока без вывода) у меня получается такой:
// InconsolaNum24x32 массив битмапов символов
// InconsolaNum24x32index его индексы
void print_char(unsigned char CH, uint8_t X, uint8_t Y) {
  unsigned char MatrixByte; // временная для обработки байта матрицы
  unsigned char BitMask;    // маска, накладываемая на байт для получения значения одного бита
  unsigned char BitWidth;   // счётчик выведенных по горизонтали точек
  
  unsigned char SymbolWidth = 24, MatrixLength = 96;
  const unsigned char *MatrixPointer = InconsolaNum24x32;
  BitWidth = SymbolWidth;   // начальная установка счётчика
  MatrixPointer += InconsolaNum24x32index[CH];  // перемещаем указатель на начало символа CH

  // начало алгоритма вывода. Вывод без поворота
  // x матрицы = x символа (ширина)
  // y матрицы = y символа (высота)

  do {
    MatrixByte = *MatrixPointer;       // чтение очередного байта матрицы
    MatrixPointer = MatrixPointer + 1; // после чтения передвинем указатель на следующий байт матрицы
    MatrixLength = MatrixLength - 1;   // можно писать просто MatrixLength--; но мне так не нравится...
    BitMask = 0b10000000;              // предустановка маски и ширины символа на начало для каждого прочитанного байта

    do {
      if ((MatrixByte & BitMask) > 0) {

      } // вывод в поток точки цвета символа
      else {

      }; // вывод в поток точки цвета фона

      BitMask = BitMask >> 1;  // как только бит выедет вправо, BitMask станет равен 0. Значит, вывели все 8 битов в поток
      BitWidth = BitWidth - 1; // как только значение станет равным 0. Значит, все биты строки вывели в поток

    } while ((BitWidth > 0) && (BitMask > 0)); // если хоть что-то стало 0, надо читать следующий байт - выходим из этого цикла

    if (BitWidth == 0)
      BitWidth = SymbolWidth; // если выход был по окончании вывода строки - снова предустановим счётчик
                              // один раз на символ предустановка лишняя, но организовывать проверку
                              // окажется много дороже, чем один лишний раз присвоить значение
  } while (MatrixLength > 0);
}


:: добавлено 22 Фев., 2024, 19:08
Обновил на гитхабе, всё крутится-вертится, осталось координаты прикрутить.

:: добавлено 22 Фев., 2024, 21:07
Записал отладку
https://youtu.be/rYf1KOmkLg4

:: добавлено 23 Фев., 2024, 00:35
Прикрутил координаты.
Всё арбайтн гут!  :D
Не пойму только у 0, 2, 6, 8, 9 вверху точка проскакивает, или это сливается с краем?
https://www.youtube.com/shorts/6CSE6p1n5r0
Код от видео на гитхабе.
https://github.com/minamonra/

Slabovik

Эти точки сверху - они в шрифте есть. Второй байт у нолика - 10h, второй байт у двойки 10h, у восьмёрки 18h, у девятки 10h. Так что выводит так, как нарисовано.

Честно говоря, не понял, почему он требует, чтобы указатель был типа "указатель на массив" и обязательно константа. Тут я... мнэээ... Потому что указатель - это такая фигня, которому должно быть пофиг. Возможно, компилятор перестраховывается и проверяет соответствие типов.

В отладке тоже слегка не понял. Ладно, регистры он показывает (не особо и надо для Си), но главное - это следить за состоянием переменных. Уж год сеггер в руки не брал, но должна быть возможность "вытащить" переменные в окошечко, где и следить за их состоянием по мере шагания по программе.

Поворачивать на 90 будем? Но это будет другая подпрограмма (или просто вторая ветка этой процедуры, но тогда на её входе нужен ещё флаг "поворот"). В эту (в эти циклы) засовывать не хочется ввиду потери быстродействия (даже несмотря на то, что быстродействие и так благодаря SPI не особо).

Да, кстати, на уровне совета.
В циклах ожидания состояния готовности того же SPI, надо бы предусматривать ситуацию, когда готовность (или ещё чего, чего ожидается), не наступает. По-идее, должен быть выход из цикла по таймауту, в какую-нибудь процедуру обработки-вывода (в лог) ошибок.
Но для мелкого применения (не универсального) можно и так.
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

Цитатано главное - это следить за состоянием переменных
Так в правом верхнем углу как-раз все нужные переменные и есть.
Верхняя как раз BitMask, в двоичном виде за ней наблюдать как раз удобнее, но я в десятичном отобразил, там понятно, только дла записи экрана какую-то софтину нашел, а она пожала сильно видео.
ЦитатаДа, кстати, на уровне совета.
Да, на будущее надо какой-то обработчик ошибок сделать.
Пока не придумал как, советуй. :)
ЦитатаПоворачивать на 90 будем?
Можно попробовать другой функцией.
---
Попробовал шрифт из MatrixFont, - выводит мусор.
Шрифт с индексом тут:
https://github.com/minamonra/font_test/blob/main/matr_font_sl_01/consolas_22_font.h
Не пойму откуда берётся значение дефайна:
#define FONT_CONSOLAS_22_LENGTH         224
---
ы. С праздником!
https://github.com/minamonra/

zenon

Со шрифтами rinkydinkelectronics всё отлично, ещё некоторые попробовал.

Отправил в сниппеты, там же скриншоты (https://github.com/minamonra/my_stm_snippets/tree/main/F0/st7735/st7735sl).
А вот consolas_22 от MatrixFont:
↓ спойлер ↓
1708778487709.jpg
[свернуть]
https://github.com/minamonra/

Slabovik

MatrixFont закодирован в другую сторону. У нас сейчас сдвиг влево, MatrixFont должен сдвигаться вправо.

А вот... я смотрю, так и не попробовал какой-нибудь шрифт не кратной 8 шириной. Или я опять просмотрел, как и режим отладки  ::)

Но тут главное - въехать в алгоритм.

Вывод с поворотом... завтра, наверное. Там в исходных данных всё-таки ширина в байтах нужна будет - это чтобы от строки к строке переходить (здесь-то не надо было, потому что читалось всё последовательно).

Ширину в байтах моно упаковать (если байт экономить) в ширину в пикселях. Отдать под это два старших бита. В шести младших битах хранить ширину в пикселях.

Но, щас подумалось, если делать так, удобнее сделать сложнее: под байты отдать пять старших бит, под биты три младших.
Битов в байте может быть не больше 8, но и 0 тоже не бывает. Поэтом 0 соответствует 1 биту, 1 - двум и т.д.

С байтами та же ерунда. 0 байтов не бывает, значит, это 1 байт и значит, он последний в строке. Количество битов в последнем байте - это записали выше.
Если здесь будет записано

0b 0000 0111 - это значит шрифт шириной 8 пикселей. Длина строки в байтах = ((0b 0000 0111) >> 3) +1 = 1

0b 0001 0011 -  это значит шрифт шириной 2 байта и 4 пикселя. Длина строки = ((0b 0001 0011) >> 3) +1 = 3

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

zenon

Мне кажется более интересно в индексный файл добавить хотя-бы ширину каждого символа, будет уже веселее.
---
ЦитатаMatrixFont закодирован в другую сторону. У нас сейчас сдвиг влево, MatrixFont должен сдвигаться вправо.
Для проверки сделал так:
↓ спойлер ↓
unsigned char reverse(unsigned char b) 
{
  b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
  b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
  b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
  return b;
}

...
...
MatrixByte    = reverse(*MatrixPointer);     // чтение очередного байта матрицы
...
...
[свернуть]
Результат:
↓ спойлер ↓
1708790881484.jpg
[свернуть]


А как правильно его в другую сторону толкать?
ы. Нет, не пропустил, сделаю какой-нибудь 17х25 и попробую.

https://github.com/minamonra/

Slabovik

В другую сторону толкать точно также, только в другую  ;D
Начальная маска назначается не 0b10000000, а 0b00000001
и после прочтения бита сдвигается влево, а не вправо, как сейчас.

Но такой шрифт надо будет и рисовать перевёрнутым. Ибо по умолчанию считают, что развёртка слева направо и первым идёт старший бит, а байты наоборот - первым младший (интеловская нотация).

Ширину каждого символа - это можно конечно. Но тогда надо эту ширину возвращать в процедуру выше (которая вызывала рисовку символа), чтобы она могла определить, на сколько сместить курсор (т.е. место рисовки) для следующего символа. Решаемо.
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

Сделал из Gost Type A 18pt 17x23, правда сильно его почекрыжил.
↓ спойлер ↓
[свернуть]
https://github.com/minamonra/

Slabovik

Чисто эстетически автомат слегка лажает. Надо-бы руками пиксели подправлять, а то буквы лохматые какие-то. Дело наживное.
А так, похоже, всё работает.

Хитрость в алгоритме заметил?
Не использовался отдельный счётчик битов в байте. Его роль выполняла маска, чисто по совместительству.
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

Да, про маску понял.
Вот ещё один шрифт попробовал, ну и в динамике, снял не на телефон, фокус немного промазал. :)
↓ спойлер ↓
[свернуть]
Обновление цифр 10 раз в секунду.
https://github.com/minamonra/

Slabovik

Сейчас присматриваюсь. Это ведь этот экранчик: https://www.winstar.com.tw/products/tft-lcd/module/tft-st7735.html  ?
Начинаю понимать запрос на шрифты большого размера. Уж подумал его в качестве индикатора лабораторника применить, но сейчас вижу, что даже два таких индикатора (один на вольты, второй на амперы) будут мелковаты...
А есть такие же, но побольше?  ::)

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

Классический обработчик представляет собой набор процедур, к которому обращаются по определённому адресу. Можно через прерывание, генерируемое софтверно или даже хардверно (хардверно работают WatchDog, BrownOut и ещё бывает экзотика на основе таймеров, уровней и т.п.)

Код ошибки передаётся каким-то параметром (в ассемблере удобно пользоваться регистром).
В самом простом случае представляет собой заглушку, которая ничего не делает и возвращает бег процессора обратно в программу.

Для случаев посложнее, ошибки надо поделить на критические - это после которых программа останавливается (навечно закольцовывается в обработчике, либо, если продакшн, производится "холодный старт" после обработки и записи в логи), и не критические - это типа "warning", который можно записать в лог, но потом возвратить управление в основную программу.

Лог - это что угодно. Какие-то записи. Для микроконтроллеров удобно в COM-порт. Это для того, чтобы можно было подсоединить, запустить и посмотреть, что там происходит. Правда, чтобы передача по COM не мешала работе основной программы (он ведь тормозной), надо организовывать очередь, куда программа могла бы быстро "бросить" запись, а порт уже самостоятельно (системой прерываний) выводил бы записанное.

Применительно к ожиданию готовности (индикатора), это скорее критическая ошибка. Нет готовности - невозможно выводить данные в него. Обычно делается счётчик опросов и если после N опросов (это надо по времени смотреть, чтобы не принять решение слишком рано) готовность не наступила, передать управление (вызвать функцию) обработчика ошибок.
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

Да, экранчик этот.
Побольше есть, 2,4 дюйма например, 1,77 и 1.8 практически одинаковые.
Для лабараторника, при условии что отображаться будет напряжение и ток 1,77 мне кажется достаточным, не такой он и маленький.
Вот Oled 0,96 - этот да - мелочь та ещё. Плюс выгорают сильно.
На фото Oled 1,2 дюйма правый, по центру 2,4.
---
Самое интересное, до конца не мог понять, что после установки SetWin (CASET RASET) надо всего лишь посылать байты подряд, перевод на следующую строку происходит сам, просто ограниченное поле, которое надо просто заполнить.
Доходила слишком долго почему-то такая простая вещь... :)
Отсюда и моё непонимание.


https://github.com/minamonra/

Slabovik

#38
2,4" ещё более-менее.
Мысль была о том (хотел делать хардверно, но пока некогда, да и прошлый измеритель я по юзабилити не довёл до ума - сделал только основные функции), чтобы одновременно отображать напряжение и ток на выходе крупными цифрами и рядом с ними (эстетично подобрать размер и положение) установленные напряжение и ток. Т.е. четыре значения сразу. Формат 4:3 в положении "портрет" вроде нормально подходит для этого. Плюс ещё индикация туда...


Ладно. Надо придумать вывод с поворотом

Символ-ЧЕТЫРЕ.png

Тут есть проблема. Поворот можно делать вправо, а можно делать влево. И это разные повороты.
При повороте вправо, вывод должен начинаться с левого нижнего угла символа, разворачиваться вверх (это будет отображаться на координате X) и вправо (координата Y).

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

zenon

#39
Захотел перекинуть SixteenSegment16x24 в программу MatrixFont, там можно из Си файла импортировать.
Тут две засады
#define FONT_CONSOLAS_18_LENGTH        224
Что это никак не пойму?
Файл тут (https://github.com/minamonra/font_test/blob/main/matr_font_sl_01/consolas_18_font.h).
Вторая - отреверсить байты, сходу не понял как осуществить, потом решил printf использовать, крутилку массива послал в Online C Compiler, всё вышло хорошо.
#include <stdio.h>

unsigned char reverse(unsigned char b) 
{
  b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
  b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
  b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
  return b;
}

char W[] = 
{
// 288
    0x00, 0x00, 0x3E, 0x7C, 0x3E, 0x7C, 0x40, 0x06, 0x60, 0x0E, 0x60, 0x1A, 0x60, 0x32, 0x60, 0x36, 0x60, 0x66, 0x60, 0x66, 0x60, 0x06, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x66, 0x06, 0x66, 0x06, 0x6C, 0x06, 0x4C, 0x06, 0x58, 0x06, 0x70, 0x06, 0x60, 0x02, 0x3E, 0x7C, 0x3E, 0x7C, 0x00, 0x00, // 0
    0x00, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x1F, 0xF8, 0x3E, 0x7C, 0x00, 0x00, // 1
    0x00, 0x00, 0x3E, 0x7C, 0x1E, 0x7C, 0x00, 0x02, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x02, 0x3E, 0x7C, 0x3E, 0x7C, 0x40, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x40, 0x00, 0x3E, 0x78, 0x3E, 0x7C, 0x00, 0x00, // 2
    0x00, 0x00, 0x3E, 0x7C, 0x1E, 0x7C, 0x00, 0x02, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x02, 0x3E, 0x7C, 0x3E, 0x7C, 0x00, 0x02, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x02, 0x1E, 0x7C, 0x3E, 0x7C, 0x00, 0x00, // 3
    0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x40, 0x02, 0x3E, 0x7C, 0x3E, 0x7C, 0x00, 0x02, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, // 4
    0x00, 0x00, 0x3E, 0x7C, 0x3E, 0x78, 0x40, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x40, 0x00, 0x3E, 0x7C, 0x3E, 0x7C, 0x00, 0x02, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x02, 0x1E, 0x7C, 0x3E, 0x7C, 0x00, 0x00, // 5
    0x00, 0x00, 0x3E, 0x7C, 0x3E, 0x78, 0x40, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x40, 0x00, 0x3E, 0x7C, 0x3E, 0x7C, 0x40, 0x02, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x40, 0x02, 0x3E, 0x7C, 0x3E, 0x7C, 0x00, 0x00, // 6
    0x00, 0x00, 0x3E, 0x7C, 0x1E, 0x7C, 0x00, 0x02, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, // 7
    0x00, 0x00, 0x3E, 0x7C, 0x3E, 0x7C, 0x40, 0x02, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x40, 0x02, 0x3E, 0x7C, 0x3E, 0x7C, 0x40, 0x02, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x40, 0x02, 0x3E, 0x7C, 0x3E, 0x7C, 0x00, 0x00, // 8
    0x00, 0x00, 0x3E, 0x7C, 0x3E, 0x7C, 0x40, 0x02, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x40, 0x02, 0x3E, 0x7C, 0x3E, 0x7C, 0x00, 0x02, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x02, 0x1E, 0x7C, 0x3E, 0x7C, 0x00, 0x00, // 9

    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0x80, 0x00, 0x00, // . // 10
    0x00, 0x00, 0x3E, 0x7C, 0x3E, 0x7C, 0x40, 0x02, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x40, 0x02, 0x3E, 0x7C, 0x3E, 0x7C, 0x40, 0x02, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, // A // 11
    0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x60, 0x08, 0x60, 0x08, 0x60, 0x18, 0x60, 0x30, 0x60, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x66, 0x00, 0x66, 0x00, 0x6C, 0x00, 0x4C, 0x00, 0x58, 0x00, 0x70, 0x00, 0x60, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, // V // 12
    0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x00, 0x00, 0x00, 0x00, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x41, 0x82, 0x3F, 0xFC, 0x3E, 0x7C, 0x00, 0x00, // W // 13
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // <space> 14
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // : // 15
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x03, 0xC0, 0x03, 0xC0, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // a // 16
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x88, 0x11, 0x88, 0x19, 0x98, 0x0D, 0xB0, 0x0D, 0xB0, 0x07, 0xE0, 0x07, 0xE0, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // v // 17
    0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x41, 0x82, 0x3E, 0x7C, 0x3E, 0x7C, 0x41, 0x82, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, // w // 18
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x1F, 0xF8, 0x3E, 0x7C, 0x00, 0x00, // c // 19
    0x00, 0x00, 0x3E, 0x7C, 0x3E, 0x78, 0x40, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x40, 0x00, 0x3E, 0x78, 0x3E, 0x7C, 0x00, 0x00, // C // 20    
};

int i = 1;
int main()
{
  do {
    printf("0x%02hhx", reverse(W[i-1]));
    printf(",");
    if ((i % 48 == 0) && (i>0)) printf("\n");
    i++;
  } while (i < sizeof(W)+1);
  return 0;
}

---
Оборотные стороны дисплеев. Тача на моём 2.4" нет.
ы. Как цифровой этот шрифт мне нравиться, чуть бы его пожирнее, хотя не знаю.
↓ спойлер ↓
[свернуть]

:: добавлено 26 Фев., 2024, 20:49
Импорт удался, длина, о которой спрашивал оказалась количеством символов.
Код шрифта для импорта:
↓ спойлер ↓
#ifndef FONT_SIXSEG_H
#define FONT_SIXSEG_H

#ifndef FONT_TYPE_MONOSPACED
#define FONT_TYPE_MONOSPACED                0
#endif

#ifndef FONT_TYPE_PROPORTIONAL
#define FONT_TYPE_PROPORTIONAL              1
#endif

#define FONT_SIXSEG_LENGTH        21
#define FONT_SIXSEG_START_CHAR    32
#define FONT_SIXSEG_CHAR_WIDTH    16
#define FONT_SIXSEG_CHAR_HEIGHT   24
#define FONT_SIXSEG_FONT_TYPE     (FONT_TYPE_MONOSPACED)
#define FONT_SIXSEG_ARRAY_LENGTH  (FONT_SIXSEG_LENGTH * FONT_SIXSEG_CHAR_HEIGHT * 3)

const unsigned char  font_seven_segment_30[FONT_SEVEN_SEGMENT_30_ARRAY_LENGTH] =


const unsigned char font_sixseg[] = {
0x00,0x00,0x7c,0x3e,0x7c,0x3e,0x02,0x60,0x06,0x70,0x06,0x58,0x06,0x4c,0x06,0x6c,0x06,0x66,0x06,0x66,0x06,0x60,0x00,0x00,0x00,0x00,0x06,0x60,0x66,0x60,0x66,0x60,0x36,0x60,0x32,0x60,0x1a,0x60,0x0e,0x60,0x06,0x40,0x7c,0x3e,0x7c,0x3e,0x00,0x00,
0x00,0x00,0x7c,0x00,0xf8,0x00,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x00,0x00,0x00,0x00,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xf8,0x1f,0x7c,0x3e,0x00,0x00,
0x00,0x00,0x7c,0x3e,0x78,0x3e,0x00,0x40,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x40,0x7c,0x3e,0x7c,0x3e,0x02,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x02,0x00,0x7c,0x1e,0x7c,0x3e,0x00,0x00,
0x00,0x00,0x7c,0x3e,0x78,0x3e,0x00,0x40,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x40,0x7c,0x3e,0x7c,0x3e,0x00,0x40,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x40,0x78,0x3e,0x7c,0x3e,0x00,0x00,
0x00,0x00,0x00,0x00,0x02,0x40,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x02,0x40,0x7c,0x3e,0x7c,0x3e,0x00,0x40,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x40,0x00,0x00,0x00,0x00,
0x00,0x00,0x7c,0x3e,0x7c,0x1e,0x02,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x02,0x00,0x7c,0x3e,0x7c,0x3e,0x00,0x40,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x40,0x78,0x3e,0x7c,0x3e,0x00,0x00,
0x00,0x00,0x7c,0x3e,0x7c,0x1e,0x02,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x02,0x00,0x7c,0x3e,0x7c,0x3e,0x02,0x40,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x02,0x40,0x7c,0x3e,0x7c,0x3e,0x00,0x00,
0x00,0x00,0x7c,0x3e,0x78,0x3e,0x00,0x40,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x40,0x00,0x00,0x00,0x00,
0x00,0x00,0x7c,0x3e,0x7c,0x3e,0x02,0x40,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x02,0x40,0x7c,0x3e,0x7c,0x3e,0x02,0x40,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x02,0x40,0x7c,0x3e,0x7c,0x3e,0x00,0x00,
0x00,0x00,0x7c,0x3e,0x7c,0x3e,0x02,0x40,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x02,0x40,0x7c,0x3e,0x7c,0x3e,0x00,0x40,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x40,0x78,0x3e,0x7c,0x3e,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x80,0x01,0x00,0x00,
0x00,0x00,0x7c,0x3e,0x7c,0x3e,0x02,0x40,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x02,0x40,0x7c,0x3e,0x7c,0x3e,0x02,0x40,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x02,0x40,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x10,0x06,0x10,0x06,0x18,0x06,0x0c,0x06,0x0c,0x06,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x66,0x00,0x66,0x00,0x36,0x00,0x32,0x00,0x1a,0x00,0x0e,0x00,0x06,0x00,0x02,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x02,0x40,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x00,0x00,0x00,0x00,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x82,0x41,0xfc,0x3f,0x7c,0x3e,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0xc0,0x03,0xc0,0x03,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x11,0x88,0x11,0x98,0x19,0xb0,0x0d,0xb0,0x0d,0xe0,0x07,0xe0,0x07,0x80,0x01,0x00,0x00,0x00,0x00,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x02,0x40,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x82,0x41,0x7c,0x3e,0x7c,0x3e,0x82,0x41,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x02,0x40,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x00,0x00,0x00,0x00,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xf8,0x1f,0x7c,0x3e,0x00,0x00,
0x00,0x00,0x7c,0x3e,0x7c,0x1e,0x02,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x02,0x00,0x7c,0x1e,0x7c,0x3e,0x00,0x00,
};
[свернуть]
https://github.com/minamonra/

Slabovik

Что-то не пойму. Матрица 16x24, а на экране 15x23.

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

zenon

#41
А это она автоматом холст оптимизировала.
вот правильный:
↓ спойлер ↓
// Название шрифта          font_sixseg
// Автор шрифта             HOME-PC / john
// Дата и время генерации   27.02.2024 10:19:01
// Сгенерировано            matrixFont v1.4.7.64
// Кодовая страница         ANSI (ASCII 7-битная)
// https://gitlab.com/riva-lab/matrixFont 

#ifndef FONT_FONT_SIXSEG_H
#define FONT_FONT_SIXSEG_H

#ifndef FONT_TYPE_MONOSPACED
#define FONT_TYPE_MONOSPACED            0
#endif

#ifndef FONT_TYPE_PROPORTIONAL
#define FONT_TYPE_PROPORTIONAL          1
#endif

#define FONT_FONT_SIXSEG_LENGTH         21
#define FONT_FONT_SIXSEG_START_CHAR     32
#define FONT_FONT_SIXSEG_CHAR_WIDTH     16
#define FONT_FONT_SIXSEG_CHAR_HEIGHT    24
#define FONT_FONT_SIXSEG_FONT_TYPE      (FONT_TYPE_MONOSPACED)
#define FONT_FONT_SIXSEG_ARRAY_LENGTH   (FONT_FONT_SIXSEG_LENGTH * FONT_FONT_SIXSEG_CHAR_HEIGHT * 2)

const unsigned char  font_font_sixseg[FONT_FONT_SIXSEG_ARRAY_LENGTH] =
{
    0x00, 0x00, 0xFC, 0x3F, 0xFC, 0x3F, 0x02, 0x60, 0x06, 0x70, 0x06, 0x58, 0x06, 0x4C, 0x06, 0x6C, 0x06, 0x66, 0x06, 0x66, 0x06, 0x63, 0x86, 0x61, 0x86, 0x61, 0xC6, 0x60, 0x66, 0x60, 0x66, 0x60, 0x36, 0x60, 0x32, 0x60, 0x1A, 0x60, 0x0E, 0x60, 0x06, 0x40, 0xFC, 0x3F, 0xFC, 0x3F, 0x00, 0x00, // Символ 32  < > 
    0x00, 0x00, 0x7C, 0x00, 0xF8, 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xF8, 0x1F, 0xFC, 0x3F, 0x00, 0x00, // Символ 33  <!> 
    0x00, 0x00, 0xFC, 0x3F, 0xF8, 0x3F, 0x00, 0x40, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x40, 0xFC, 0x3F, 0xFC, 0x3F, 0x02, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x02, 0x00, 0xFC, 0x1F, 0xFC, 0x3F, 0x00, 0x00, // Символ 34  <"> 
    0x00, 0x00, 0xFC, 0x3F, 0xF8, 0x3F, 0x00, 0x40, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x40, 0xF8, 0x3F, 0xF8, 0x3F, 0x00, 0x40, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x40, 0xF8, 0x3F, 0xFC, 0x3F, 0x00, 0x00, // Символ 35  <#> 
    0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x02, 0x40, 0xFC, 0x3F, 0xFC, 0x3F, 0x00, 0x40, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, // Символ 36  <$> 
    0x00, 0x00, 0xFC, 0x3F, 0xFC, 0x1F, 0x02, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x02, 0x00, 0xFC, 0x3F, 0xFC, 0x3F, 0x00, 0x40, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x40, 0xF8, 0x3F, 0xFC, 0x3F, 0x00, 0x00, // Символ 37  <%> 
    0x00, 0x00, 0xFC, 0x3F, 0xFC, 0x1F, 0x02, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x02, 0x00, 0xFC, 0x3F, 0xFC, 0x3F, 0x02, 0x40, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x02, 0x40, 0xFC, 0x3F, 0xFC, 0x3F, 0x00, 0x00, // Символ 38  <&> 
    0x00, 0x00, 0xFC, 0x3F, 0xF8, 0x3F, 0x00, 0x40, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, // Символ 39  <'> 
    0x00, 0x00, 0xFC, 0x3F, 0xFC, 0x3F, 0x02, 0x40, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x02, 0x40, 0xFC, 0x3F, 0xFC, 0x3F, 0x02, 0x40, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x02, 0x40, 0xFC, 0x3F, 0xFC, 0x3F, 0x00, 0x00, // Символ 40  <(> 
    0x00, 0x00, 0xFC, 0x3F, 0xFC, 0x3F, 0x02, 0x40, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x02, 0x40, 0xFC, 0x3F, 0xFC, 0x3F, 0x00, 0x40, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x40, 0xF8, 0x3F, 0xFC, 0x3F, 0x00, 0x00, // Символ 41  <)> 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, // Символ 42  <*> 
    0x00, 0x00, 0xFC, 0x3F, 0xFC, 0x3F, 0x02, 0x40, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x02, 0x40, 0xFC, 0x3F, 0xFC, 0x3F, 0x02, 0x40, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, // Символ 43  <+> 
    0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x0E, 0x70, 0x1C, 0x38, 0x18, 0x18, 0x30, 0x0C, 0x30, 0x0C, 0x60, 0x06, 0xE0, 0x07, 0xC0, 0x03, 0x80, 0x01, 0x00, 0x00, // Символ 44  <,> 
    0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x82, 0x41, 0xFC, 0x3F, 0x7C, 0x3E, 0x00, 0x00, // Символ 45  <-> 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 46  <.> 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 47  </> 

        // Digits / Цифры 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0xC0, 0x03, 0xC0, 0x03, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 48  <0> 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x11, 0x88, 0x11, 0x98, 0x19, 0xB0, 0x0D, 0xB0, 0x0D, 0xE0, 0x07, 0xE0, 0x07, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 49  <1> 
    0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x82, 0x41, 0x7C, 0x3E, 0x7C, 0x3E, 0x82, 0x41, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, // Символ 50  <2> 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xF8, 0x1F, 0x7C, 0x3E, 0x00, 0x00, // Символ 51  <3> 
    0x00, 0x00, 0xFC, 0x3F, 0xFC, 0x1F, 0x02, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x02, 0x00, 0xFC, 0x1F, 0xFC, 0x3F, 0x00, 0x00  // Символ 52  <4> 
};

#endif // FONT_FONT_SIXSEG_H 
[свернуть]
Другой формат получается, если указать в настройках пропорциональный шрифт:
↓ спойлер ↓
// Название шрифта          font_sixseg
// Автор шрифта             HOME-PC / john
// Дата и время генерации   27.02.2024 10:21:56
// Сгенерировано            matrixFont v1.4.7.64
// Кодовая страница         ANSI (ASCII 7-битная)
// https://gitlab.com/riva-lab/matrixFont 

#ifndef FONT_FONT_SIXSEG_H
#define FONT_FONT_SIXSEG_H

#ifndef FONT_TYPE_MONOSPACED
#define FONT_TYPE_MONOSPACED            0
#endif

#ifndef FONT_TYPE_PROPORTIONAL
#define FONT_TYPE_PROPORTIONAL          1
#endif

#define FONT_FONT_SIXSEG_LENGTH         21
#define FONT_FONT_SIXSEG_START_CHAR     32
#define FONT_FONT_SIXSEG_CHAR_WIDTH     16
#define FONT_FONT_SIXSEG_CHAR_HEIGHT    24
#define FONT_FONT_SIXSEG_FONT_TYPE      (FONT_TYPE_PROPORTIONAL)
#define FONT_FONT_SIXSEG_ARRAY_LENGTH   (FONT_FONT_SIXSEG_LENGTH * (1 + FONT_FONT_SIXSEG_CHAR_HEIGHT * 2))

const unsigned char  font_font_sixseg[FONT_FONT_SIXSEG_ARRAY_LENGTH] =
{
     15, /*N*/ 0x00, 0x00, 0xFC, 0x3F, 0xFC, 0x3F, 0x02, 0x60, 0x06, 0x70, 0x06, 0x58, 0x06, 0x4C, 0x06, 0x6C, 0x06, 0x66, 0x06, 0x66, 0x06, 0x63, 0x86, 0x61, 0x86, 0x61, 0xC6, 0x60, 0x66, 0x60, 0x66, 0x60, 0x36, 0x60, 0x32, 0x60, 0x1A, 0x60, 0x0E, 0x60, 0x06, 0x40, 0xFC, 0x3F, 0xFC, 0x3F, 0x00, 0x00, // Символ 32  < > 
     14, /*N*/ 0x00, 0x00, 0x7C, 0x00, 0xF8, 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xF8, 0x1F, 0xFC, 0x3F, 0x00, 0x00, // Символ 33  <!> 
     15, /*N*/ 0x00, 0x00, 0xFC, 0x3F, 0xF8, 0x3F, 0x00, 0x40, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x40, 0xFC, 0x3F, 0xFC, 0x3F, 0x02, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x02, 0x00, 0xFC, 0x1F, 0xFC, 0x3F, 0x00, 0x00, // Символ 34  <"> 
     15, /*N*/ 0x00, 0x00, 0xFC, 0x3F, 0xF8, 0x3F, 0x00, 0x40, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x40, 0xF8, 0x3F, 0xF8, 0x3F, 0x00, 0x40, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x40, 0xF8, 0x3F, 0xFC, 0x3F, 0x00, 0x00, // Символ 35  <#> 
     15, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x02, 0x40, 0xFC, 0x3F, 0xFC, 0x3F, 0x00, 0x40, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, // Символ 36  <$> 
     15, /*N*/ 0x00, 0x00, 0xFC, 0x3F, 0xFC, 0x1F, 0x02, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x02, 0x00, 0xFC, 0x3F, 0xFC, 0x3F, 0x00, 0x40, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x40, 0xF8, 0x3F, 0xFC, 0x3F, 0x00, 0x00, // Символ 37  <%> 
     15, /*N*/ 0x00, 0x00, 0xFC, 0x3F, 0xFC, 0x1F, 0x02, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x02, 0x00, 0xFC, 0x3F, 0xFC, 0x3F, 0x02, 0x40, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x02, 0x40, 0xFC, 0x3F, 0xFC, 0x3F, 0x00, 0x00, // Символ 38  <&> 
     15, /*N*/ 0x00, 0x00, 0xFC, 0x3F, 0xF8, 0x3F, 0x00, 0x40, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, // Символ 39  <'> 
     15, /*N*/ 0x00, 0x00, 0xFC, 0x3F, 0xFC, 0x3F, 0x02, 0x40, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x02, 0x40, 0xFC, 0x3F, 0xFC, 0x3F, 0x02, 0x40, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x02, 0x40, 0xFC, 0x3F, 0xFC, 0x3F, 0x00, 0x00, // Символ 40  <(> 
     15, /*N*/ 0x00, 0x00, 0xFC, 0x3F, 0xFC, 0x3F, 0x02, 0x40, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x02, 0x40, 0xFC, 0x3F, 0xFC, 0x3F, 0x00, 0x40, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x40, 0xF8, 0x3F, 0xFC, 0x3F, 0x00, 0x00, // Символ 41  <)> 
      9, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, // Символ 42  <*> 
     15, /*N*/ 0x00, 0x00, 0xFC, 0x3F, 0xFC, 0x3F, 0x02, 0x40, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x02, 0x40, 0xFC, 0x3F, 0xFC, 0x3F, 0x02, 0x40, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, // Символ 43  <+> 
     15, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x0E, 0x70, 0x1C, 0x38, 0x18, 0x18, 0x30, 0x0C, 0x30, 0x0C, 0x60, 0x06, 0xE0, 0x07, 0xC0, 0x03, 0x80, 0x01, 0x00, 0x00, // Символ 44  <,> 
     15, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x82, 0x41, 0xFC, 0x3F, 0x7C, 0x3E, 0x00, 0x00, // Символ 45  <-> 
      9, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 46  <.> 
      9, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 47  </> 

        // Digits / Цифры 
     10, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0xC0, 0x03, 0xC0, 0x03, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 48  <0> 
     13, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x11, 0x88, 0x11, 0x98, 0x19, 0xB0, 0x0D, 0xB0, 0x0D, 0xE0, 0x07, 0xE0, 0x07, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 49  <1> 
     15, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x82, 0x41, 0x7C, 0x3E, 0x7C, 0x3E, 0x82, 0x41, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, // Символ 50  <2> 
     14, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xF8, 0x1F, 0x7C, 0x3E, 0x00, 0x00, // Символ 51  <3> 
     14, /*N*/ 0x00, 0x00, 0xFC, 0x3F, 0xFC, 0x1F, 0x02, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x02, 0x00, 0xFC, 0x1F, 0xFC, 0x3F, 0x00, 0x00  // Символ 52  <4> 
};

#endif // FONT_FONT_SIXSEG_H 
[свернуть]
Те для каждого символа сначала ширина, потом данные, выстота остаётся неизменной.

:: добавлено 27 Фев., 2024, 15:44
А, да, про дефайны, в коде они конечно же не нужны, но для импорта шрифта в программу без них не получится.
https://github.com/minamonra/