Год назад сталкивался с подобными же проблемами, так-что докладываю.
Есть пара общеизвестных зрительных эффектов:
Минимальная частота, при которой не заметно мерцание экрана - 80 Гц.
Минимальное время видимости глазом светящегося объекта - 20 мС.
Глаз следит за движущимся объектом -бегущей строкой. Загорается светодиод, и в зрительной памяти 20 мС держится его изображение. Но строка за это время уже сдвинулась- загорелись другие светодиоды. Соответственно появляется след послесвечения, что как минимум как-бы утолщает пиксель-делает его вытянутым по горизонтали.
Далее только для динамической развертки:
Как минимум сдвиг строки и развертка должны быть синхронизированы.
Если производить на один сдвиг пикселя одно обновление, придется критически снижать частоту обновления. Это резко уменьшит срок эксплуатации светодиодов, если в светодиоды дается импульсный ток в n раз больше номинального.
Если увеличивать частоту развертки, и делать несколько обновлений за один сдвиг- увеличатся требования к быстродействию, не добиться эффекта наклонных букв.
Я нашел для себя решение- развертка, похожая на черезстрочную: номер отображаемой строки меняется следующим образом: типа строка вниз, вверх, вверх, вверх, вниз, вверх, вверх, вверх. При этом примере кратность обновления составляет 4. У меня кратность задается параметром функции, соответственно с помощью его управляю изменением скорости бегущей строки. Если нарисовать это на бумаге, получается для одного прохода всей развертки как-бы наклонная пила. Также, если пила вышла в область видимости предыдущего пикселя, заново заствечивается и его состояние.
Красивый эффект наклонных букв, не насилуются светодиоды. Самое интересное, появляются виртуальные пиксели. То есть, допустим, вертикальная черта в один пиксель в режиме бегущей строки состоит из 4 виртуальных пикселей (вспышек). Ширина ее- половина расстояния между светодиодами.
Сложно так объяснить словесно, могу выслать картинку, из которой ясен принцип моей развертки.