#include "st7789.h"
void ST7789_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8 | GPIO_PIN_9, GPIO_PIN_SET);
}
void ST7789_Writ_Bus(uint8_t dat)
{
uint8_t i;
ST7789_CS_Clr();
for (i = 0; i < 8; i++)
{
ST7789_SCLK_Clr();
if (dat & 0x80)
{
ST7789_MOSI_Set();
}
else
{
ST7789_MOSI_Clr();
}
ST7789_SCLK_Set();
dat <<= 1;
}
ST7789_CS_Set();
}
void ST7789_WR_DATA8(uint8_t dat)
{
ST7789_Writ_Bus(dat);
}
void ST7789_WR_DATA(uint16_t dat)
{
ST7789_Writ_Bus(dat >> 8);
ST7789_Writ_Bus(dat);
}
void ST7789_WR_REG(uint8_t dat)
{
ST7789_DC_Clr();
ST7789_Writ_Bus(dat);
ST7789_DC_Set();
}
void ST7789_Address_Set(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1)
{
// uint16_t x_start = x0 + X_SHIFT, x_end = x1 + X_SHIFT;
// uint16_t y_start = y0 + Y_SHIFT, y_end = y1 + Y_SHIFT;
x0=x0+X_SHIFT;
x1= x1 + X_SHIFT;
y0 = y0 + Y_SHIFT;
y1 = y1 + Y_SHIFT;
ST7789_WR_REG(0x2a);
ST7789_WR_DATA(x0);
ST7789_WR_DATA(x1);
ST7789_WR_REG(0x2b);
ST7789_WR_DATA(y0);
ST7789_WR_DATA(y1);
ST7789_WR_REG(0x2c);
}
void ST7789_SetRotation(uint8_t m)
{
ST7789_WR_REG(ST7789_MADCTL); // MADCTL
switch (m) {
case 0:
ST7789_WR_DATA8(ST7789_MADCTL_MX | ST7789_MADCTL_MY | ST7789_MADCTL_RGB);
break;
case 1:
ST7789_WR_DATA8(ST7789_MADCTL_MY | ST7789_MADCTL_MV | ST7789_MADCTL_RGB);
break;
case 2:
ST7789_WR_DATA8(ST7789_MADCTL_RGB);
break;
case 3:
ST7789_WR_DATA8(ST7789_MADCTL_MX | ST7789_MADCTL_MV | ST7789_MADCTL_RGB);
break;
default:
break;
}
}
void ST7789_Init(void)
{
ST7789_GPIO_Init();
ST7789_RES_Clr();
HAL_Delay(100);
ST7789_RES_Set();
HAL_Delay(100);
ST7789_BLK_Set();
HAL_Delay(100);
//************* Start Initial Sequence **********//
ST7789_WR_REG(0x36); // Sleep out
ST7789_WR_DATA8(0x00);
HAL_Delay(120);
ST7789_WR_REG(0x3A);
ST7789_WR_DATA8(0x05);
ST7789_WR_REG(0xB2);
ST7789_WR_DATA8(0x0C);
ST7789_WR_DATA8(0x0C);
ST7789_WR_DATA8(0x00);
ST7789_WR_DATA8(0x33);
ST7789_WR_DATA8(0x33);
ST7789_SetRotation(ST7789_ROTATION);
ST7789_WR_REG(0xB7);
ST7789_WR_DATA8(0x35);
ST7789_WR_REG(0xBB);
ST7789_WR_DATA8(0x19);
ST7789_WR_REG(0xC0);
ST7789_WR_DATA8(0x2C);
ST7789_WR_REG(0xC2);
ST7789_WR_DATA8(0x01);
ST7789_WR_REG(0xC3);
ST7789_WR_DATA8(0x12);
ST7789_WR_REG(0xC4);
ST7789_WR_DATA8(0x20);
ST7789_WR_REG(0xC6);
ST7789_WR_DATA8(0x0F);
ST7789_WR_REG(0xD0);
ST7789_WR_DATA8(0xA4);
ST7789_WR_DATA8(0xA1);
ST7789_WR_REG(0xE0);
ST7789_WR_DATA8(0xD0);
ST7789_WR_DATA8(0x04);
ST7789_WR_DATA8(0x0D);
ST7789_WR_DATA8(0x11);
ST7789_WR_DATA8(0x13);
ST7789_WR_DATA8(0x2B);
ST7789_WR_DATA8(0x3F);
ST7789_WR_DATA8(0x54);
ST7789_WR_DATA8(0x4C);
ST7789_WR_DATA8(0x18);
ST7789_WR_DATA8(0x0D);
ST7789_WR_DATA8(0x0B);
ST7789_WR_DATA8(0x1F);
ST7789_WR_DATA8(0x23);
ST7789_WR_REG(0xE1);
ST7789_WR_DATA8(0xD0);
ST7789_WR_DATA8(0x04);
ST7789_WR_DATA8(0x0C);
ST7789_WR_DATA8(0x11);
ST7789_WR_DATA8(0x13);
ST7789_WR_DATA8(0x2C);
ST7789_WR_DATA8(0x3F);
ST7789_WR_DATA8(0x44);
ST7789_WR_DATA8(0x51);
ST7789_WR_DATA8(0x2F);
ST7789_WR_DATA8(0x1F);
ST7789_WR_DATA8(0x1F);
ST7789_WR_DATA8(0x20);
ST7789_WR_DATA8(0x23);
ST7789_WR_REG(0x21);
ST7789_WR_REG(0x11);
HAL_Delay(120);
ST7789_WR_REG(0x29);
}
void ST7789_Fill(uint16_t xsta, uint16_t ysta, uint16_t xend, uint16_t yend, uint16_t color)
{
uint16_t i, j;
ST7789_Address_Set(xsta, ysta, xend - 1, yend - 1);
for (i = ysta; i < yend; i++)
{
for (j = xsta; j < xend; j++)
{
ST7789_WR_DATA(color);
}
}
}
void ST7789_DrawPoint(uint16_t x, uint16_t y, uint16_t color)
{
ST7789_Address_Set(x, y, x, y);
ST7789_WR_DATA(color);
}
#ifndef __ST7789_H
#define __ST7789_H
#include "stm32f1xx_hal.h"
// #define ST7789_ROTATION 0
// #define ST7789_ROTATION 1
#define ST7789_ROTATION 2 // use Normally on 240x240
// #define ST7789_ROTATION 3
#define ST7789_WIDTH 240
#define ST7789_HEIGHT 240
#if ST7789_ROTATION == 0
#define X_SHIFT 0
#define Y_SHIFT 80
#elif ST7789_ROTATION == 1
#define X_SHIFT 80
#define Y_SHIFT 0
#elif ST7789_ROTATION == 2
#define X_SHIFT 0
#define Y_SHIFT 0
#elif ST7789_ROTATION == 3
#define X_SHIFT 0
#define Y_SHIFT 0
#endif
#define ST7789_MADCTL 0x36
/* Page Address Order ('0': Top to Bottom, '1': the opposite) */
#define ST7789_MADCTL_MY 0x80
/* Column Address Order ('0': Left to Right, '1': the opposite) */
#define ST7789_MADCTL_MX 0x40
/* Page/Column Order ('0' = Normal Mode, '1' = Reverse Mode) */
#define ST7789_MADCTL_MV 0x20
/* Line Address Order ('0' = LCD Refresh Top to Bottom, '1' = the opposite) */
#define ST7789_MADCTL_ML 0x10
/* RGB/BGR Order ('0' = RGB, '1' = BGR) */
#define ST7789_MADCTL_RGB 0x00
//-----------------ST7789端口定义----------------
#define ST7789_SCLK_Clr() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET) // SCL=SCLK
#define ST7789_SCLK_Set() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET)
#define ST7789_MOSI_Clr() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET) // SDA=MOSI
#define ST7789_MOSI_Set() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET)
#define ST7789_RES_Clr() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET) // RES
#define ST7789_RES_Set() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET)
#define ST7789_DC_Clr() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET) // DC
#define ST7789_DC_Set() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET)
#define ST7789_CS_Clr() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET) // CS
#define ST7789_CS_Set() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET)
#define ST7789_BLK_Clr() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET) // BLK
#define ST7789_BLK_Set() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET)
void ST7789_Init(void);
void ST7789_Fill(uint16_t xsta, uint16_t ysta, uint16_t xend, uint16_t yend, uint16_t color);
void ST7789_DrawPoint(uint16_t x, uint16_t y, uint16_t color);
#define WHITE 0xFFFF
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define MAGENTA 0xF81F
#define GREEN 0x07E0
#define CYAN 0x7FFF
#define YELLOW 0xFFE0
#define GRAY 0X8430
#define BRED 0XF81F
#define GRED 0XFFE0
#define GBLUE 0X07FF
#define BROWN 0XBC40
#define BRRED 0XFC07
#define DARKBLUE 0X01CF
#define LIGHTBLUE 0X7D7C
#define GRAYBLUE 0X5458
#define LIGHTGREEN 0X841F
#define LGRAY 0XC618
#define LGRAYBLUE 0XA651
#define LBBLUE 0X2B12