基于stm32物联网开发板(2)--LCD屏幕

基于stm32物联网开发板(2)–LCD屏幕

  • LCD应用展示:

LCD屏幕应用


在这里插入图片描述

1.概述

  • 屏幕尺寸为1.3寸,分辨率240*240,颜色格式RGB565,驱动IC:ST7789VW;
  • 超大可视角度:大于160°(显示屏中可视角度最大的一种屏幕);
  • 宽电压供电(3V~5V),兼容3.3V和5V电平逻辑,无需电平转换芯片;
  • 采用7线制SPI接口;
  • 工作温度范围为工业级(-20℃~60℃);
  • 军工级工艺标准,长期稳定工作;

在这里插入图片描述

  • 硬件接口:
引脚说明
LEDKPB0背光
CSPA4片选
SCLPA5 时钟
SDAPA7主机输出
RESPB1 复位脚(电平复位)
D/CPC4 数据命令选择脚

2.通讯协议

  ST7789VW是一款用于262K彩色图形型TFT-LCD的单片机控制器/驱动器。它由720个源极线和320个栅极线驱动电路组成。该芯片能够直接连接到外部微处理器,并接受8位/9位/16位/18位并行接口。显示数据可以存储在240x320x18位的片上显示数据RAM。它可以执行显示数据RAM读/写操作,无需外部操作时钟,以最大限度地减少功耗。此外,由于集成电源驱动液晶所必需的电路;可以制造具有最少部件的显示系统。

2.1 SPI接口时序

  本次LCD屏幕采用SPI时序驱动,时序图如下:
在这里插入图片描述
  上升沿采样数据,下降沿发送数据。
  4线串行接口包括串行时钟SCLK,串行数据SDIN,数据命令选择D/C,片选CS。

u8 SPI_WriteReadByte(u8 dat_tx)
{
	u8 data_rx=0;
	SPI_CLK=0;//空闲电平为低电平
	for(i=0;i<8;i++)
	{
		SPI_CLK=0;//开始发送数据(主机和从机都发送数据)
		if(dat_tx&0x80)SPI_MOSI=1;
		else SPI_MOSI=0;
		SPI_CLK=1;//数据发送完成,开始读取数据
		dat_tx<<=1;//准备发送下一位数据
		//0x23--- 0010 0011
		data_rx<<=1;//默认读取到的数据为0
		if(SPI_MISO)data_rx=data_rx|0x01;
	}
	SPI_CLK=0;//空闲电平为低电平
	return data_rx;
}

2.2 硬件SPI配置

在这里插入图片描述
在这里插入图片描述

uint8_t SPI1_WROneByte(uint8_t data)
{
  HAL_SPI_Transmit(&hspi1,&data,1,100);
	return 0;
}

关于SPI硬件配置详细介绍参考:STM32 SPI硬件配置

2.2 写数据和写命令

  当采用SPI接口驱动时,D/C引脚作为数据命令选择脚,D/C=0时读写命令,D/C=1时读写数据。

/************************************************************
函数说明:LCD写入数据
入口数据:dat 写入的数据
返回值:  无
**************************************************************/
void LCD_WR_DATA(u16 dat)
{
    OLED_CS(0);
	OLED_DC_Set();//写数据
	LCD_Writ_Bus(dat>>8);
	LCD_Writ_Bus(dat);
    OLED_CS(1);
}

/****************************************************
函数说明:LCD写入命令
入口数据:dat 写入的命令
返回值:  无
*****************************************************/
void LCD_WR_REG(u8 dat)
{
    OLED_CS(0);
	OLED_DC_Clr();//写命令
	LCD_Writ_Bus(dat);
    OLED_CS(1);
}

3.常用命令介绍

  (1)设置屏幕扫描方向0x36
在这里插入图片描述

  • 参数说明:
    在这里插入图片描述
      (2)设置列(Column)地址0x2A

  0x2A指令用于设置列的起始地址和结束地址,XS<=XE。
在这里插入图片描述
  (3)设置行(ROW)地址0x2B

  0x2B指令用于设置行的起始地址和结束地址,YS<=YE。
在这里插入图片描述
  (4)写GRAM指令0x2C
  此命令用于将数据从MCU传输到帧存储器。接受此命令后,列寄存器和页寄存器将重置为起始列/起始页面位置。起始列/起始页的位置根据MADCTL设置而不同。发送任何其他命令都可以停止帧写入。
在这里插入图片描述

4.ST7789驱动序列

void Lcd_Init(void)
{
	OLED_RST_Clr();
	Delay_Ms(200);
	OLED_RST_Set();
	Delay_Ms(20);  
  //************* Start Initial Sequence **********// 
  LCD_WR_REG(0x36);
  if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x00);//横屏
  else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC0);//横屏
  else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x70);//竖屏
  else LCD_WR_DATA8(0xA0);//竖屏

  LCD_WR_REG(0x3A); 
  LCD_WR_DATA8(0x05);

  LCD_WR_REG(0xB2);
  LCD_WR_DATA8(0x0C);
  LCD_WR_DATA8(0x0C);
  LCD_WR_DATA8(0x00);
  LCD_WR_DATA8(0x33);
  LCD_WR_DATA8(0x33); 

  LCD_WR_REG(0xB7); 
  LCD_WR_DATA8(0x35);  

  LCD_WR_REG(0xBB);
  LCD_WR_DATA8(0x19);

  LCD_WR_REG(0xC0);
  LCD_WR_DATA8(0x2C);

  LCD_WR_REG(0xC2);
  LCD_WR_DATA8(0x01);

  LCD_WR_REG(0xC3);
  LCD_WR_DATA8(0x12);   

  LCD_WR_REG(0xC4);
  LCD_WR_DATA8(0x20);  

  LCD_WR_REG(0xC6); 
  LCD_WR_DATA8(0x0F);    

  LCD_WR_REG(0xD0); 
  LCD_WR_DATA8(0xA4);
  LCD_WR_DATA8(0xA1);

  LCD_WR_REG(0xE0);
  LCD_WR_DATA8(0xD0);
  LCD_WR_DATA8(0x04);
  LCD_WR_DATA8(0x0D);
  LCD_WR_DATA8(0x11);
  LCD_WR_DATA8(0x13);
  LCD_WR_DATA8(0x2B);
  LCD_WR_DATA8(0x3F);
  LCD_WR_DATA8(0x54);
  LCD_WR_DATA8(0x4C);
  LCD_WR_DATA8(0x18);
  LCD_WR_DATA8(0x0D);
  LCD_WR_DATA8(0x0B);
  LCD_WR_DATA8(0x1F);
  LCD_WR_DATA8(0x23);

  LCD_WR_REG(0xE1);
  LCD_WR_DATA8(0xD0);
  LCD_WR_DATA8(0x04);
  LCD_WR_DATA8(0x0C);
  LCD_WR_DATA8(0x11);
  LCD_WR_DATA8(0x13);
  LCD_WR_DATA8(0x2C);
  LCD_WR_DATA8(0x3F);
  LCD_WR_DATA8(0x44);
  LCD_WR_DATA8(0x51);
  LCD_WR_DATA8(0x2F);
  LCD_WR_DATA8(0x1F);
  LCD_WR_DATA8(0x1F);
  LCD_WR_DATA8(0x20);
  LCD_WR_DATA8(0x23);
  LCD_WR_REG(0x21); 
  LCD_WR_REG(0x11); 
  LCD_WR_REG(0x29);//开启显示 
  LCD_Clear(WHITE);//清屏
  OLED_BLK_Set();//开背光 
} 

5.LCD屏示例

5.1 横竖屏配置示例

  要实现屏幕横屏和竖屏效果,可设置屏幕扫描方向寄存器0x36。

#define USE_HORIZONTAL 0  //设置横屏或者竖屏显示 0或1为竖屏 2或3为横屏
/******************************************************************************
函数说明:设置起始和结束地址
入口数据:x1,x2 设置列的起始和结束地址
          y1,y2 设置行的起始和结束地址
返回值:  无
******************************************************************************/
void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2)
{
	if(USE_HORIZONTAL==0)
	{
		LCD_WR_REG(0x2a);//列地址设置
		LCD_WR_DATA(x1);
		LCD_WR_DATA(x2);
		LCD_WR_REG(0x2b);//行地址设置
		LCD_WR_DATA(y1);
		LCD_WR_DATA(y2);
		LCD_WR_REG(0x2c);//储存器写
	}
	else if(USE_HORIZONTAL==1)
	{
		LCD_WR_REG(0x2a);//列地址设置
		LCD_WR_DATA(x1);
		LCD_WR_DATA(x2);
		LCD_WR_REG(0x2b);//行地址设置
		LCD_WR_DATA(y1+80);
		LCD_WR_DATA(y2+80);
		LCD_WR_REG(0x2c);//储存器写
	}
	else if(USE_HORIZONTAL==2)
	{
		LCD_WR_REG(0x2a);//列地址设置
		LCD_WR_DATA(x1);
		LCD_WR_DATA(x2);
		LCD_WR_REG(0x2b);//行地址设置
		LCD_WR_DATA(y1);
		LCD_WR_DATA(y2);
		LCD_WR_REG(0x2c);//储存器写
	}
	else
	{
		LCD_WR_REG(0x2a);//列地址设置
		LCD_WR_DATA(x1+80);
		LCD_WR_DATA(x2+80);
		LCD_WR_REG(0x2b);//行地址设置
		LCD_WR_DATA(y1);
		LCD_WR_DATA(y2);
		LCD_WR_REG(0x2c);//储存器写
	}
}

5.2 图片显示

/******************************************************************************
函数说明:显示图片
入口数据:x1,y1    起点坐标
          width,height --图片宽高
          bmp --要显示的图片内容
返回值:  无
******************************************************************************/
void LCD_ShowPicture(u16 x1,u16 y1,u16 width,u16 height,u8*bmp)
{
    int i;
    LCD_WR_REG(0x2a);//列地址设置
    LCD_WR_DATA(x1);
    LCD_WR_DATA(x1+width-1);
		LCD_WR_REG(0x2b);//行地址设置
		LCD_WR_DATA(y1);
    LCD_WR_DATA(y1+height-1);
		LCD_WR_REG(0x2c);//储存器写
		for(i=0;i<width*height;i++)
	  { 	
			LCD_WR_DATA8(bmp[i*2]);	 
			LCD_WR_DATA8(bmp[i*2+1]);			
	  }
    LCD_WR_REG(0x2a);//列地址设置	
		LCD_WR_DATA(0);
    LCD_WR_DATA(LCD_W);
    LCD_WR_REG(0x2b);//行地址设置
    LCD_WR_DATA(0);
    LCD_WR_DATA(LCD_H);
}
  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用STM32控制显示屏显示的示例代码: #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" void delay_ms(uint32_t ms) { uint32_t i; for(i = 0; i < ms; i++) { uint32_t j; for(j = 0; j < 1000; j++); } } void lcd_write(uint8_t data) { GPIO_Write(GPIOA, GPIO_Pin_1, GPIO_Pin_RESET); // RS = 0 GPIO_Write(GPIOC, GPIO_Pin_0, GPIO_Pin_SET); // enable = 1 GPIO_Write(GPIOB, (data << 8)); // write data GPIO_Write(GPIOC, GPIO_Pin_0, GPIO_Pin_RESET); // enable = 0 } void lcd_init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; // Configure RS pin GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // Configure enable pin GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); // Configure data pins GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_Write(GPIOA, GPIO_Pin_1, GPIO_Pin_RESET); // RS = 0 GPIO_Write(GPIOC, GPIO_Pin_0, GPIO_Pin_RESET); // enable = 0 delay_ms(100); lcd_write(0x38); // 8-bit, 2-line display lcd_write(0x06); // auto-increment cursor lcd_write(0x0C); // display on, cursor off, blink off lcd_write(0x01); // clear display delay_ms(2); } void lcd_clear(void) { lcd_write(0x01); // clear display delay_ms(2); } void lcd_write_string(char *str) { while(*str != '\0') { lcd_write(*str); str++; } } int main(void) { lcd_init(); lcd_write_string("Hello, world!"); while(1); return 0; } 在上面的代码中,使用了GPIO口来控制显示屏的RS、enable和数据线。在初始化函数中,配置了这些GPIO口的输入输出模式,并且通过调用lcd_write函数来写入数据到显示屏中。lcd_init函数用于初始化显示屏,lcd_clear函数用于清空显示屏。在主函数中调用了这些函数,并且通过lcd_write_string函数来显示字符串。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT_阿水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值