156 lines
8.0 KiB
C
156 lines
8.0 KiB
C
#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
|