"Основное, что надо выводить на дисплей в зарядном устройстве – это текст. Значит, снова идем в наш любимый Ардуино, чтобы подсмотреть вывод текста там (Adafruit_GFX_Library). Но то, что я увидел просто повергло меня в ужас. Вывод текста там реализован двумя вложенными циклами, внутри которых для каждого закрашенного пикселя шрифта вызывается отдельная функция drawPixel, которая выбирает на дисплее новое «окно» размером один пиксель, после чего заполняет его нужным цветом. Мало того, что это крайне медленно, так еще и не позволяет перетирать одну строчку текста другой – ведь на дисплей передаются только закрашенные пиксели и текст от двух строчек просто наложится. Сами авторы библиотеки об этом знают, но считают, что реализовать по-другому просто невозможно:
Моргание измеряемых значений на экране неприемлемо, таким устройством будет невозможно пользоваться, надо делать что-то свое. Подумав, я решил взять из библиотеки Ардуино само графическое изображение открытого шрифта Open Sans (чтобы не изобретать велосипед), а весь код его вывода написать с нуля и на ассемблере, так как очевидно, что на Си он будет недостаточно быстрым.
Эксперименты с SPI показали, что помещать в регистр SPDR данные можно не чаще, чем один раз в 18 тактов, иначе передача сбивается. Это дает максимальную пропускную способность в 889 КБ/сек или 7.7 FPS на выбранном дисплее. Немного, но для зарядного устройства вполне хватит – большинство мультиметров производят всего 3 измерения в секунду и это всех устраивает, значит, здесь тоже можно ориентироваться на такую частоту. В общем, требуется написать такой код вывода символа, который будет выводить изображение вместе с заднем фоном и подавать очередной байт в регистр SPDR ровно через 18 тактов.
Ситуацию несколько усложняет формат, в котором хранится шрифт в Ардуино – для уменьшения места, занимаемого в памяти, от каждого символа хранится только центральный прямоугольник, где имеются закрашенные пиксели, и он для каждого символа свой. То есть, код вывода должен будет рисовать вокруг символа рамочку цветом заднего фона, рисовать сам символ и, что самое главное, делать это в реальном времени, подавая очередной байт в SPDR ровно через 18 тактов!
%symb%
И такой код был написан, это функция PrintGlyph в файле display_asm.S. Она устанавливает окно в контроллере дисплея по внешнему размеру символа, после чего попиксельно выводит символ в рамке слева-направо сверху-вниз. За счет того, что символ выводится с закрашенным задним фоном, становится возможно замещать на экране одну строку текста другой без моргания. А учитывая, что ширина всех цифр в шрифте Open Sans одинаковая, это позволяет красиво обновлять любые цифровые значения. Именно то, что было нужно."
... невозможное можно сделать возможным

С удовольствием
🙂