2022-02-18 11:27:58 +08:00

287 lines
4.8 KiB
C

#include "lcd.h"
void LCD_Reset_On(void)
{
#if ST7789_SPI
S_RESET_LOW;
#endif
#if ST7789_8080
P_RESET_LOW;
#endif
}
void LCD_Reset_Off(void)
{
#if ST7789_SPI
S_RESET_HIGH;
#endif
#if ST7789_8080
P_RESET_HIGH;
#endif
}
void LCD_Back_On(void)
{
#if ST7789_SPI
S_Back_On();
#endif
#if ST7789_8080
P_Back_On();
#endif
}
void LCD_Back_Off(void)
{
#if ST7789_SPI
S_Back_Off();
#endif
#if ST7789_8080
P_Back_Off();
#endif
}
static void LCD_WriteReg(uint8_t reg)
{
#if ST7789_SPI
S_WriteReg(reg);
#endif
#if ST7789_8080
P_WriteReg(reg);
#endif
}
static void LCD_WriteData8(uint8_t data)
{
#if ST7789_SPI
S_WriteData8(data);
#endif
#if ST7789_8080
P_WriteData8(data);
#endif
}
static void LCD_WriteData16(uint16_t data)
{
#if ST7789_SPI
S_WriteData16(data);
#endif
#if ST7789_8080
P_WriteData16(data);
#endif
}
static void LCD_WriteData(uint8_t *data, uint32_t len)
{
uint32_t t1 = 0, t2 = 0;
#if ST7789_SPI
t1 = HAL_GetTick();
S_WriteData(data, len);
t2 = HAL_GetTick();
printf("s_t = %d\r\n", t2 - t1);
#endif
#if ST7789_8080
t1 = HAL_GetTick();
P_WriteData(data, len);
t2 = HAL_GetTick();
printf("p_t = %d\r\n", t2 - t1);
#endif
}
void LCD_Init(void)
{
LCD_Reset_On();
HAL_Delay(120);
LCD_Reset_Off();
HAL_Delay(120);
LCD_Back_On();
HAL_Delay(100);
LCD_WriteReg(0x11);
HAL_Delay(120);
LCD_WriteReg(0x36); // left->right top->bottom
LCD_WriteData8(0x00);
LCD_WriteReg(0x3A); // rgb565
LCD_WriteData8(0x05);
LCD_WriteReg(0xB2);
LCD_WriteData8(0x0C);
LCD_WriteData8(0x0C);
LCD_WriteData8(0x00);
LCD_WriteData8(0x33);
LCD_WriteData8(0x33);
LCD_WriteReg(0xB7);
LCD_WriteData8(0x35);
LCD_WriteReg(0xBB);
LCD_WriteData8(0x19);
LCD_WriteReg(0xC0);
LCD_WriteData8(0x2C);
LCD_WriteReg(0xC2);
LCD_WriteData8(0x01);
LCD_WriteReg(0xC3);
LCD_WriteData8(0x12);
LCD_WriteReg(0xC4);
LCD_WriteData8(0x20);
LCD_WriteReg(0xC6);
LCD_WriteData8(0x0F);
LCD_WriteReg(0xD0);
LCD_WriteData8(0xA4);
LCD_WriteData8(0xA1);
LCD_WriteReg(0xE0);
LCD_WriteData8(0xD0);
LCD_WriteData8(0x04);
LCD_WriteData8(0x0D);
LCD_WriteData8(0x11);
LCD_WriteData8(0x13);
LCD_WriteData8(0x2B);
LCD_WriteData8(0x3F);
LCD_WriteData8(0x54);
LCD_WriteData8(0x4C);
LCD_WriteData8(0x18);
LCD_WriteData8(0x0D);
LCD_WriteData8(0x0B);
LCD_WriteData8(0x1F);
LCD_WriteData8(0x23);
LCD_WriteReg(0xE1);
LCD_WriteData8(0xD0);
LCD_WriteData8(0x04);
LCD_WriteData8(0x0C);
LCD_WriteData8(0x11);
LCD_WriteData8(0x13);
LCD_WriteData8(0x2C);
LCD_WriteData8(0x3F);
LCD_WriteData8(0x44);
LCD_WriteData8(0x51);
LCD_WriteData8(0x2F);
LCD_WriteData8(0x1F);
LCD_WriteData8(0x1F);
LCD_WriteData8(0x20);
LCD_WriteData8(0x23);
LCD_WriteReg(0x21);
LCD_WriteReg(0x29);
}
void LCD_Address_Set(uint16_t xs, uint16_t ys, uint16_t xe, uint16_t ye)
{
LCD_WriteReg(0x2A);
LCD_WriteData16(xs);
LCD_WriteData16(xe);
LCD_WriteReg(0x2B);
LCD_WriteData16(ys);
LCD_WriteData16(ye);
LCD_WriteReg(0x2C);
}
// 在指定区域田中颜色
void LCD_Fill(uint16_t xs, uint16_t ys, uint16_t xe, uint16_t ye, uint16_t color)
{
uint16_t i, j;
LCD_Address_Set(xs, ys, xe - 1, ye - 1);
for (i = ys; i < ye; i++)
{
for (j = xs; j < xe; j++)
{
LCD_WriteData16(color);
}
}
}
// 画点
void LCD_DrawPoint(uint16_t x, uint16_t y, uint16_t color)
{
LCD_Address_Set(x, y, x, y);
LCD_WriteData16(color);
}
// 画线
void LCD_DrawLine(uint16_t xs, uint16_t ys, uint16_t xe, uint16_t ye, uint16_t color)
{
uint16_t i;
int x = 0, y = 0, dx, dy, offset;
int stepx, stepy, nowx, nowy;
dx = xe - xs;
dy = ye - ys;
nowx = xs;
nowy = ys;
stepx = (dx > 0) ? 1 : ((dx == 0) ? 0 : -1);
stepy = (dy > 0) ? 1 : ((dy == 0) ? 0 : -1);
dx = (stepx >= 0) ? dx : -dx;
dy = (stepy >= 0) ? dy : -dy;
offset = (dx > dy) ? dx : dy;
for (i = 0; i < (offset + 1); i++)
{
LCD_DrawPoint(nowx, nowy, color);
x += dx;
y += dy;
if (x > offset)
{
x -= offset;
nowx += stepx;
}
if (y > offset)
{
y -= offset;
nowy += stepy;
}
}
}
// 画矩形
void LCD_DrawRectangle(uint16_t xs, uint16_t ys, uint16_t xe, uint16_t ye, uint16_t color)
{
LCD_DrawLine(xs, ys, xe, ys, color);
LCD_DrawLine(xe, ys, xe, ye, color);
LCD_DrawLine(xe, ye, xs, ye, color);
LCD_DrawLine(xs, ye, xs, ys, color);
}
// 画圆
void LCD_DrawCircle(uint16_t x, uint16_t y, uint8_t r, uint16_t color)
{
int a, b;
a = 0;
b = r;
while (a <= b)
{
LCD_DrawPoint(x - b, y - a, color);
LCD_DrawPoint(x - b, y + a, color);
LCD_DrawPoint(x + b, y - a, color);
LCD_DrawPoint(x + b, y + a, color);
LCD_DrawPoint(x + a, y - b, color);
LCD_DrawPoint(x - a, y - b, color);
LCD_DrawPoint(x + a, y + b, color);
LCD_DrawPoint(x - a, y + b, color);
a++;
if ((a * a + b * b) > (r * r))
{
b--;
}
}
}
// 显示图片
void LCD_ShowPicture(uint16_t x, uint16_t y, uint16_t length, uint16_t width, uint8_t *data)
{
LCD_Address_Set(x, y, x + length - 1, y + width - 1);
LCD_WriteData(data, length * width * 2);
}