Часть 1 - Схемотехническое решение
Часть 2 – Программная реализация
Примечание.
Выборки исходного кода, размещенные в тексте описания, использовать в своих проектах не рекомендуется. В конце описания имеется ссылка на архив с исходными кодами.
Изначально в первой версии программного драйвера использовался экстремально быстрый алгоритм прорисовки линий EFLA (Extremely Fast Line Drawing Algorithm). Алгоритм демонстрировал хорошие результаты, и потому не предпринимались какие-либо попытки оптимизации. Однако, как выяснилось позже, алгоритм EFLA оптимален лишь для микроконтроллеров, не поддерживающих инструкцию деления, и было бы лучше, вероятно, применить классический алгоритм Брезенхэма (Bresenham). Автор реализовал алгоритм Брезенхэма с использованием примера кода из англоязычной Википедии (глава Simplification, упрощенный код).
Разработанный демонстрационный код для рисования псевдослучайных линий выполняется в течение фиксированного интервала времени (5 секунд). При использовании дисплея на контроллере ILI9325 в режиме 64 тыс. цветов, портретной ориентации и алгоритма EFLA за 5 секунд прорисовываются 1055 линий. При тех же условиях, но с использованием алгоритма Брезенхэма, количество линий увеличилось до 1110.
Алгоритма Брезенхэма выполняется немного быстрее. Ненамного, но этого достаточно, чтобы задуматься о дополнительной оптимизации кода для библиотеки графических функций. При оптимизации мы должны учитывать несколько основных фактов:
- Все пиксели в одной линии имеют одинаковый цвет.
- TFT панель предусматривает «оконный» режим работы с автоматическим инкрементом по оси X.
- TFT панель допускает независимое изменение позиции по оси X и Y.
Результирующий оптимизированный код с комментариями автора (англ.) представлен в Листинге 2.
Отметим несколько важных моментов. На этапе инициализации мы устанавливаем окно, которое простирается до нижней правой точки TFT панели. Это означает, что в случае, когда необходимо записать одновременно два пикселя по горизонтали, мы можем не использовать операцию перемещения курсора, TFT панель сделает это автоматически. Когда необходимо переместить курсор, мы аккуратно перемещаемся только в требуемом горизонтальном или вертикальном направлении.
Выполнение демонстрационного приложения рисования псевдослучайных линий с такой оптимизацией завершилось результатом в 2060 линий, что говорит о повышении производительности на 85% (Рисунок 11).
![]() |
|
Рисунок 11. | Сравнение средней скорости рисования псевдослучайных линий с использованием различных алгоритмов. |
Теперь, когда мы имеем два режима доступа к контроллеру TFT панели, можно приступить к конфигурированию драйвера.
Дисплеи на контроллере ILI9325
ILI9325 – очень распространенный QVGA контроллер, на нем выполняется большинство TFT панелей, представленных на рынке, включая и те, которые устанавливаются на микроконтроллерные отладочные платы (Рисунок 12).
![]() |
|
Рисунок 12. | TFT панель на контроллере ILI9325. |
Наш программный драйвер обеспечивает поддержку портретного и альбомного режима с 16-битной глубиной цвета (64 тыс. цветов). Функция аппаратной прокрутки изображения поддерживается в обеих ориентациях. Для использования драйвера необходимо в своем проекте подключить заголовочный файл:
#include "Generic16BitILI9325.h"
В драйвере предопределены все поддерживаемые режимы доступа к контроллеру и ориентация TFT панели. Во всех примерах, которые доступны для скачивания в разделе загрузок, определение режима работы выполняется с помощью следующего кода:
typedef ILI9325_Landscape_64K_Gpio16Latch TftPanel; //typedef ILI9325_Portrait_64K_Gpio16Latch TftPanel; //typedef ILI9325_Landscape_64K_Xmem16 TftPanel; //typedef ILI9325_Portrait_64K_Xmem16 TftPanel; //TftPanel *tft=new TftPanel;
Закомментированные строки приведены для справки (первые две строки – определяют GPIO режим работы, вторые две – для режима работы через XMEM интерфейс). Последняя версия библиотеки графических функций (3.0.1) включает в себя набор демонстрационных приложений, которые обязательно пригодятся вам при разработке своих устройств.
Демонстрационное видео работы графической библиотеки и драйвера с дисплеем на контроллере ILI9325 (оптимизированный GPIO интерфейс).
Дисплеи на контроллере ILI9327
Контроллер ILI9327 поддерживает разрешение 432×240 точек, и дисплеи на нем менее распространены (Рисунок 13). Автор использовал панель с разрешением 400×240, 32 пикселя сам драйвер делает невидимыми, другими словами, вы можете их записывать, но на экране ничего не отобразится. Эта особенность обходится в драйвере с помощью класса, выступающего в качестве параметра для драйвера.
![]() |
|
Рисунок 13. | TFT панель с разрешением 400×240 точек на контроллере ILI9327. |
Также обеспечивается поддержка двух режимов доступа, двух режимов ориентации с 16-битной глубиной цвета и аппаратная прокрутка. Для использования драйвера необходимо включить заголовочный файл:
#include "Generic16BitILI9327.h"
Аналогично драйверу ILI9325 определены режимы работы:
typedef ILI9327_400x240_Landscape_64K_Gpio16Latch TftPanel; //typedef ILI9327_400x240_Portrait_64K_Gpio16Latch TftPanel; //typedef ILI9327_400x240_Landscape_64K_Xmem16 TftPanel; //typedef ILI9327_400x240_Portrait_64K_Xmem16 TftPanel; //TftPanel *tft=new TftPanel;
Закомментированные строки приведены для справки (первые две строки – определяют GPIO режим работы, вторые две – для режима работы через XMEM интерфейс). В состав библиотеки входит набор демонстрационных приложений, которые обязательно пригодятся вам при разработке своих устройств.
Демонстрационное видео работы графической библиотеки и драйвера с дисплеем на контроллере ILI9325 (оптимизированный GPIO интерфейс).
Дисплеи на контроллере ILI9481
ILI9481 – малораспространенный HVGA контроллер, поддерживающий разрешение 480×320, интересен, прежде всего, с точки зрения работы драйвера с графикой большего разрешения (Рисунок 14).
![]() |
|
Рисунок 14. | TFT панель с разрешением 480×320 точек на контроллере ILI9481. |
Для использования драйвера необходимо включить заголовочный файл:
#include "Generic16BitILI9481.h"
Далее выбираем один из доступных режимов работы:
typedef ILI9481_Landscape_64K_Gpio16Latch TftPanel; //typedef ILI9481_Portrait_64K_Gpio16Latch TftPanel; //typedef ILI9481_Landscape_64K_Xmem16 TftPanel; //typedef ILI9481_Portrait_64K_Xmem16 TftPanel; //TftPanel *tft=new TftPanel;
Несмотря на высокое разрешение, операции, которые интенсивно используют оптимизированный алгоритм, например очистка экрана и градиентная заливка, выполняются чрезвычайно быстро, о чем свидетельствует демонстрационное видео ниже.
Дисплеи на контроллере HX8347A
HX8347A – QVGA контроллер компании Himax, который довольно часто используется в TFT панелях с разрешением 320×240 (Рисунок 15).
![]() |
|
Рисунок 15. | TFT панель с разрешением 320×240 точек на контроллере HX8347A. |
Для использования драйвера необходимо включить заголовочный файл:
#include "Generic16BitHX8347A.h"
Поддерживаемые режимы работы:
typedef HX8347A_Landscape_64K_Gpio16Latch TftPanel; //typedef HX8347A_Portrait_64K_Gpio16Latch TftPanel; //typedef HX8347A_Landscape_64K_Xmem16 TftPanel; //typedef HX8347A_Portrait_64K_Xmem16 TftPanel; //TftPanel *tft=new TftPanel;
Демонстрационное видео
Загрузки
Библиотека графических функций, драйвер TFT панелей и демонстрационные приложения с исходными кодами – скачать