Посмотрите у Микрочипа , они в своё время дернули это у Микриума
(который дернул мысль из борландовского BGI, корый дернул ...). А
так у всех все одинаково: контроллеры дисплея имеют команду
"задания окна" - прямоугольной области вывода на экране, размером
от пикселя до "во весь экран". После того, как окно задано, кидаете
данные и они с автоинкрементом заполняют заданную область. примерВ основном гуй бьют на три уровня:
драйвер дисплея (инициализация, ф-ции включения/выключения, задание области вывода);
графические примитивы (граф. фигуры, текст, картинки), структуры текущего контекста (тек. координаты, цвет, размер точки и т.д.);
объекты (кнопки, индикаторы и т.д.).
Ну и ко всему этому драйвера кнопок и/или тачскрина.
Интерфейс SPI/параллельный или ещё какой остается на уровне драйвера. Объектного уровня может и не быть, если не нужен. Многие готовые гуи требуют от драйвера дисплея только функции начальной инициализации и установки области вывода.