Каталог статей
Конструктор сайтов - uCoz
Приветствую Вас, Пробегающий мимо · RSS 21.07.2017, 10:41
Главная » Статьи » Статьи » Микроконтроллеры

Free Simple HX8352 Graphics Library

Free Simple HX8352 Graphics Library





На создание этой простой графической библиотеки меня подвигло нежелание портировать и разбираться со сторонними библиотеками хотя возможности этой библиотеки и намного скромнее, тем не мение данная бесплатная графическая библиотека позволяет легко реализовать множество графических примитивов и на ее основе достаточно легко реализовать
GUI - графический интерфейс пользователя с использованием 32-и разрядных микроконтроллеров STM32 и цветных QVGA дисплеев.




Программный интерфейс приложения (API) графической библиотеки.

Графическая библиотека легко может быть изменена под монохромные индикаторы и многоцветные CSTN/TFT (16, 65тыс. цветов) дисплеи, имеющие параллельный или последовательный интерфейс связи с микроконтроллером. Сейчас реализована поддержка только TFT дисплея с контроллером HX8352, применение такого индикатора с контроллером и графической памятью позволяет минимизировать требования по памяти, быстродействию и числу выводов управляющего микроконтроллера, поэтому, графическим цветным TFT-модулем может управлять даже дешевый контроллер, например STM32F100RB. Поддержка других моделей дисплеев легко реализуема без изменений тела библиотеки, изменения коснутся только уровня драйвера. Библиотека в существующем виде требует до 1Кб ОЗУ и минимум flash памяти.

Библиотека разделена на два уровня:  графические примитивы (Graphics Primitive Layer) и драйвера устройств (Device Driver Layer). Уровень графических примитивов платформонезависим и состоит из реализаций функций отрисовки, таких как линия, прямоугольник, окружность и т.п. Драйвера устройств специфичны для конкретного дисплея и предоставляют основные функции для более высоких уровней библиотеки. Так же библиотека содержит еще два уровня для реализации вывода изображений(созданных с помощью утилиты Bitmap2Code) и уровень работы с текстом ( шрифты конвертируются с помощью утилиты TheDotFactory). Обе утилиты полностью бесплатны и распространяются по лицензии GPL, если же их использование по каким либо причинам нежелательно то оба уровня вывода изображений и текста легко могут быть модифицированы под другие инструменты либо вовсе не использоваться без модификации остальных модулей библиотеки.


Архитектура графической библиотеки приведена на рисунке 1.

  1. Application Layer - пользовательская программа, которая использует графическую библиотеку.
  2. Graphics Primitives Layer - этот уровень реализует простейшие графические объекты (линии, прямоугольники, окружности и т.п.).
  3. Image and Text - этот уровень реализует отрисовку изображений, символов, строк и текста.
  4. Device Display Driver - этот уровень управляет индикатором и зависит от типа применяемого дисплея.
  5. Graphics Display Module - графический дисплей


Рис. 1. Архитектура графической библиотеки



Уровень драйверов устройства

Каждый тип дисплея имеет свои характеристики (интерфейс связи, графический контроллер). Для связи библиотеки с дисплеем определен набор функций - драйвер дисплея. Текущая версия графической библиотеки поддерживает один графический контроллер:

  • Himax HX8352A

однако возможна поддержка и других контроллеров, для этого из всей библиотеки нужно модифицировать лишь функции драйверов устройств. Доступность библиотеки в исходных кодах позволяет осуществить поддержку дисплеев с различными графическими контроллерами.
Программный интерфейс приложения уровня драйверов дисплея используется для сброса дисплея, определения размеров экрана, выделения области, установки текущего цвета и реализации аппаратно-зависимых функций для работы с дисплеем (см. табл. 1.).


Таблица 1. Функции драйвера устройств

Имя функции

Описание



LCD_Init

Инициализация дисплея.

LCD_SetTextColor

Устанавливает текущий цвет отображения текста

LCD_GetTextColor

Возвращает текущий цвет отображения текста

LCD_SetGraficsColor

Устанавливает текущий цвет отображения графики

LCD_GetGraficsColor

Возвращает текущий цвет отображения графики
LCD_SetBackColor
Устанавливает текущий цвет фона
LCD_GetBackColor
Возвращает текущий цвет отображения фона

LCD_PutPixel

Модификация пикселя экрана

LCD_SetCursor

Установка курсора по координатам X,Y

LCD_SetArea

Установить заданную границами область вывода экрана

LCD_SetFullScreen

Установить область вывода в полный экран

LCD_FillScreen

Залить весь экран выбранным цветом

LCD_clear_area

Очистка или заливка области экрана выбранным цветом

LCD_Change_Direction 

Сменить ориентацию дисплея альбом/портрет


Имя функцииОписание


set_LCD_DATAPort_Init 
 Назначение порта/полу-порта под шинну данных LCD 
set_RES_LCD

set_RD_LCD

set_RS_LCD

set_WR_LCD

set_CS_LCD
Назначение управляющих сигналов для контроллера ЖК, легко модифицируются/объединяются в одну функцию.
 



Графические примитивы

Уровень графических примитивов содержит базовые графические функции и «общается» с индикатором посредством драйверов устройств, поэтому функции графических примитивов становятся независимыми от типа применяемого дисплея. 

Таблица 2. Функции уровня графических примитивов

Имя функции

Описание

LCD_DrawPoint

Рисует точку по координатам

LCD_DrawLine

Рисует линию под прямым углом

LCD_DrawObliqueLine 

Рисует произвольную линию по координатам начала и конца

LCD_DrawRect

Рисует прямоугольник по координатам нижний левый угол, ширина, высота.

LCD_DrawFillRect

Рисует закрашенный прямоугольник по координатам нижний левый угол, ширина, высота.

DrawBeveledRectРисует прямоугольник с закругленными углами
DrawFillBeveledRectРисует закрашенный прямоугольник с закругленными углами

LCD_DrawCircle

Рисует окружность с заданным центром и радиусом.




Графическая библиотека поддерживает работу с пользовательскими шрифтами, шрифты могут храниться как массивы в памяти программ в секции const. Графическая библиотека использует представление символов шрифта как отдельные изображения. Высота каждого символа в одном шрифте одинакова, варьируется только его ширина. Таким образом, размер символа «1» меньше чем символа «W». Задание первого и последнего символа используемого шрифта позволяет уменьшить размер памяти, требуемого для хранения знакогенератора. Это легко сделать при генерации нужного шрифта. Как результат, для такого знакогенератора потребуется выделение меньшего размера памяти.

Графической библиотекой могут быть использованы все шрифты Windows. Вместе с библиотекой предлагается использоваться бесплатная программа, которая позволяет конвертировать различные шрифты в массивы данных для использования совместно с библиотекой (см. рис.2.).


Рис. 2. TheDotFactory - Утилита для преобразования шрифтов и графических файлов в С-массивы данных

Как правило, шрифты защищены авторскими правами. Как альтернатива, существуют бесплатные, свободно распространяемые шрифты, часть из которых можно найти по ссылке.




Графическая библиотека так же поддерживает вывод
пользовательских изображений. Изображения
хранятся в памяти с расположением точек слева направо и снизу верх. Для более оптимального использования памяти контроллера все форматы изображений поддерживают сжатие.

Таблица 5. Поддерживаемые форматы изображений

Кодировка

Тип изображения

Описание

1bpp

черно-белое изображение

Каждый байт содержит 8 пикселей (точек), старшему биту соответствует левый пиксель. Цветовая палитра содержит 2 значения.

8bpp

256 оттенков серого 

Каждый байт хранит 1 пиксель.

8bpp

256-и цветные изображения

Каждый байт хранит 1 пиксель.

16bpp

Hi-color Images

Каждые 2 байта (16 бит) хранит один пиксель.

Цвета кодируются в формате 5-6-5:

Bits[15:11] = Красный (RED)

Bits[10:05] = Зеленый (GREEN)

Bits[04:00] = Синий (BLUE)


Для преобразования изображений в массивы данных с сжатием или без, используется бесплатная утилита Bitmap2Code, ее описание и т.д. можно посмотреть здесь.


Рис. 3. Bitmap2Code - Утилита для преобразования шрифтов и графических файлов в С-массивы данных

Пример вывода конвертированного изображения размером 375х178 в формате 1bpp с сжатием:





Практическое использование

Графическая библиотека написана для работы с 32-х разрядными микроконтроллерами STM32. При необходимости, пользовательские шрифты и картинки могут храниться во внешней энергонезависимой памяти. Библиотека разработана для легкой интеграции в разрабатываемое устройство. Использование готовых графических примитивов требует от программиста минимального количества строк кода. Библиотека содержит хорошо документированный API.

Рассмотрим пример применения графической библиотеки. Для начала использования библиотеки требуется создать небольшой код.  Во-первых, в программе должны быть подключены модули библиотеки. Далее нужно назначить управляющие сигналы дисплея соответствующим выводам МК посредством функций set_LCD_DATAPort_Init() и т.д., затем выполнить инициализацию дисплея, вызвав функцию LCD_Init(), в которой производится сброс дисплея, установка курсора в начало координат (положение 0, 0).

/* Функция инициализации выводов дисплея*/
void LCD_PinsInit()
{
  set_LCD_DATAPort_Init(GPIOA, 0);  // Назначаем для шины данных порт GPIOA биты 0-7
 
  set_RES_LCD(GPIOB, 1);        // Назначаем для сигнала сброса дисплея GPIOB вывод P.1
  set_RD_LCD(GPIOC, 4);
  set_RS_LCD(GPIOB, 0);
  set_WR_LCD(GPIOB, 9);
  set_CS_LCD(GPIOC, 5);
}

int main(void)
{

  Global_MCU_Init();   // Инициализация МК, периферия, порты и т.д.

  LCD_PinsInit();        // Инициализация управляющих выводов дисплея
  LCD_Init();             // Инициализация дисплея, установка курсора в позицию X:0, Y:0

  LCD_Change_Direction(0);    // Переключаемся в альбомный режим
 
  LCD_FillScreen(Black);          // Заливаем весь экран черным цветом
 
  LCD_SetTextColor(Green);    // Устанавливаем цвет текста
  LCD_SetBackColor(Black);    // Устанавливаем цвет фона для текста
  LCD_SetGraficsColor(DarkGreen);   // Устанавливаем цвет графики
   
  LCD_PutStrig(140, 200, 0, "PRIMITIVES");       // Печатаем строку по координатам X: 140, Y: 200
 
  DrawBeveledRect(50, 150, 150, 50, 40);          // Рисуем прямоугольник с закругленными углами, координаты центров окружностей X0: 50, Y0: 150
                                                                      // X1: 150, Y1: 50 , радиус скругления равен 40

  DrawFillBeveledRect(50, 75, 75, 50, R, 0, Green);   // Рисуем за крашеный прямоугольник с закругленными углами
   
  LCD_DrawCircle(100, 100, 50);       // Рисуем окружность с центром в X:100, Y:100 и радиусом 50
    
  LCD_SetTextColor(Blue);                // Изменяем цвет текста на синий
  LCD_SetGraficsColor(White);          // И цвет графики на белый

  LCD_PutStrig(200, 40, 0, "DrawObliqueLines");  // Печатаем строку

  LCD_DrawObliqueLine(100, 100, 50, 140);   // Рисуем 3 линии с начальными координатами X:100, Y:100
  LCD_DrawObliqueLine(100, 100, 50, 40);
  LCD_DrawObliqueLine(100, 100, 150, 40);
}

Как видим, нам потребовалось написать минимум кода для создания различных графических примитивов и вывода строк.
Графическая библиотека позволяет осуществлять различные действия с  графическими примитивами или с дисплеем на уровне драйверов.


Примеры практического использования библиотеки на разных ЖК:



   



*Небольшая заметка, изначально библиотека писалась в среде IAR, но затем была перенесена под Keil, и каково же было мое удивление когда работа с дисплеем ускорилась примерно в два раза, код для обеих сред идентичен, почему так происходит не знаю. Я никоим образом не хочу сравнивать эти две среды просто вот такой интересный факт :) Кстати под 8051 silab МК у меня была абсолютно противоположная картина...




Скачать



 Пожалуйста, если у Вас есть какие замечания, предложения по доработки библиотеки и т.п. свяжитесь со мной.

  • Исходные коды библиотеки, проект Keil - HX8352 Graphics Library sourse
  • Скомпилированная библиотека в формат *.LIB для использования в Keil - HX8352 Graphics Library Lib
  • *.h файл для работы с библиотекой (фактически API) - HX8352 Library.h
  •  
  • Тестовый проект с ипользованием библиотеки под STM32VLDISCOVERY - Test HX8352 Graphics Library, подключение дисплея такое же как в этой статье.



  Бесплатные утилиты конвертации изображения и шрифтов для работы с библиотекой:



Категория: Микроконтроллеры | Добавил: LeftRadio (14.08.2011)
Просмотров: 7869 | Комментарии: 3 | Рейтинг: 5.0/1
Всего комментариев: 3
1  
Интересно а подойдет ли эта библиотека HX8352 для дисплея с контроллером HX8347-A?

2  
Не знаю, нужно смотреть в чем их отличия

3  
Хорошая библиотека, спасибо за примеры

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]