【STM32学习记录4】1.44寸TFT液晶屏显示字符、汉字和图片

您所在的位置:网站首页 tft与lcd 【STM32学习记录4】1.44寸TFT液晶屏显示字符、汉字和图片

【STM32学习记录4】1.44寸TFT液晶屏显示字符、汉字和图片

2023-09-18 21:30| 来源: 网络整理| 查看: 265

Author:AXYZdong自动化专业 工科男有一点思考,有一点想法,有一点理性

概述

MCU:某宝的STM32F407VET6最小系统板,点此详见外部资源:某宝的TFT液晶屏(下面会附上图片)文末有惊喜,希望可以坚持看下去

4.1硬件设计TFT正反面引脚说明

这里有个小疑问:为啥引出两个GND和NC?不知道制造商怎么想的?有知道的小伙伴可以私信我呢。

要注意一下,NC这个引脚是不需要接线的。LED:背光控制信号,如果不需要控制时,接电源+3.3V==关键词:SPI总线驱动==

4.2软件设计4.2.1编程要点

1、初始化GPIO口来模拟SPI,每个人设置的GPIO口不同,开发板与TFT接线也会不同。之后再设置液晶屏初始化。

2、TFT驱动程序,这里的驱动程序可以参考别人写的,然后自己再加以修改或者补充。驱动程序包括:向TFT写数据,设置TFT显示区域、设置TFT某点的颜色等等,具体的在代码里注释说明。

3、取模,包括文字取模和图片取模。根据自己的需要来取模。需要取模软件的可以私信我。(PS:其实这几个步骤和上一篇文章的OLED差不多的啦,只是修(fu)改(zhi)了一下)

4.2.2代码说明1、宏定义Lcd_Driver.h

#define RED    0xf800

#define GREEN   0x07e0

#define BLUE   0x001f

#define WHITE   0xffff

#define BLACK   0x0000

#define YELLOW  0xFFE0

#define GRAY0   0xEF7D        //灰色0 3165 00110 001011 00101

#define GRAY1   0x8410      //灰色1 00000 000000 00000

#define GRAY2   0x4208      //灰色2  1111111111011111

#define LCD_CTRL      GPIOB //定义TFT数据端口

#define LCD_LED        GPIO_Pin_9  //MCU_PB9--->>TFT --BL

#define LCD_SCL        GPIO_Pin_10 //PB13--->>TFT --SCL/SCK

#define LCD_SDA        GPIO_Pin_12 //PB15 MOSI--->>TFT --SDA/DIN

#define LCD_RS          GPIO_Pin_11 //PB11--->>TFT --RS/DC

#define LCD_RST        GPIO_Pin_14 //PB10--->>TFT --RST

#define LCD_CS        GPIO_Pin_13  //MCU_PB11--->>TFT --CS/CE

//#define LCD_CS_SET(x) LCD_CTRL->ODR=(LCD_CTRL->ODR&~LCD_CS)|(x ? LCD_CS:0)//液晶控制口置1操作语句宏定义

#define LCD_CS_SET  LCD_CTRL->BSRRL=LCD_CS    

#define LCD_RS_SET  LCD_CTRL->BSRRL=LCD_RS    

#define LCD_SDA_SET  LCD_CTRL->BSRRL=LCD_SDA    

#define LCD_SCL_SET  LCD_CTRL->BSRRL=LCD_SCL    

#define LCD_RST_SET  LCD_CTRL->BSRRL=LCD_RST    

#define LCD_LED_SET  LCD_CTRL->BSRRL=LCD_LED   

//液晶控制口置0操作语句宏定义

#define LCD_CS_CLR  LCD_CTRL->BSRRH=LCD_CS    

#define LCD_RS_CLR  LCD_CTRL->BSRRH=LCD_RS    

#define LCD_SDA_CLR  LCD_CTRL->BSRRH=LCD_SDA    

#define LCD_SCL_CLR  LCD_CTRL->BSRRH=LCD_SCL    

#define LCD_RST_CLR  LCD_CTRL->BSRRH=LCD_RST    

#define LCD_LED_CLR  LCD_CTRL->BSRRH=LCD_LED 

#define LCD_DATAOUT(x) LCD_DATA->ODR=x; //数据输出

#define LCD_DATAIN     LCD_DATA->IDR;   //数据输入

#define LCD_WR_DATA(data)

{\

LCD_RS_SET;\

LCD_CS_CLR;\

LCD_DATAOUT(data);\

LCD_WR_CLR;\

LCD_WR_SET;\

LCD_CS_SET;\

void LCD_GPIO_Init(void);

void Lcd_WriteIndex(u8 Index);

void Lcd_WriteData(u8 Data);

void Lcd_WriteReg(u8 Index,u8 Data);

u16 Lcd_ReadReg(u8 LCD_Reg);

void Lcd_Reset(void);

void Lcd_Init(void);

void Lcd_Clear(u16 Color);

void Lcd_SetXY(u16 x,u16 y);

void Gui_DrawPoint(u16 x,u16 y,u16 Data);

unsigned int Lcd_ReadPoint(u16 x,u16 y);

void Lcd_SetRegion(u16 x_start,u16 y_start,u16 x_end,u16 y_end);

void LCD_WriteData_16Bit(u16 Data);

2、TFT驱动文件Lcd_Driver.c

#include "stm32f4xx.h"

#include "Lcd_Driver.h"

#include "LCD_Config.h"

#include "delay.h"

//本程序使用的是模拟SPI接口驱动

//可自由更改接口IO配置,使用任意最少4 IO即可完成液晶驱动显示

接口定义在Lcd_Driver.h内定义,请根据接线修改并修改相应IO初始化LCD_GPIO_Init()

#define LCD_CTRL      GPIOB //定义TFT数据端口

#define LCD_LED        GPIO_Pin_9  //PB9--->>TFT --BL

#define LCD_RS          GPIO_Pin_10 //PB11--->>TFT --RS/DC

#define LCD_CS        GPIO_Pin_11  //PB11--->>TFT --CS/CE

#define LCD_RST      GPIO_Pin_12 //PB10--->>TFT --RST

#define LCD_SCL        GPIO_Pin_13 //PB13--->>TFT --SCL/SCK

#define LCD_SDA        GPIO_Pin_15 //PB15 MOSI--->>TFT --SDA/DIN

*******************************************************************************/

//液晶IO初始化配置

void LCD_GPIO_Init(void)

{

GPIO_InitTypeDef  GPIO_InitStructure;      

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB ,ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9| GPIO_Pin_10| GPIO_Pin_11| GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14| GPIO_Pin_15;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

GPIO_Init(GPIOB, &GPIO_InitStructure);

}

//向SPI总线传输一个8位数据

void  SPI_WriteData(u8 Data)

{

unsigned char i=0;

for(i=8;i>0;i--)

{

if(Data&0x80)

  LCD_SDA_SET; //输出数据

      else LCD_SDA_CLR;

      LCD_SCL_CLR;       

      LCD_SCL_SET;

      Data8);   //写入高8位数据

   SPI_WriteData(Data); //写入低8位数据

   LCD_CS_SET; 

}

void Lcd_WriteReg(u8 Index,u8 Data)

{

  Lcd_WriteIndex(Index);

  Lcd_WriteData(Data);

}

void Lcd_Reset(void)

{

LCD_RST_CLR;

delay_ms(100);

LCD_RST_SET;

delay_ms(50);

}

//LCD Init For 1.44Inch LCD Panel with ST7735R.

void Lcd_Init(void)

{

LCD_GPIO_Init();

Lcd_Reset(); //Reset before LCD Init.

//LCD Init For 1.44Inch LCD Panel with ST7735R.

Lcd_WriteIndex(0x11);//Sleep exit 

delay_ms (120);

//ST7735R Frame Rate

Lcd_WriteIndex(0xB1); 

Lcd_WriteData(0x01); 

Lcd_WriteData(0x2C); 

Lcd_WriteData(0x2D); 

Lcd_WriteIndex(0xB2); 

Lcd_WriteData(0x01); 

Lcd_WriteData(0x2C); 

Lcd_WriteData(0x2D); 

Lcd_WriteIndex(0xB3); 

Lcd_WriteData(0x01); 

Lcd_WriteData(0x2C); 

Lcd_WriteData(0x2D); 

Lcd_WriteData(0x01); 

Lcd_WriteData(0x2C); 

Lcd_WriteData(0x2D); 

Lcd_WriteIndex(0xB4); //Column inversion 

Lcd_WriteData(0x07); 

//ST7735R Power Sequence

Lcd_WriteIndex(0xC0); 

Lcd_WriteData(0xA2); 

Lcd_WriteData(0x02); 

Lcd_WriteData(0x84); 

Lcd_WriteIndex(0xC1); 

Lcd_WriteData(0xC5); 

Lcd_WriteIndex(0xC2); 

Lcd_WriteData(0x0A); 

Lcd_WriteData(0x00); 

Lcd_WriteIndex(0xC3); 

Lcd_WriteData(0x8A); 

Lcd_WriteData(0x2A); 

Lcd_WriteIndex(0xC4); 

Lcd_WriteData(0x8A); 

Lcd_WriteData(0xEE); 

Lcd_WriteIndex(0xC5); //VCOM 

Lcd_WriteData(0x0E); 

Lcd_WriteIndex(0x36); //MX, MY, RGB mode 

Lcd_WriteData(0xC8); 

//ST7735R Gamma Sequence

Lcd_WriteIndex(0xe0); 

Lcd_WriteData(0x0f); 

Lcd_WriteData(0x1a); 

Lcd_WriteData(0x0f); 

Lcd_WriteData(0x18); 

Lcd_WriteData(0x2f); 

Lcd_WriteData(0x28); 

Lcd_WriteData(0x20); 

Lcd_WriteData(0x22); 

Lcd_WriteData(0x1f); 

Lcd_WriteData(0x1b); 

Lcd_WriteData(0x23); 

Lcd_WriteData(0x37); 

Lcd_WriteData(0x00);

Lcd_WriteData(0x07); 

Lcd_WriteData(0x02); 

Lcd_WriteData(0x10); 

Lcd_WriteIndex(0xe1); 

Lcd_WriteData(0x0f); 

Lcd_WriteData(0x1b); 

Lcd_WriteData(0x0f); 

Lcd_WriteData(0x17); 

Lcd_WriteData(0x33); 

Lcd_WriteData(0x2c); 

Lcd_WriteData(0x29); 

Lcd_WriteData(0x2e); 

Lcd_WriteData(0x30); 

Lcd_WriteData(0x30); 

Lcd_WriteData(0x39); 

Lcd_WriteData(0x3f); 

Lcd_WriteData(0x00); 

Lcd_WriteData(0x07); 

Lcd_WriteData(0x03); 

Lcd_WriteData(0x10);  

Lcd_WriteIndex(0x2a);

Lcd_WriteData(0x00);

Lcd_WriteData(0x00);

Lcd_WriteData(0x00);

Lcd_WriteData(0x7f);

Lcd_WriteIndex(0x2b);

Lcd_WriteData(0x00);

Lcd_WriteData(0x00);

Lcd_WriteData(0x00);

Lcd_WriteData(0x9f);

Lcd_WriteIndex(0xF0); //Enable test command  

Lcd_WriteData(0x01); 

Lcd_WriteIndex(0xF6); //Disable ram power save mode 

Lcd_WriteData(0x00); 

Lcd_WriteIndex(0x3A); //65k mode 

Lcd_WriteData(0x05); 

Lcd_WriteIndex(0x29);//Display on  

}

/*************************************************

函数名:LCD_Set_Region

功能:设置lcd显示区域,在此区域写点数据自动换行

入口参数:xy起点和终点

返回值:无

*************************************************/

void Lcd_SetRegion(u16 x_start,u16 y_start,u16 x_end,u16 y_end)

{

Lcd_WriteIndex(0x2a);

Lcd_WriteData(0x00);

Lcd_WriteData(x_start+2);

Lcd_WriteData(0x00);

Lcd_WriteData(x_end+2);

Lcd_WriteIndex(0x2b);

Lcd_WriteData(0x00);

Lcd_WriteData(y_start+3);

Lcd_WriteData(0x00);

Lcd_WriteData(y_end+3);

Lcd_WriteIndex(0x2c);

}

/*************************************************

函数名:LCD_Set_XY

功能:设置lcd显示起始点

入口参数:xy坐标

返回值:无

*************************************************/

void Lcd_SetXY(u16 x,u16 y)

{

  Lcd_SetRegion(x,y,x,y);

}

/*************************************************

函数名:LCD_DrawPoint

功能:画一个点

入口参数:无

返回值:无

*************************************************/

void Gui_DrawPoint(u16 x,u16 y,u16 Data)

{

Lcd_SetRegion(x,y,x+1,y+1);

LCD_WriteData_16Bit(Data);

}    

/*****************************************

 函数功能:读TFT某一点的颜色                          

 出口参数:color  点颜色值                                 

******************************************/

unsigned int Lcd_ReadPoint(u16 x,u16 y)

{

  unsigned int Data;

  Lcd_SetXY(x,y);

  //Lcd_ReadData();//丢掉无用字节

  //Data=Lcd_ReadData();

  Lcd_WriteData(Data);

  return Data;

}

/*************************************************

函数名:Lcd_Clear

功能:全屏清屏函数

入口参数:填充颜色COLOR

返回值:无

*************************************************/

void Lcd_Clear(u16 Color)               

{

   unsigned int i,m;

   Lcd_SetRegion(0,0,X_MAX_PIXEL-1,Y_MAX_PIXEL-1);

   Lcd_WriteIndex(0x2C);

   for(i=0;i0)&0x1f;

  g=(c>>5)&0x3f;

  r=(c>>11)&0x1f;  

  rgb=(b



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3