Те, кто сталкивался в своих разработках с необходимостью вывода большого количества текста на экран дисплея, знает, как медленно это происходит, даже если обмен с видеоконтроллером идет по параллельной шине.
У видеоконтроллера RA8875 есть возможность подключить внешнее EEPROM со шрифтами. Информацию об этих EEPROM можно посмотреть на Github страничке xlatb. Управляющему микроконтроллеру достаточно переключить RA8875 в текстовой режим и отправить текст, вывод этого текста происходит практически мгновенно.
По этому видео вы можете почувствовать разницу в скорости между программным выводом шрифта и использованием шрифта из EEPROM. При сравнении следует учесть, что микроконтроллер работает на частоте 50МГц. Видеоконтроллер подключен по параллельной 8 битной шине и обмен идет как с ячейкой памяти, никакого ногодрыга, чистое hardware. Замечу также, что микроконтроллер ничем, кроме вывода на дисплей не занимается.
Так как мне хотелось иметь возможность загружать свои шрифты, я решил подключить к видеоконтроллеру RA8875 EEPROM W25Q32 записав в неё созданные мной шрифты. В datasheet ER3304-1 есть информация, какие шрифты и какую область занимают.
Я выбрал шесть областей для ASCII кодировки по 96 символов каждая, высотой 16, 24 и 32 пикселя. В ER3304-1 загружены Arial и Times шрифты, так как символов всего 96, я разместил в области Arial английские буквы, а в области для Times русские. Итого получилось 3 полноценных шрифта, высотой 16, 24 и 32 пикселя. Эти шрифты «proportional adjusted», что означает, что каждый символ в EEPROM занимает 34, 74 и 130 байт соответственно, (это позволяет контроллеру просто вычислять , где в EEPROM находится каждый символ). Но при выводе на экран первые два байта каждого символа указывают сколько бит в ширину будет выводится, то есть, если первые два байта 0x00, 0x0C то в ширину будет выведено 12 пикселей, не смотря на то, что ширина символа например 16 бит. Шрифт должен быть представлен в EEPROM таким образом:
Первые два байта - ширина символа в пикселях, затем сам символ. Итого получается, например, для 16 пиксельного шрифта 32+2=34 байта.
Шрифт нарисован в программе BitFontCreator и экспортирован в файл ассемблера. Для преобразования этих данных в HEX файл с размещением шрифтов по определенным адресам была написана консольная программа на Python. Сильно не пинайте за стиль, я понимаю, что он не соответствует стандартам. Также в этом файле можно указать символы, которые надо скопировать из одного места кодовой таблицы в другое. Это может понадобиться, для того чтобы выводя текст русским шрифтом, не переключаться на английский для вывода цифр.
Конвертация в файл ассемблера происходит несколько кривовато, зачем-то добавлены лишние запятые, но этот баг я учел в программе создания hex файла.
При создании шрифта необходимо сдвигать изображение символа влево, для того чтобы можно было обрезать пустое пространство, задав необходимую ширину символа в пикселях.
На Github помимо шрифтов, готовой прошивки и утилиты для создания hex файла из asm размещена также схема и печатная плата модуля дисплея. Данный модуль создавался для eZ80f91.
Dron007
А скачущие "p", "q", "ц", "у" и все элементы с нижней выступающей частью (не помню как это правильно называется), это какое-то непреодолимое техническое ограничение или просто так проще было? Выглядит ужасно, если честно. Стив Джобс наверное в гробу переворачивается.
Solgo Автор
Выхода два, уменьшить заглавные буквы, что даст возможность сдвинуть верхний уровень строчных букв выше или использовать битовые матрицы с пропорцией 1/2 (ширина/высота).
Например:
Но тут заглавная буква W выглядит куцо. Шрифт при ограниченных ресурсах — это компромисс, можно рисовать текст как графику и это будет медленно, но красиво. Если пытаться вписаться в битовые матрицы, то это будет выбор между общим размером букв и сдвигом некоторых букв типа q,p,y относительно горизонтальной оси.
Dron007
Но 12 на 24 это не такие уж и ограниченные ресурсы. В терминале Windows 7 (FAR) много лет работаю со шрифтом 10x18 и он выглядит очень даже хорошо. 2 пикселя снизу хватает на выносные элементы.
На картинке сверху чуть лучше, но что-то явно не то с заглавной T. R и S имеют разное основание. k и l тоже скачут.
Solgo Автор
Согласен, но тема поста не про разработку шрифта. Я сделал эти шрифты, чтобы показать возможность использования собственных внешних шрифтов с RA8875, и если честно, это отняло очень много времени. До того, как я написал программу на Python для создания hex файла, ручная компиляция прошивки EEPROM тоже было делом очень не быстрым.