Bootstrap

软件spi ST7789屏幕驱动stm32

#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


;