ST7796屏幕驱动程序(STM32-SPI)
测试环境
编辑器:CLion、Stm32CubeMX
驱动库:HAL库
系统:MacOs
硬件: STM32F103C8T6
使用硬件SPI驱动
代码不上传了,直接在下面贴出。如果有需要使用,请直接复制粘贴即可
C代码
ST7796.h
#ifndef CCY_PTCHOT_ST7796_H
#define CCY_PTCHOT_ST7796_H
#include "main.h"
#include "delay.h"
#include "spi.h"
#define LCD_CS_PORT TFT_CS_GPIO_Port
#define LCD_CS_PIN TFT_CS_Pin
#define LCD_RST_PORT TFT_RST_GPIO_Port
#define LCD_RST_PIN TFT_RST_Pin
#define LCD_DC_PORT TFT_DC_GPIO_Port
#define LCD_DC_PIN TFT_DC_Pin
#define LCD_RST_CLR HAL_GPIO_WritePin(LCD_RST_PORT,LCD_RST_PIN,GPIO_PIN_RESET)
#define LCD_RST_SET HAL_GPIO_WritePin(LCD_RST_PORT,LCD_RST_PIN,GPIO_PIN_SET)
#define LCD_CS_CLR HAL_GPIO_WritePin(LCD_CS_PORT,LCD_CS_PIN,GPIO_PIN_RESET)
#define LCD_CS_SET HAL_GPIO_WritePin(LCD_CS_PORT,LCD_CS_PIN,GPIO_PIN_SET)
#define LCD_DC_CLR HAL_GPIO_WritePin(LCD_DC_PORT,LCD_DC_PIN,GPIO_PIN_RESET)
#define LCD_DC_SET HAL_GPIO_WritePin(LCD_DC_PORT,LCD_DC_PIN,GPIO_PIN_SET)
#define LCD_SPI hspi1 //SPI定义
#define LCD_W 320 //宽度
#define LCD_H 360 //高度
#define LCD_DIRECTION 1 //方向
// Color definitions
#define LCD_BLACK 0x0000
#define LCD_BLUE 0x001F
#define LCD_RED 0xF800
#define LCD_GREEN 0x07E0
#define LCD_CYAN 0x07FF
#define LCD_MAGENTA 0xF81F
#define LCD_YELLOW 0xFFE0
#define LCD_WHITE 0xFFFF
#define LCD_COLOR565(r, g, b) (((r & 0xF8) << 8) | ((g & 0xFC) << 3) | ((b & 0xF8) >> 3))
#define LCD_INVOFF 0x20 //颜色反转
#define LCD_INVON 0x21 //颜色反转
void ST7796S_LcdDirection(uint8_t direction);
void ST7796S_LcdInit(void);
/*清屏*/
void LCD_Clear(u16 Color);
void LCD_DrawPoint(u16 x, u16 y);
void LCD_DrawPixel(u16 x, u16 y, u16 color);
void LCD_FillRectangle(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color);
void LCD_DrawCharS(int16_t x, int16_t y, char c, int16_t textColor, int16_t bgColor, uint8_t size);
uint32_t LCD_DrawString(uint16_t x, uint16_t y, char *pt, int16_t textColor);
void LCD_InvertColors(int invert);
static const uint8_t Font[] = {
0x00, 0x00, 0x00, 0x00, 0x00,
0x3E, 0x5B, 0x4F, 0x5B, 0x3E,
0x3E, 0x6B, 0x4F, 0x6B, 0x3E,
0x1C, 0x3E, 0x7C, 0x3E, 0x1C,
0x18, 0x3C, 0x7E, 0x3C, 0x18,
0x1C, 0x57, 0x7D, 0x57, 0x1C,
0x1C, 0x5E, 0x7F, 0x5E, 0x1C,
0x00, 0x18, 0x3C, 0x18, 0x00,
0xFF, 0xE7, 0xC3, 0xE7, 0xFF,
0x00, 0x18, 0x24, 0x18, 0x00,
0xFF, 0xE7, 0xDB, 0xE7, 0xFF,
0x30, 0x48, 0x3A, 0x06, 0x0E,
0x26, 0x29, 0x79, 0x29, 0x26,
0x40, 0x7F, 0x05, 0x05, 0x07,
0x40, 0x7F, 0x05, 0x25, 0x3F,
0x5A, 0x3C, 0xE7, 0x3C, 0x5A,
0x7F, 0x3E, 0x1C, 0x1C, 0x08,
0x08, 0x1C, 0x1C, 0x3E, 0x7F,
0x14, 0x22, 0x7F, 0x22, 0x14,
0x5F, 0x5F, 0x00, 0x5F, 0x5F,
0x06, 0x09, 0x7F, 0x01, 0x7F,
0x00, 0x66, 0x89, 0x95, 0x6A,
0x60, 0x60, 0x60, 0x60, 0x60,
0x94, 0xA2, 0xFF, 0xA2, 0x94,
0x08, 0x04, 0x7E, 0x04, 0x08,
0x10, 0x20, 0x7E, 0x20, 0x10,
0x08, 0x08, 0x2A, 0x1C, 0x08,
0x08, 0x1C, 0x2A, 0x08, 0x08,
0x1E, 0x10, 0x10, 0x10, 0x10,
0x0C, 0x1E, 0x0C, 0x1E, 0x0C,
0x30, 0x38, 0x3E, 0x38, 0x30,
0x06, 0x0E, 0x3E, 0x0E, 0x06,
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, 0x56, 0x20, 0x50,
0x00, 0x08, 0x07, 0x03, 0x00,
0x00, 0x1C, 0x22, 0x41, 0x00,
0x00, 0x41, 0x22, 0x1C, 0x00,
0x2A, 0x1C, 0x7F, 0x1C, 0x2A,
0x08, 0x08, 0x3E, 0x08, 0x08,
0x00, 0x80, 0x70, 0x30, 0x00,
0x08, 0x08, 0x08, 0x08, 0x08,
0x00, 0x00, 0x60, 0x60, 0x00,
0x20, 0x10, 0x08, 0x04, 0x02,
0x3E, 0x51, 0x49, 0x45, 0x3E, // 0
0x00, 0x42, 0x7F, 0x40, 0x00, // 1
0x72, 0x49, 0x49, 0x49, 0x46, // 2
0x21, 0x41, 0x49, 0x4D, 0x33, // 3
0x18, 0x14, 0x12, 0x7F, 0x10, // 4
0x27, 0x45, 0x45, 0x45, 0x39, // 5
0x3C, 0x4A, 0x49, 0x49, 0x31, // 6
0x41, 0x21, 0x11, 0x09, 0x07, // 7
0x36, 0x49, 0x49, 0x49, 0x36, // 8
0x46, 0x49, 0x49, 0x29, 0x1E, // 9
0x00, 0x00, 0x14, 0x00, 0x00,
0x00, 0x40, 0x34, 0x00, 0x00,
0x00, 0x08, 0x14, 0x22, 0x41,
0x14, 0x14, 0x14, 0x14, 0x14,
0x00, 0x41, 0x22, 0x14, 0x08,
0x02, 0x01, 0x59, 0x09, 0x06,
0x3E, 0x41, 0x5D, 0x59, 0x4E,
0x7C, 0x12, 0x11, 0x12, 0x7C, // A
0x7F, 0x49, 0x49, 0x49, 0x36, // B
0x3E, 0x41, 0x41, 0x41, 0x22, // C
0x7F, 0x41, 0x41, 0x41, 0x3E, // D
0x7F, 0x49, 0x49, 0x49, 0x41, // E
0x7F, 0x09, 0x09, 0x09, 0x01, // F
0x3E, 0x41, 0x41, 0x51, 0x73, // G
0x7F, 0x08, 0x08, 0x08, 0x7F, // H
0x00, 0x41, 0x7F, 0x41, 0x00, // I
0x20, 0x40, 0x41, 0x3F, 0x01, // J
0x7F, 0x08, 0x14, 0x22, 0x41, // K
0x7F, 0x40, 0x40, 0x40, 0x40, // L
0x7F, 0x02, 0x1C, 0x02, 0x7F, // M
0x7F, 0x04, 0x08, 0x10, 0x7F, // N
0x3E, 0x41, 0x41, 0x41, 0x3E, // O
0x7F, 0x09, 0x09, 0x09, 0x06, // P
0x3E, 0x41, 0x51, 0x21, 0x5E, // Q
0x7F, 0x09, 0x19, 0x29, 0x46, // R
0x26, 0x49, 0x49, 0x49, 0x32, // S
0x03, 0x01, 0x7F, 0x01, 0x03, // T
0x3F, 0x40, 0x40, 0x40, 0x3F, // U
0x1F, 0x20, 0x40, 0x20, 0x1F, // V
0x3F, 0x40, 0x38, 0x40, 0x3F, // W
0x63, 0x14, 0x08, 0x14, 0x63, // X
0x03, 0x04, 0x78, 0x04, 0x03, // Y
0x61, 0x59, 0x49, 0x4D, 0x43, // Z
0x00, 0x7F, 0x41, 0x41, 0x41,
0x02, 0x04, 0x08, 0x10, 0x20,
0x00, 0x41, 0x41, 0x41, 0x7F,
0x04, 0x02, 0x01, 0x02, 0x04,
0x40, 0x40, 0x40, 0x40, 0x40,
0x00, 0x03, 0x07, 0x08, 0x00,
0x20, 0x54, 0x54, 0x78, 0x40, // a
0x7F, 0x28, 0x44, 0x44, 0x38, // b
0x38, 0x44, 0x44, 0x44, 0x28, // c
0x38, 0x44, 0x44, 0x28, 0x7F, // d
0x38, 0x54, 0x54, 0x54, 0x18, // e
0x00, 0x08, 0x7E, 0x09, 0x02, // f
0x18, 0xA4, 0xA4, 0x9C, 0x78, // g
0x7F, 0x08, 0x04, 0x04, 0x78, // h
0x00, 0x44, 0x7D, 0x40, 0x00, // i
0x20, 0x40, 0x40, 0x3D, 0x00, // j
0x7F, 0x10, 0x28, 0x44, 0x00, // k
0x00, 0x41, 0x7F, 0x40, 0x00, // l
0x7C, 0x04, 0x78, 0x04, 0x78, // m
0x7C, 0x08, 0x04, 0x04, 0x78, // n
0x38, 0x44, 0x44, 0x44, 0x38, // o
0xFC, 0x18, 0x24, 0x24, 0x18, // p
0x18, 0x24, 0x24, 0x18, 0xFC, // q
0x7C, 0x08, 0x04, 0x04, 0x08, // r
0x48, 0x54, 0x54, 0x54, 0x24, // s
0x04, 0x04, 0x3F, 0x44, 0x24, // t
0x3C, 0x40, 0x40, 0x20, 0x7C, // u
0x1C, 0x20, 0x40, 0x20, 0x1C, // v
0x3C, 0x40, 0x30, 0x40, 0x3C, // w
0x44, 0x28, 0x10, 0x28, 0x44, // x
0x4C, 0x90, 0x90, 0x90, 0x7C, // y
0x44, 0x64, 0x54, 0x4C, 0x44, // z
0x00, 0x08, 0x36, 0x41, 0x00,
0x00, 0x00, 0x77, 0x00, 0x00,
0x00, 0x41, 0x36, 0x08, 0x00,
0x02, 0x01, 0x02, 0x04, 0x02,
0x3C, 0x26, 0x23, 0x26, 0x3C,
0x1E, 0xA1, 0xA1, 0x61, 0x12,
0x3A, 0x40, 0x40, 0x20, 0x7A,
0x38, 0x54, 0x54, 0x55, 0x59,
0x21, 0x55, 0x55, 0x79, 0x41,
0x21, 0x54, 0x54, 0x78, 0x41,
0x21, 0x55, 0x54, 0x78, 0x40,
0x20, 0x54, 0x55, 0x79, 0x40,
0x0C, 0x1E, 0x52, 0x72, 0x12,
0x39, 0x55, 0x55, 0x55, 0x59,
0x39, 0x54, 0x54, 0x54, 0x59,
0x39, 0x55, 0x54, 0x54, 0x58,
0x00, 0x00, 0x45, 0x7C, 0x41,
0x00, 0x02, 0x45, 0x7D, 0x42,
0x00, 0x01, 0x45, 0x7C, 0x40,
0xF0, 0x29, 0x24, 0x29, 0xF0,
0xF0, 0x28, 0x25, 0x28, 0xF0,
0x7C, 0x54, 0x55, 0x45, 0x00,
0x20, 0x54, 0x54, 0x7C, 0x54,
0x7C, 0x0A, 0x09, 0x7F, 0x49,
0x32, 0x49, 0x49, 0x49, 0x32,
0x32, 0x48, 0x48, 0x48, 0x32,
0x32, 0x4A, 0x48, 0x48, 0x30,
0x3A, 0x41, 0x41, 0x21, 0x7A,
0x3A, 0x42, 0x40, 0x20, 0x78,
0x00, 0x9D, 0xA0, 0xA0, 0x7D,
0x39, 0x44, 0x44, 0x44, 0x39,
0x3D, 0x40, 0x40, 0x40, 0x3D,
0x3C, 0x24, 0xFF, 0x24, 0x24,
0x48, 0x7E, 0x49, 0x43, 0x66,
0x2B, 0x2F, 0xFC, 0x2F, 0x2B,
0xFF, 0x09, 0x29, 0xF6, 0x20,
0xC0, 0x88, 0x7E, 0x09, 0x03,
0x20, 0x54, 0x54, 0x79, 0x41,
0x00, 0x00, 0x44, 0x7D, 0x41,
0x30, 0x48, 0x48, 0x4A, 0x32,
0x38, 0x40, 0x40, 0x22, 0x7A,
0x00, 0x7A, 0x0A, 0x0A, 0x72,
0x7D, 0x0D, 0x19, 0x31, 0x7D,
0x26, 0x29, 0x29, 0x2F, 0x28,
0x26, 0x29, 0x29, 0x29, 0x26,
0x30, 0x48, 0x4D, 0x40, 0x20,
0x38, 0x08, 0x08, 0x08, 0x08,
0x08, 0x08, 0x08, 0x08, 0x38,
0x2F, 0x10, 0xC8, 0xAC, 0xBA,
0x2F, 0x10, 0x28, 0x34, 0xFA,
0x00, 0x00, 0x7B, 0x00, 0x00,
0x08, 0x14, 0x2A, 0x14, 0x22,
0x22, 0x14, 0x2A, 0x14, 0x08,
0xAA, 0x00, 0x55, 0x00, 0xAA,
0xAA, 0x55, 0xAA, 0x55, 0xAA,
0x00, 0x00, 0x00, 0xFF, 0x00,
0x10, 0x10, 0x10, 0xFF, 0x00,
0x14, 0x14, 0x14, 0xFF, 0x00,
0x10, 0x10, 0xFF, 0x00, 0xFF,
0x10, 0x10, 0xF0, 0x10, 0xF0,
0x14, 0x14, 0x14, 0xFC, 0x00,
0x14, 0x14, 0xF7, 0x00, 0xFF,
0x00, 0x00, 0xFF, 0x00, 0xFF,
0x14, 0x14, 0xF4, 0x04, 0xFC,
0x14, 0x14, 0x17, 0x10, 0x1F,
0x10, 0x10, 0x1F, 0x10, 0x1F,
0x14, 0x14, 0x14, 0x1F, 0x00,
0x10, 0x10, 0x10, 0xF0, 0x00,
0x00, 0x00, 0x00, 0x1F, 0x10,
0x10, 0x10, 0x10, 0x1F, 0x10,
0x10, 0x10, 0x10, 0xF0, 0x10,
0x00, 0x00, 0x00, 0xFF, 0x10,
0x10, 0x10, 0x10, 0x10, 0x10,
0x10, 0x10, 0x10, 0xFF, 0x10,
0x00, 0x00, 0x00, 0xFF, 0x14,
0x00, 0x00, 0xFF, 0x00, 0xFF,
0x00, 0x00, 0x1F, 0x10, 0x17,
0x00, 0x00, 0xFC, 0x04, 0xF4,
0x14, 0x14, 0x17, 0x10, 0x17,
0x14, 0x14, 0xF4, 0x04, 0xF4,
0x00, 0x00, 0xFF, 0x00, 0xF7,
0x14, 0x14, 0x14, 0x14, 0x14,
0x14, 0x14, 0xF7, 0x00, 0xF7,
0x14, 0x14, 0x14, 0x17, 0x14,
0x10, 0x10, 0x1F, 0x10, 0x1F,
0x14, 0x14, 0x14, 0xF4, 0x14,
0x10, 0x10, 0xF0, 0x10, 0xF0,
0x00, 0x00, 0x1F, 0x10, 0x1F,
0x00, 0x00, 0x00, 0x1F, 0x14,
0x00, 0x00, 0x00, 0xFC, 0x14,
0x00, 0x00, 0xF0, 0x10, 0xF0,
0x10, 0x10, 0xFF, 0x10, 0xFF,
0x14, 0x14, 0x14, 0xFF, 0x14,
0x10, 0x10, 0x10, 0x1F, 0x00,
0x00, 0x00, 0x00, 0xF0, 0x10,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
0xFF, 0xFF, 0xFF, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFF, 0xFF,
0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
0x38, 0x44, 0x44, 0x38, 0x44,
0x7C, 0x2A, 0x2A, 0x3E, 0x14,
0x7E, 0x02, 0x02, 0x06, 0x06,
0x02, 0x7E, 0x02, 0x7E, 0x02,
0x63, 0x55, 0x49, 0x41, 0x63,
0x38, 0x44, 0x44, 0x3C, 0x04,
0x40, 0x7E, 0x20, 0x1E, 0x20,
0x06, 0x02, 0x7E, 0x02, 0x02,
0x99, 0xA5, 0xE7, 0xA5, 0x99,
0x1C, 0x2A, 0x49, 0x2A, 0x1C,
0x4C, 0x72, 0x01, 0x72, 0x4C,
0x30, 0x4A, 0x4D, 0x4D, 0x30,
0x30, 0x48, 0x78, 0x48, 0x30,
0xBC, 0x62, 0x5A, 0x46, 0x3D,
0x3E, 0x49, 0x49, 0x49, 0x00,
0x7E, 0x01, 0x01, 0x01, 0x7E,
0x2A, 0x2A, 0x2A, 0x2A, 0x2A,
0x44, 0x44, 0x5F, 0x44, 0x44,
0x40, 0x51, 0x4A, 0x44, 0x40,
0x40, 0x44, 0x4A, 0x51, 0x40,
0x00, 0x00, 0xFF, 0x01, 0x03,
0xE0, 0x80, 0xFF, 0x00, 0x00,
0x08, 0x08, 0x6B, 0x6B, 0x08,
0x36, 0x12, 0x36, 0x24, 0x36,
0x06, 0x0F, 0x09, 0x0F, 0x06,
0x00, 0x00, 0x18, 0x18, 0x00,
0x00, 0x00, 0x10, 0x10, 0x00,
0x30, 0x40, 0xFF, 0x01, 0x01,
0x00, 0x1F, 0x01, 0x01, 0x1E,
0x00, 0x19, 0x1D, 0x17, 0x12,
0x00, 0x3C, 0x3C, 0x3C, 0x3C,
0x00, 0x00, 0x00, 0x00, 0x00,
};
ST7796.c
//
// Created by 83503 on 2023/8/8.
//
#include "st7796.h"
//#include "fonts.h"
typedef struct {
uint16_t width; //液晶屏的宽度
uint16_t height; //液晶屏的高度
uint16_t id; //液晶屏的ID
uint8_t wramcmd; //ST996S写GRAM指令
uint8_t setxcmd; //ST996S设置X坐标指令
uint8_t setycmd; //ST996S设置Y坐标指令
uint8_t mode;
uint8_t xcmd;
uint8_t ycmd;
uint8_t calibration;
} _ST7796S_LcdSetting; //液晶屏的一些重要参数,没注释的代表触摸屏的功能
_ST7796S_LcdSetting LcdSetting;
void ST7796S_LcdReset() {
LCD_RST_CLR;
delay_ms(100);
LCD_RST_SET;
delay_ms(50);
}
/*写命令*/
void ST7796S_LcdWriteCommand(uint8_t command) {
LCD_CS_CLR;
LCD_DC_CLR;
HAL_SPI_Transmit(&LCD_SPI, &command, 1, 5);
LCD_CS_SET;
}
/*写数据*/
void ST7796S_LcdWriteData(uint8_t data) {
LCD_CS_CLR;
LCD_DC_SET;
HAL_SPI_Transmit(&LCD_SPI, &data, 1, 5);
LCD_CS_SET;
}
/*向液晶屏特定寄存器写入数据*/
void ST7796S_LcdWriteReg(uint8_t registers, uint16_t data) {
ST7796S_LcdWriteCommand(registers);
ST7796S_LcdWriteData(data);
}
/*设置液晶屏的扫描方向
0代表竖屏,然后依次旋转90度
*/
void ST7796S_LcdDirection(uint8_t direction) {
LcdSetting.setxcmd = 0x2A;
LcdSetting.setycmd = 0x2B;
LcdSetting.wramcmd = 0x2C;
switch (direction) {
case 0:
LcdSetting.width = LCD_W;
LcdSetting.height = LCD_H;
ST7796S_LcdWriteReg(0x36, (1 << 3) | (1 << 6));
LcdSetting.mode = 0;
LcdSetting.xcmd = 0xd0;
LcdSetting.ycmd = 0x90;
break;
case 1:
LcdSetting.width = LCD_H;
LcdSetting.height = LCD_W;
ST7796S_LcdWriteReg(0x36, (1 << 3) | (1 << 5));
LcdSetting.mode = 1;
LcdSetting.xcmd = 0x90;
LcdSetting.ycmd = 0xd0;
break;
case 2:
LcdSetting.width = LCD_W;
LcdSetting.height = LCD_H;
ST7796S_LcdWriteReg(0x36, (1 << 3) | (1 << 7));
LcdSetting.mode = 2;
LcdSetting.xcmd = 0xd0;
LcdSetting.ycmd = 0x90;
break;
case 3:
LcdSetting.width = LCD_H;
LcdSetting.height = LCD_W;
ST7796S_LcdWriteReg(0x36, (1 << 3) | (1 << 7) | (1 << 6) | (1 << 5));
LcdSetting.mode = 3;
LcdSetting.xcmd = 0x90;
LcdSetting.ycmd = 0xd0;
break;
default:
break;
}
}
/*准备写入GRAM*/
void LCD_WriteRAM_Prepare(void) {
ST7796S_LcdWriteCommand(LcdSetting.wramcmd);
}
/*写16位数据*/
void Lcd_WriteData_16Bit(uint16_t Data) {
uint8_t n_Data1 = Data >> 8;
uint8_t n_Data2 = Data & 0x00ff;
uint8_t N_Data[2] = {n_Data1, n_Data2};
LCD_CS_CLR;
LCD_DC_SET;
HAL_SPI_Transmit(&LCD_SPI, N_Data, sizeof(N_Data), 5);
LCD_CS_SET;
}
/*设置显示窗口*/
void LCD_SetWindows(uint16_t xStar, uint16_t yStar, uint16_t xEnd, uint16_t yEnd) {
ST7796S_LcdWriteCommand(LcdSetting.setxcmd);
ST7796S_LcdWriteData(xStar >> 8);
ST7796S_LcdWriteData(0x00FF & xStar);
ST7796S_LcdWriteData(xEnd >> 8);
ST7796S_LcdWriteData(0x00FF & xEnd);
ST7796S_LcdWriteCommand(LcdSetting.setycmd);
ST7796S_LcdWriteData(yStar >> 8);
ST7796S_LcdWriteData(0x00FF & yStar);
ST7796S_LcdWriteData(yEnd >> 8);
ST7796S_LcdWriteData(0x00FF & yEnd);
LCD_WriteRAM_Prepare();
}
/*清屏*/
void LCD_Clear(uint16_t Color) {
unsigned int i, m;
LCD_SetWindows(0, 0, LcdSetting.width - 1, LcdSetting.height - 1);
LCD_CS_CLR;
LCD_DC_SET;
for (i = 0; i < LcdSetting.height; i++) {
for (m = 0; m < LcdSetting.width; m++) {
Lcd_WriteData_16Bit(Color);
}
}
LCD_CS_SET;
}
void ST7796S_LcdInit(void) {
ST7796S_LcdReset();
ST7796S_LcdWriteCommand(0xF0);
ST7796S_LcdWriteData(0xC3);
ST7796S_LcdWriteCommand(0xF0);
ST7796S_LcdWriteData(0x96);
ST7796S_LcdWriteCommand(0x36);
ST7796S_LcdWriteData(0x68);
ST7796S_LcdWriteCommand(0x3A);
ST7796S_LcdWriteData(0x05);
ST7796S_LcdWriteCommand(0xB0);
ST7796S_LcdWriteData(0x80);
ST7796S_LcdWriteCommand(0xB6);
ST7796S_LcdWriteData(0x00);
ST7796S_LcdWriteData(0x02);
ST7796S_LcdWriteCommand(0xB5);
ST7796S_LcdWriteData(0x02);
ST7796S_LcdWriteData(0x03);
ST7796S_LcdWriteData(0x00);
ST7796S_LcdWriteData(0x04);
ST7796S_LcdWriteCommand(0xB1);
ST7796S_LcdWriteData(0x80);
ST7796S_LcdWriteData(0x10);
ST7796S_LcdWriteCommand(0xB4);
ST7796S_LcdWriteData(0x00);
ST7796S_LcdWriteCommand(0xB7);
ST7796S_LcdWriteData(0xC6);
ST7796S_LcdWriteCommand(0xC5);
ST7796S_LcdWriteData(0x24);
ST7796S_LcdWriteCommand(0xE4);
ST7796S_LcdWriteData(0x31);
ST7796S_LcdWriteCommand(0xE8);
ST7796S_LcdWriteData(0x40);
ST7796S_LcdWriteData(0x8A);
ST7796S_LcdWriteData(0x00);
ST7796S_LcdWriteData(0x00);
ST7796S_LcdWriteData(0x29);
ST7796S_LcdWriteData(0x19);
ST7796S_LcdWriteData(0xA5);
ST7796S_LcdWriteData(0x33);
ST7796S_LcdWriteCommand(0xC2);
ST7796S_LcdWriteCommand(0xA7);
ST7796S_LcdWriteCommand(0xE0);
ST7796S_LcdWriteData(0xF0);
ST7796S_LcdWriteData(0x09);
ST7796S_LcdWriteData(0x13);
ST7796S_LcdWriteData(0x12);
ST7796S_LcdWriteData(0x12);
ST7796S_LcdWriteData(0x2B);
ST7796S_LcdWriteData(0x3C);
ST7796S_LcdWriteData(0x44);
ST7796S_LcdWriteData(0x4B);
ST7796S_LcdWriteData(0x1B);
ST7796S_LcdWriteData(0x18);
ST7796S_LcdWriteData(0x17);
ST7796S_LcdWriteData(0x1D);
ST7796S_LcdWriteData(0x21);
ST7796S_LcdWriteCommand(0XE1);
ST7796S_LcdWriteData(0xF0);
ST7796S_LcdWriteData(0x09);
ST7796S_LcdWriteData(0x13);
ST7796S_LcdWriteData(0x0C);
ST7796S_LcdWriteData(0x0D);
ST7796S_LcdWriteData(0x27);
ST7796S_LcdWriteData(0x3B);
ST7796S_LcdWriteData(0x44);
ST7796S_LcdWriteData(0x4D);
ST7796S_LcdWriteData(0x0B);
ST7796S_LcdWriteData(0x17);
ST7796S_LcdWriteData(0x17);
ST7796S_LcdWriteData(0x1D);
ST7796S_LcdWriteData(0x21);
ST7796S_LcdWriteCommand(0X36);
ST7796S_LcdWriteData(0xEC);
ST7796S_LcdWriteCommand(0xF0);
ST7796S_LcdWriteData(0xC3);
ST7796S_LcdWriteCommand(0xF0);
ST7796S_LcdWriteData(0x69);
ST7796S_LcdWriteCommand(0X13);
ST7796S_LcdWriteCommand(0X11);
ST7796S_LcdWriteCommand(0X29);
ST7796S_LcdDirection(LCD_DIRECTION);
LCD_InvertColors(1);
LCD_Clear(0x0000); //清屏为黑色
}
void LCD_SetCursor(u16 Xpos, u16 Ypos) {
LCD_SetWindows(Xpos, Ypos, Xpos, Ypos);
}
void LCD_DrawPoint(u16 x, u16 y) {
LCD_SetCursor(x, y);//设置光标位置
Lcd_WriteData_16Bit(0xFFFF);
}
void LCD_DrawPixel(u16 x, u16 y, u16 color) {
LCD_SetCursor(x, y);//设置光标位置
Lcd_WriteData_16Bit(color);
}
void LCD_FillRectangle(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color) {
// clipping
if ((x >= LCD_W) || (y >= LCD_H)) return;
if ((x + w - 1) >= LCD_W) w = LCD_W - x;
if ((y + h - 1) >= LCD_H) h = LCD_H - y;
LCD_SetWindows(x, y, x + w - 1, y + h - 1);
LCD_CS_CLR;
LCD_DC_SET;
for (y = h; y > 0; y--) {
for (x = w; x > 0; x--) {
Lcd_WriteData_16Bit(color);
}
}
LCD_CS_SET;
}
void LCD_DrawCharS(int16_t x, int16_t y, char c, int16_t textColor, int16_t bgColor, uint8_t size) {
uint8_t line;
int32_t i, j;
if ((x >= LCD_W) ||
(y >= LCD_H) ||
((x + 5 * size - 1) < 0) ||
((y + 8 * size - 1) < 0))
return;
for (i = 0; i < 6; i++) {
if (i == 5)
line = 0x0;
else
line = Font[(c * 5) + i];
for (j = 0; j < 8; j++) {
if (line & 0x1) {
if (size == 1)
LCD_DrawPixel(x + i, y + j, textColor);
else {
LCD_FillRectangle(x + (i * size), y + (j * size), size, size, textColor);
}
} else if (bgColor != textColor) {
if (size == 1) // default size
LCD_DrawPixel(x + i, y + j, bgColor);
else { // big size
LCD_FillRectangle(x + i * size, y + j * size, size, size, bgColor);
}
}
line >>= 1;
}
}
}
uint32_t LCD_DrawString(uint16_t x, uint16_t y, char *pt, int16_t textColor) {
uint32_t count = 0;
// if (y > 15) return 0;
while (*pt) {
LCD_DrawCharS(x * 12, y * 20, *pt, textColor, LCD_BLACK, 2);
pt++;
x = x + 1;
// if (x > 20) return count; // number of characters printed
count++;
}
return count; // number of characters printed
}
void LCD_InvertColors(int invert) {
ST7796S_LcdWriteCommand(invert ? LCD_INVON : LCD_INVOFF);
}
测试 main.c
#include "st7796.h"
int main(void) {
xxxx其他的代码初始化
//初始化TFT屏幕开始
ST7796S_LcdInit();
delay_s(1);
LCD_Clear(0);
delay_s(1);
LCD_Clear(0x00ff);
delay_s(1);
LCD_Clear(0x00);
LCD_DrawString(0, 0, "Hello World!", LCD_GREEN);
LCD_DrawString(1, 1, "Temp: 255", LCD_WHITE);
LCD_DrawString(2, 2, "DIY", LCD_RED);
// LCD_DrawCharS(0,0,'H',LCD_WHITE,LCD_BLACK,3);
// LCD_DrawCharS(0,28,'H',LCD_WHITE,LCD_BLACK,3);
// LCD_DrawCharS(1,9,'Z',LCD_WHITE,LCD_BLACK,3);
}
评论区