首页 > 其他分享 >软件spi ST7789屏幕驱动stm32

软件spi ST7789屏幕驱动stm32

时间:2024-07-12 12:59:47浏览次数:14  
标签:PIN stm32 spi DATA8 WR ST7789 GPIO define

#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


标签:PIN,stm32,spi,DATA8,WR,ST7789,GPIO,define
From: https://blog.csdn.net/weixin_72569529/article/details/140375926

相关文章

  • stm32 EC11编码器
    #include"encoder.h"//A线作为时钟线,B线作为信号线//*******************************************************************///功能:初始化EC11旋转编码器相关参数//返回:无//详解:对EC11旋转编码器的连接IO口做IO口模式设置。以及将相关的变量进行初始化//************......
  • STM32常用函数整理
    STM32常用函数整理标准库使用的API用的都是**char***数据类型1./清空缓冲区/memset((char*)uart2RxBuff,0,UART2RXBUFF_SIZE);把uart2RxBuff中长度为UART2RXBUFF_SIZE的字符都写为02.拷贝memcpy(数组1,数组2,len);把数组2的len长度的数据拷贝到数组1中数组1......
  • SpinalHDL之实用工具(上篇)
    本文作为SpinalHDL学习笔记第十三篇,记录使用SpinalHDL的一些实用性语法工具。SpinalHDL学习笔记总纲链接如下:SpinalHDL学习笔记_spinalhdlblackbox-CSDN博客SpinalHDL的核心定义了许多功能性语法:•类型/字面量•寄存器/时钟域•组件/逻辑区•随机访问/只读存储......
  • SpinalHDL之错误修复(下篇)
    此箫非彼箫,不竹不丝不石。肉音别自唔咿。流苏瑟瑟纱垂,辨不出宫商角徵。一点樱桃欲绽,纤纤十指频移。课吞添吐两情痴,不觉悟灵犀味美推荐小说《回到明朝当王爷》,也有动漫,但小说改国漫通病,小说中杀伐果断人设极好的男主,到了动漫里就变成犹犹豫豫优柔寡断的废材,参见《元龙》。......
  • STM32的SPI接口详解
    目录1.SPI简介2.SPI工作原理3.SPI时序3.1CPOL(ClockPolarity,时钟极性):3.2CPHA(ClockPhase,时钟相位):3.3 四种工作模式4.相关代码4.1使能片选信号4.2使能通讯线4.3初始化SPI4.4设置SPI速度4.5读写数据1.SPI简介STM32的SPI(SerialPeripheralInterface)是一个......
  • STM32中断(NVIC和EXIT)
    CM3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。但STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。STM32有76个中断,包括16个内核中断和60个可屏蔽中断,具有16级可编程的中断优先级。而常用的就是这60个......
  • stm32f429iDisc AD规则组多通道+DMA转运
    扫描模式+非连续触发uint16_tAdc_Value[5]={0};DMA_InitTypeDefDMA_InitStructure;voidAD_Init(void){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph......
  • stm32f429i-Disc PWM生成 + 输入捕获测频率与占空比
    产生PWMvoidMy_PWM_Init(void){ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_TIM3); GPIO_InitTypeDefGPIO_InitStructure; GPIO_InitStru......
  • 零基础STM32单片机编程入门(十三) 红外避障传感器模块实战含源码
    文章目录一.概要二.红外避障模块主要参数1.模块引脚定义2.模块特点3.模块原理图三.STM32单片机红外避障模块检测实验四.CubeMX工程源代码下载五.小结一.概要红外避障模块具有一对红外线发射与接收管,发射管发射出一定频率的红外线,当检测遇到障碍物时,红外线反射回来......
  • cubemx+hal stm32 atgm336h GPS 北斗 定位 模块 驱动代码
    usart2.cgps的串口2设置voidMX_USART2_UART_Init(void){/*USERCODEBEGINUSART2_Init0*//*USERCODEENDUSART2_Init0*//*USERCODEBEGINUSART2_Init1*//*USERCODEENDUSART2_Init1*/huart2.Instance=USART2;huart2.Init.BaudR......