Files
DS_ST7789V/Inc/DS_ST7789V.h

156 lines
8.0 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#ifndef DS_ST7789V_H
#define DS_ST7789V_H
#include <stdint.h>
#ifdef STM32G030xx
#include "stm32g0xx_hal.h"
#endif
#ifdef STM32G0B1xx
#include "stm32g0xx_hal.h"
#endif
#ifdef STM32F030xx
#include "stm32f0xx_hal.h"
#endif
/* Параметры дисплея */
#define DS_ST7789V_WIDTH 240
#define DS_ST7789V_HEIGHT 320
/* Основные команды контроллера ST7789V */
#define ST7789V_CMD_NOP 0x00
#define ST7789V_CMD_SWRESET 0x01
#define ST7789V_CMD_SLPOUT 0x11
#define ST7789V_CMD_INVOFF 0x20
#define ST7789V_CMD_INVON 0x21
#define ST7789V_CMD_DISPOFF 0x28
#define ST7789V_CMD_DISPON 0x29
#define ST7789V_CMD_CASET 0x2A
#define ST7789V_CMD_RASET 0x2B
#define ST7789V_CMD_RAMWR 0x2C
#define ST7789V_CMD_MADCTL 0x36
#define ST7789V_CMD_COLMOD 0x3A
/* Варианты ориентации экрана */
typedef enum DS_ST7789V_Orientation{
DS_ST7789V_ORIENTATION_PORTRAIT = 0,
DS_ST7789V_ORIENTATION_LANDSCAPE,
DS_ST7789V_ORIENTATION_PORTRAIT_REV,
DS_ST7789V_ORIENTATION_LANDSCAPE_REV
} DS_ST7789V_Orientation;
/* Структура конфигурации пинов (аналогично DS_Button) */
typedef struct {
GPIO_TypeDef *Port;
uint16_t Pin;
} DS_ST7789V_Pin_t;
/* Главная управляющая структура дисплея */
typedef struct DS_ST7789V {
SPI_HandleTypeDef *hspi; // Указатель на аппаратный SPI
DS_ST7789V_Pin_t CS; // Пин выбора чипа
DS_ST7789V_Pin_t DC; // Пин выбор Команда/Данные
DS_ST7789V_Pin_t RES; // Пин аппаратного сброса
uint16_t Width; // Текущая ширина с учетом поворота
uint16_t Height; // Текущая высота с учетом поворота
DS_ST7789V_Orientation Orientation; // Текущая ориентация
} DS_ST7789V;
/**@brief Инициализация дескриптора дисплея и передача начальных команд
@param lcd Указатель на структуру дисплея
@param hspi Указатель на сгенерированный CubeMX интерфейс SPI*/
void DS_ST7789V_Init(DS_ST7789V *lcd, SPI_HandleTypeDef *hspi,
GPIO_TypeDef *cs_port, uint16_t cs_pin,
GPIO_TypeDef *dc_port, uint16_t dc_pin,
GPIO_TypeDef *res_port, uint16_t res_pin);
/**@brief Установка ориентации экрана*/
void DS_ST7789V_SetOrientation(DS_ST7789V *lcd,
DS_ST7789V_Orientation orientation);
/**@brief Заливка экрана или выделенной области цветом (RGB565)*/
void DS_ST7789V_FillRect(DS_ST7789V *lcd, uint16_t x, uint16_t y, uint16_t w,
uint16_t h, uint16_t color);
/**@brief Низкоуровневые функции отправки (могут использоваться для кастомных
* оптимизаций)*/
void DS_ST7789V_WriteCommand(DS_ST7789V *lcd, uint8_t cmd);
void DS_ST7789V_WriteData(DS_ST7789V *lcd, uint8_t *data, uint16_t size);
/**
* @brief Отрисовка одиночного пикселя заданным цветом (RGB565)
* @param lcd Указатель на структуру дисплея
* @param x Координата по горизонтали
* @param y Координата по вертикали
* @param color Цвет пикселя в формате 16-бит RGB565
*/
void DS_ST7789V_DrawPixel(DS_ST7789V *lcd, uint16_t x, uint16_t y, uint16_t color);
void DS_ST7789V_DrawHLine(DS_ST7789V *lcd, uint16_t x, uint16_t y, uint16_t length, uint16_t color);
void DS_ST7789V_DrawVLine(DS_ST7789V *lcd, uint16_t x, uint16_t y, uint16_t length, uint16_t color);
/* Компактный растровый шрифт 5x7 (95 символов ASCII, начиная с пробела 0x20) */
static const uint8_t DS_Font5x7[] = {
0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x5F,0x00,0x00, 0x00,0x07,0x00,0x07,0x00, 0x14,0x7F,0x14,0x7F,0x14,
0x24,0x2A,0x7F,0x2A,0x12, 0x23,0x13,0x08,0x64,0x62, 0x36,0x49,0x55,0x22,0x50, 0x00,0x05,0x03,0x00,0x00,
0x00,0x1C,0x22,0x41,0x00, 0x00,0x41,0x22,0x1C,0x00, 0x08,0x2A,0x1C,0x2A,0x08, 0x08,0x08,0x3E,0x08,0x08,
0x00,0x50,0x30,0x00,0x00, 0x08,0x08,0x08,0x08,0x08, 0x00,0x60,0x60,0x00,0x00, 0x20,0x10,0x08,0x04,0x02,
0x3E,0x51,0x49,0x45,0x3E, 0x00,0x42,0x7F,0x40,0x00, 0x42,0x61,0x51,0x49,0x46, 0x21,0x41,0x45,0x4B,0x31,
0x18,0x14,0x12,0x7F,0x10, 0x27,0x45,0x45,0x45,0x39, 0x3C,0x4A,0x49,0x49,0x30, 0x01,0x71,0x09,0x05,0x03,
0x36,0x49,0x49,0x49,0x36, 0x06,0x49,0x49,0x29,0x1E, 0x00,0x36,0x36,0x00,0x00, 0x00,0x56,0x36,0x00,0x00,
0x00,0x08,0x14,0x22,0x41, 0x14,0x14,0x14,0x14,0x14, 0x41,0x22,0x14,0x08,0x00, 0x02,0x01,0x51,0x09,0x06,
0x32,0x49,0x79,0x41,0x3E, 0x7E,0x11,0x11,0x11,0x7E, 0x7F,0x49,0x49,0x49,0x36, 0x3E,0x41,0x41,0x41,0x22,
0x7F,0x41,0x41,0x22,0x1C, 0x7F,0x49,0x49,0x49,0x41, 0x7F,0x09,0x09,0x09,0x01, 0x3E,0x41,0x41,0x51,0x72,
0x7F,0x08,0x08,0x08,0x7F, 0x00,0x41,0x7F,0x41,0x00, 0x20,0x40,0x41,0x3F,0x01, 0x7F,0x08,0x14,0x22,0x41,
0x7F,0x40,0x40,0x40,0x40, 0x7F,0x02,0x0C,0x02,0x7F, 0x7F,0x04,0x08,0x10,0x7F, 0x3E,0x41,0x41,0x41,0x3E,
0x7F,0x09,0x09,0x09,0x06, 0x3E,0x41,0x51,0x21,0x5E, 0x7F,0x09,0x19,0x29,0x46, 0x46,0x49,0x49,0x49,0x31,
0x01,0x01,0x7F,0x01,0x01, 0x3F,0x40,0x40,0x40,0x3F, 0x1F,0x20,0x40,0x20,0x1F, 0x3F,0x40,0x38,0x40,0x3F,
0x63,0x14,0x08,0x14,0x63, 0x03,0x04,0x78,0x04,0x03, 0x61,0x51,0x49,0x45,0x43, 0x00,0x7F,0x41,0x41,0x00,
0x02,0x04,0x08,0x10,0x20, 0x00,0x41,0x41,0x7F,0x00, 0x04,0x02,0x01,0x02,0x04, 0x40,0x40,0x40,0x40,0x40,
0x00,0x01,0x02,0x04,0x00, 0x20,0x54,0x54,0x54,0x78, 0x7F,0x48,0x44,0x44,0x38, 0x38,0x44,0x44,0x44,0x20,
0x38,0x44,0x44,0x48,0x7F, 0x38,0x54,0x54,0x54,0x18, 0x08,0x7E,0x09,0x01,0x02, 0x98,0xA4,0xA4,0xA4,0x7C,
0x7F,0x08,0x04,0x04,0x38, 0x00,0x44,0x7D,0x40,0x00, 0x20,0x40,0x44,0x3D,0x00, 0x7F,0x10,0x28,0x44,0x00,
0x00,0x41,0x7F,0x40,0x00, 0x7C,0x04,0x18,0x04,0x78, 0x7C,0x08,0x04,0x04,0x78, 0x38,0x44,0x44,0x44,0x38,
0xFC,0x24,0x24,0x24,0x18, 0x18,0x24,0x24,0x24,0xFC, 0x7C,0x08,0x04,0x04,0x08, 0x48,0x54,0x54,0x54,0x20,
0x04,0x3F,0x44,0x40,0x20, 0x3C,0x40,0x40,0x20,0x7C, 0x1C,0x20,0x40,0x20,0x1C, 0x3C,0x40,0x30,0x40,0x3C,
0x44,0x28,0x10,0x28,0x44, 0x4C,0x50,0x50,0x50,0x3C, 0x44,0x64,0x54,0x4C,0x44, 0x00,0x08,0x36,0x41,0x00,
0x00,0x00,0x77,0x00,0x00, 0x00,0x41,0x36,0x08,0x00, 0x08,0x08,0x2A,0x1C,0x08
};
/**
* @brief Отрисовка одного символа текста с масштабированием
*/
void DS_ST7789V_DrawChar(DS_ST7789V *lcd, uint16_t x, uint16_t y, char ch, uint16_t color, uint16_t bg_color, uint8_t scale);
/**
* @brief Отрисовка строки текста с масштабированием
*/
void DS_ST7789V_DrawString(DS_ST7789V *lcd, uint16_t x, uint16_t y, const char *str, uint16_t color, uint16_t bg_color, uint8_t scale);
/**
* @brief Вывод целого числа на дисплей
*/
void DS_ST7789V_DrawInt(DS_ST7789V *lcd, uint16_t x, uint16_t y, int32_t num, uint16_t color, uint16_t bg_color, uint8_t scale);
/**
* @brief Вывод числа с плавающей точкой (float) на дисплей
* @param decimals Количество знаков после запятой (обычно 1 или 2)
*/
void DS_ST7789V_DrawFloat(DS_ST7789V *lcd, uint16_t x, uint16_t y, float num, uint8_t decimals, uint16_t color, uint16_t bg_color, uint8_t scale);
/**
* @brief Прозрачная отрисовка одного символа текста с масштабированием
*/
void DS_ST7789V_DrawCharTransparent(DS_ST7789V *lcd, uint16_t x, uint16_t y, char ch, uint16_t color, uint8_t scale);
/**
* @brief Прозрачная отрисовка строки текста с масштабированием
*/
void DS_ST7789V_DrawStringTransparent(DS_ST7789V *lcd, uint16_t x, uint16_t y, const char *str, uint16_t color, uint8_t scale);
#endif // DS_ST7789V_H