mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-22 17:12:55 +08:00
287 lines
4.8 KiB
C
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);
|
|
}
|