独木带你玩转彩屏——应用1驱动彩屏(寄存器spi版)

彩屏驱动

  • 1. 驱动彩屏
    • 1.1 初始化引脚
    • 1.2 初始化彩屏
  • 2. 彩屏涂色
  • 3. 结果展示
  • 4. 获取资源

SPI驱动彩屏
笔者最近画了个嘉立创的紫色版,上面布有彩屏模块,不得不说嘉立创紫真的很nice!
独木带你玩转彩屏——应用1驱动彩屏(寄存器spi版)_第1张图片
是不是很cool
独木带你玩转彩屏——应用1驱动彩屏(寄存器spi版)_第2张图片
言归正传,笔者曾经在学长#巨大的八爪鱼# 帮助下写过一篇FSMC驱动彩屏的文章,但是笔者并没有玩转彩屏,所以这次要出系列彩屏文章,形成一个完整的彩屏项目

STM32F103VET6驱动彩屏TFT2.8(ili9341)HAL库+标准库

可是!
独木带你玩转彩屏——应用1驱动彩屏(寄存器spi版)_第3张图片
之前买的那块微雪彩屏价格直逼one hundred yuans,
独木带你玩转彩屏——应用1驱动彩屏(寄存器spi版)_第4张图片
笔者果断放弃,不用FSMC驱动,找个便宜的裸屏

独木带你玩转彩屏——应用1驱动彩屏(寄存器spi版)_第5张图片
点击! 笔者购买的彩屏连接,便宜,还给你教程

言归正传 ,这次是真的!
独木带你玩转彩屏——应用1驱动彩屏(寄存器spi版)_第6张图片

1. 驱动彩屏

彩屏对应引脚
独木带你玩转彩屏——应用1驱动彩屏(寄存器spi版)_第7张图片
彩屏 引脚
TFT_CS PA4
TFT_RES PE13
D/R PE8
SPI1_MOSI PA7
SPI1_MISO PA6
SPI1_SCK PA5
TFT_LED +3.3V
SPI3_MOSI PB5:
SPI3_MISO PB4
:SPI3_SCK: PB3:
T_CS PA15
T_IRQ :PE10-:
注!TFT_LED引脚我直接接到一个按键上,用按键控制背光灯

1.1 初始化引脚

//打开需要用到的功能,配置输入输出模式
 RCC->APB2ENR =RCC_APB2ENR_IOPAEN | RCC_APB2ENR_USART1EN | RCC_APB2ENR_IOPEEN | RCC_APB2ENR_SPI1EN | RCC_APB2ENR_TIM1EN ;
  
  GPIOA->CRH = (GPIOA->CRH  & 0XFFFFF00F) | 0X4B0;
  
  GPIOE->CRH = (GPIOE->CRH & 0X00F00F0F) | 0X44037030;
//spi初始化配置
void SPI1_Init(void)	
{
     
	    /* SPI初始化 */
  GPIOA->CRL = (GPIOA->CRL & 0X0000FFFF) | 0Xb4bb0000;//spi引脚配置
  
  SPI1->CR1 = SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_MSTR | SPI_CR1_SPE; 
}
void LCD_GPIOInit(void)
{
     
 
 //推挽输出   RES/DR配置
  GPIOE->CRH = (GPIOE->CRH & 0XFF0FFFF0) | 0X300003;

}
注!初始化引脚的内容就不罗嗦了
独木带你玩转彩屏——应用1驱动彩屏(寄存器spi版)_第8张图片
//低电平复位
void LCD_RESET(void)
{
     
	LCD_RST_CLR;
	delay_ms(100);	
	LCD_RST_SET;
	delay_ms(100);
}

1.2 初始化彩屏

 void LCD_Init(void)
{
       
	SPI1_Init(); //硬件SPI1初始化
	LCD_GPIOInit();//LCD GPIO初始化										 
 	LCD_RESET(); //LCD 复位

 // LCD_WR_REG(0X01); 软件res
  // Power control B
  LCD_WR_REG (0xcf);
  LCD_WR_DATA (0x00);
  LCD_WR_DATA (0x81);
  LCD_WR_DATA ( 0x30);
  
  // Power on sequence control
  LCD_WR_REG (0xed);
  LCD_WR_DATA ( 0x64);
  LCD_WR_DATA ( 0x03);
  LCD_WR_DATA (0x12);
  LCD_WR_DATA ( 0x81);
  
  // Driver timing control A
  LCD_WR_REG (0xe8);
  LCD_WR_DATA (0x85);
  LCD_WR_DATA (0x10);
  LCD_WR_DATA (0x78);
  
  // Power control A
  LCD_WR_REG ( 0xcb);
  LCD_WR_DATA ( 0x39);
  LCD_WR_DATA (0x2c);
  LCD_WR_DATA (0x00);
  LCD_WR_DATA (0x34);
  LCD_WR_DATA ( 0x02);
  
  // Pump ratio control
  LCD_WR_REG (0xf7);
  LCD_WR_DATA(0x20);
  
  // Driver timing control B
  LCD_WR_REG ( 0xea);
  LCD_WR_DATA ( 0x00);
  LCD_WR_DATA ( 0x00);
  
  // Frame Rate Control (In Normal Mode/Full Colors)
  LCD_WR_REG ( 0xb1);
  LCD_WR_DATA ( 0x00);
  LCD_WR_DATA ( 0x1b);
  
  // Display Function Control
  LCD_WR_REG ( 0xb6);
  LCD_WR_DATA ( 0x0a);
  LCD_WR_DATA ( 0xa2);
  
  // Power Control 1
  LCD_WR_REG ( 0xc0);
  LCD_WR_DATA ( 0x35);
  
  // Power Control 2
  LCD_WR_REG ( 0xc1);
  LCD_WR_DATA ( 0x11);
  
  // VCOM Control 1
  LCD_WR_REG ( 0xc5);
  LCD_WR_DATA ( 0x45);
  LCD_WR_DATA ( 0x45);
  
  // VCOM Control 2
  LCD_WR_REG ( 0xc7);
  LCD_WR_DATA ( 0xa2);
  
  // Enable 3G
  LCD_WR_REG ( 0xf2);
  LCD_WR_DATA ( 0x00);
  
  // Gamma Set
  LCD_WR_REG ( 0x26);
  LCD_WR_DATA ( 0x01);
  
  // Positive Gamma Correction
  LCD_WR_REG ( 0xe0);
  LCD_WR_DATA ( 0x0f);
  LCD_WR_DATA ( 0x26);
  LCD_WR_DATA ( 0x24);
  LCD_WR_DATA ( 0x0b);
  LCD_WR_DATA ( 0x0e);
  LCD_WR_DATA ( 0x09);
  LCD_WR_DATA ( 0x54);
  LCD_WR_DATA ( 0xa8);
  LCD_WR_DATA ( 0x46);
  LCD_WR_DATA ( 0x0c);
  LCD_WR_DATA ( 0x17);
  LCD_WR_DATA ( 0x09);
  LCD_WR_DATA ( 0x0f);
  LCD_WR_DATA ( 0x07);
  LCD_WR_DATA ( 0x00);
  
  // Negative Gamma Correction
  LCD_WR_REG ( 0xe1);
  LCD_WR_DATA ( 0x00);
  LCD_WR_DATA ( 0x19);
  LCD_WR_DATA ( 0x1b);
  LCD_WR_DATA ( 0x04);
  LCD_WR_DATA ( 0x10);
  LCD_WR_DATA ( 0x07);
  LCD_WR_DATA ( 0x2a);
  LCD_WR_DATA ( 0x47);
  LCD_WR_DATA ( 0x39);
  LCD_WR_DATA ( 0x03);
  LCD_WR_DATA ( 0x06);
  LCD_WR_DATA ( 0x06);
  LCD_WR_DATA ( 0x30);
  LCD_WR_DATA ( 0x38);
  LCD_WR_DATA ( 0x0f);
  
  // Pixel Format Set
  LCD_WR_REG ( 0x3a);
  LCD_WR_DATA ( 0x55);
  
  // Sleep Out
  LCD_WR_REG ( 0x11);
  delay_ms(120);
  
//  ILI9341_SetScanDirection(0); // 设置扫描方向
  LCD_WR_REG ( 0x29); // 允许显示显存中的图像 (后面还需要打开背光才能开显示)
 
 
  LCD_direction(USE_HORIZONTAL);//设置LCD显示方向
	
	LCD_Clear(WRITE);//清全屏白色
}

上面的初始化的命令和数据都是根据ILI9341手册上写的,如下图
独木带你玩转彩屏——应用1驱动彩屏(寄存器spi版)_第9张图片

Power control B 对应着手册上的Command cfh ,后面的数据就是对应下面的三个参数分别为 0X00 0X81 0X30
独木带你玩转彩屏——应用1驱动彩屏(寄存器spi版)_第10张图片

运行代码,现在应该是 白色了,但是我们无法确定是否真的驱动成功,所以下面我们就要对屏幕进行涂色

2. 彩屏涂色

//这段代码是卖家给出的清屏代码,函数详细我再下面代码中注释了
void LCD_Clear(u16 Color)
{
     
  unsigned int i,m;  
  /*这个函数是设置显示图框,显示的横纵坐标起点和终点*/
	LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);   
	LCD_CS_CLR;//将spi的cs拉低
	LCD_RS_SET;//rs置一
	for(i=0;i<lcddev.height;i++)//for循环遍历像素点
	{
     
    for(m=0;m<lcddev.width;m++)
    {
     	
			Lcd_WriteData_16Bit(Color);//将颜色数据写进去,显示在每个像素点
		}
	}
	 LCD_CS_SET;//拉高 数据发送完毕
} 

涂色,发现彩屏并不是所有像素点都显示了红色,有三横的像素点显示不正常
独木带你玩转彩屏——应用1驱动彩屏(寄存器spi版)_第11张图片
回到初始化彩屏代码,其中的sleep out 命令#退出低功耗模式,下面有个120ms的延时, 笔者将延时去掉
独木带你玩转彩屏——应用1驱动彩屏(寄存器spi版)_第12张图片
结果如上图更多横的像素点没有被涂色
所以将延时改到150ms,像素点显示正常,笔者将其定义为,彩屏未完全睡醒
独木带你玩转彩屏——应用1驱动彩屏(寄存器spi版)_第13张图片
注:sleep out 初始化时必须要有的不然屏幕就是一直处于低功耗状态,一直为白屏,有兴趣的朋友可以尝试通过按键来切换彩屏的状态

独木带你玩转彩屏——应用1驱动彩屏(寄存器spi版)_第14张图片

3. 结果展示

测试展示图
嘿嘿!先来看看结果视频
独木带你玩转彩屏——应用1驱动彩屏(寄存器spi版)_第15张图片
独木带你玩转彩屏——应用1驱动彩屏(寄存器spi版)_第16张图片
独木带你玩转彩屏——应用1驱动彩屏(寄存器spi版)_第17张图片
独木带你玩转彩屏——应用1驱动彩屏(寄存器spi版)_第18张图片

4. 获取资源

【获取资源】

1.资源链接:点击获取
2.关注微信公众号后台回复:SPI驱动彩屏

【注意】

资源中有彩屏文字显示测试、图片显示测试、还有图形显示测试。

后续笔者将更新彩屏文字显示等应用的文章
独木带你玩转彩屏——应用1驱动彩屏(寄存器spi版)_第19张图片
【关注微信公众号一起来交流】
独木带你玩转彩屏——应用1驱动彩屏(寄存器spi版)_第20张图片

·

你可能感兴趣的:(STM32学习笔记,stm32,驱动程序,彩屏,SPI,寄存器)