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