STM32 и дисплей. Подключение LCD к микроконтроллеру.

Работа с LCD

Читатель нашего блога Михаил (mishadesh) создал отличную библиотеку для STM32 для работы с LCD дисплеем и предложил написать статью для демонстрации ее возможностей. Собственно, сегодня именно об этом и пойдет речь! Разберем, какие реализованы функции, а также в конце статьи будет выложен пример для работы с дисплеем.

Как обычно начнем  с обсуждения железа… А тут на самом деле и не о чем говорить. Как и в первой статье, посвященной работе с дисплеями (ссылка), мы будем использовать отладочную плату Mini STM32. Собственно, подключение дисплея, основные команды для записи данных, последовательность инструкций для инициализации – все это там есть 🙂 Поэтому сейчас переходим сразу к обсуждению библиотеки для работы с графическими дисплеями.

Вот полный список функций с пояснениями:

void LCD_PutPixel(uint16_t x, uint16_t y, uint16_t color);

Функция принимает 3 аргумента – координаты точки (x и y), а также цвет и меняет цвет пикселя, расположенного по указанным координатам.

void LCD_SetOrient(TOrientation orientation);

Следующая функция, как видно из ее названия, меняет ориентацию экрана. Возможно два положения экрана, соответственно два возможных значения параметра orientation:

  • Orientation_Portrait
  • Orientation_Album

Идем дальше:

uint16_t LCD_GetMaxX(void);
uint16_t LCD_GetMaxY(void);

Две похожие функции – одна возвращает максимальное значение координаты по оси x, другая – по оси y. Функции учитывают текущее положение экрана. Переходим к функциям рисования! И первая на очереди:

uint8_t LCD_DrawChar(uint16_t x, uint16_t y, uint8_t c, uint16_t textColor, uint16_t backColor, uint8_t isTransparent);

Функция отрисовывает на графическом дисплее символ, располагая его по переданным в функцию координатам, а также задавая его цвет. Начертание символа соответствует шрифту, определенному в файле font.c (файл идет в составе библиотеки). Из функции LCD_DrawChar() плавно вытекает следующая функция:

void LCD_DrawString(char* s, uint16_t x, uint16_t y, uint16_t color, uint16_t backColor, uint8_t isTransparent);

Тут понятно и без лишних слов 🙂 Функция печатает на дисплее строку текста. Базой для этой функции является предыдущая – LCD_DrawChar(). Помимо символов и текста, конечно же, необходимо иметь возможность нарисовать основные графические примитивы, например линию или круг. Для этого реализовано следующее:

void LCD_drawLine(int x1, int y1, int x2, int y2, uint16_t color);
void LCD_DrawRect(int x1, int y1, int x2, int y2, uint16_t color, uint8_t filled);
void LCD_DrawEllipse(uint16_t X1, uint16_t Y1, uint16_t R, uint16_t color);

Чтобы нарисовать линию, нужно передать в функцию координаты начальной точки, координаты конечной точки, а также нужный цвет. А для прямоугольника – координаты верхнего левого угла и координаты правого нижнего угла (!). Последний параметр filled – определяет, необходимо ли выполнять заливку фигуры. Единица – значит да, фигура будет закрашена выбранным цветом, ноль – будет нарисован только контур фигуры. С этим понятно, осталась только окружность – функция DrawEllipse(). Здесь вместо координат начала и конца (верхнего/нижнего углов) передаем в качестве аргументов центр окружности и радиус.

Ну и напоследок еще одна функция:

void LCD_FillScr(uint16_t color);

Функция позволяет залить экран сплошным цветом. Все перечисленные функции реализованы в файле GUI_DRV.c. Помимо них библиотека включает в себя функции для записи данных в дисплей (LCD_DRIVER.c) а также уже упомянутые шрифты (font.c). Как видите, все четко отсортировано по разным файлам, так что в принципе все очень понятно, поэтому давайте перейдем к практическому примеру!

Вот ссылка на полный проект с примером – LCD Example.

Давайте разбираться! Идем в файл main.c. Не буду приводить полный код функций инициализации периферии и дисплея, все это можно посмотреть непосредственно в файле, либо в предыдущей статье, ссылка на которую была в начале этой статьи 🙂 Функция main():

int main(void)
{
	initPeriph();
	initFSMC();
	initLCD();
	delay(10000);
	LCD_FillScr(0xFFFF);
	delay(100);
	LCD_SetOrient(Orientation_Album);
	delay(100);
	LCD_DrawString("Библиотека для LGDP4532",30,30,0x888F,0x0000,0);
	LCD_DrawRect(100,100,200,200,0x0000,0);
	LCD_DrawRect(120,120,180,180,0xFF00,1);
	LCD_DrawEllipse(150,150,50,0xF000);

	while(1)
	{
	}
}

Начинаем с инициализации, закрашиваем экран белым цветом и устанавливаем альбомную ориентацию экрана. И теперь переходим к отрисовке графики! Выводим на экран строку, а также два прямоугольника и круг. Результат налицо:

STM32 и LCD

Очевидно, что все работает отлично 🙂

Итак, на этом на сегодня заканчиваем, огромное спасибо Михаилу за проделанную работу и приведенные материалы. Вот контакты автора библиотеки:

  • Skype – mishadesh
  • E-Mail – mishadesh@gmail.com

На этом все, спасибо за внимание, до скорых встреч!

Поделиться!

Подписаться
Уведомление о
guest
5 Комментарий
старее
новее большинство голосов
Inline Feedbacks
View all comments
Александр
Александр
5 лет назад

А как вывести на экран целочисленную переменную?

qwas
qwas
5 лет назад

отрисовать?

Юджин
Юджин
3 лет назад

Знаки на дисплей выводятся как битмап-изображения.
К каждому ASCII карактеру привязывается массив с закодированой картинкой, после пишутся функции вывода, по очереди отрисовывающие битмапы слева направо… Ну или как там у вас, а то тусил как-то на иранском форуме… 😀

Alfis
Alfis
1 год назад

Вопрос? При подключении сенсора там 4 пина к периферии,
выводы ставить Pin GPIO_Output или их нужно подтянуть к питанию (как пользовательскую кнопку) а выводы ставить Pin GPIO_Input чтобы регистрировать нажатие на сенсор?

Присоединяйтесь!

Profile Profile Profile Profile Profile
Vkontakte
Twitter

Язык сайта

Июль 2020
Пн Вт Ср Чт Пт Сб Вс
« Июн    
 12345
6789101112
13141516171819
20212223242526
2728293031  

© 2013-2020 MicroTechnics.ru