侧边栏壁纸
博主头像
塞塞哇 博主等级

开源创客

  • 累计撰写 38 篇文章
  • 累计创建 9 个标签
  • 累计收到 9 条评论

目 录CONTENT

文章目录

ST7796屏幕驱动程序(STM32-SPI)

塞塞蛙
2023-08-08 / 1 评论 / 0 点赞 / 817 阅读 / 0 字

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);
}

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区