学习记录:调用TFTLCD液晶屏 您所在的位置:网站首页 showchar 学习记录:调用TFTLCD液晶屏

学习记录:调用TFTLCD液晶屏

2024-01-28 04:51| 来源: 网络整理| 查看: 265

目录

前言

        一、TFT LCD简介 

        二、液晶屏的信号线与8080 接口

        三、TFTLCD 模块的使用流程

        四、软件设计

        4.1、常用的LCD函数

        4.1.1、LCD地址结构体

        4.1.2、清屏函数:void LCD_Clear(u16 color)

        4.1.3、填充函数:void LCD_Fill(u16 sx, u16 sy, u16 ex, u16 ey, u16 color)

        4.1.4、填充指定的颜色函数:void LCD_Color_Fill(u16 sx, u16 sy, u16 ex, u16 ey, u16 *color)

        4.1.5、画线函数:void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)

        4.1.6、画矩形函数:void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2)

        4.1.7、画圆函数:void LCD_Draw_Circle(u16 x0, u16 y0, u8 r)

        4.1.8、显示字符函数:void LCD_ShowChar(u16 x, u16 y, u8 num, u8 size, u8 mode) 

        4.1.9、写数字函数:void LCD_ShowNum(u16 x, u16 y, u32 num, u8 len, u8 size)

        4.1.10、写数字函数:void LCD_ShowxNum(u16 x, u16 y, u32 num, u8 len, u8 size, u8 mode)

        4.1.11、显示字符串的函数:void LCD_ShowString(u16 x, u16 y, u16 width, u16 height, u8 size, u8 *p)

        4.2、主函数的调用

本篇文章,着重是对lcd.c的应用函数进行说明。

 

前言

        显示器属于计算机的 I/O 设备,即输入输出设备。它是一种将特定电子信息输出到屏幕上再反射到人眼的显示工具。常见的有 CRT 显示器、液晶显示器、LED 点阵显示器及 OLED 显示器。 

        一、TFT LCD简介 

         液晶显示器,简称 LCD(Liquid Crystal Display),相对于上一代 CRT 显示器 (阴极射线管显示器), LCD 显示器具有功耗低、体积小、承载的信息量大及不伤眼的优点,因而它成为了现在的主流电子显示设备,其中包括电视、电脑显示器、手机屏幕及各种嵌入式设备的显示器。

        本液晶屏内部包含有一个液晶控制芯片 ILI9341,它的内部结构非常复杂。

 ILI9341 控制器内部框图

        该芯片最主核心部分是位于中间的 GRAM(Graphics RAM),它就是显存。GRAM 中每个存储单元都对应着液晶面板的一个像素点。它右侧的各种模块共同作用把 GRAM 存储单元的数据转化成液晶面板的控制信号,使像素点呈现特定的颜色,而像素点组合起来则成为一幅完整的图像。 

        框图的左上角为 ILI9341 的主要控制信号线和配置引脚,根据其不同状态设置可以使芯片工作在不同的模式,如每个像素点的位数是 6、16 还是 18 位;可配置使用 SPI 接口、8080 接口还是 RGB 接口与 MCU 进行通讯。MCU 通过 SPI、8080 接口或 RGB 接口与 ILI9341 进行通讯,从而访问它的控制寄存器 (CR)、地址计数器 (AC)、及 GRAM。 

        在 GRAM 的左侧还有一个 LED 控制器 (LED Controller)。LCD 为非发光性的显示装置,它需要借助背光源才能达到显示功能,LED 控制器就是用来控制液晶屏中的 LED 背光源。

        二、液晶屏的信号线与8080 接口

         ILI9341 控制器根据自身的 IM[3:0] 信号线电平决定它与 MCU 的通讯方式,它本身支持 SPI 及 8080 通讯方式,本液晶屏的 ILI9341 控制器在出厂前就已经按固定配置好 (内部已连接硬件电路),它被配置为通过 8080 接口通讯,使用 16 根数据线的 RGB565 格式。

TFTLCD 模块接口 管脚序号液晶屏管脚STM32管脚管脚功能1FSMC_NE4PG12LCD片选信号(低电平有效)2FSMC_A10PG0命令/数据控制信号,0:命令,1:数据3FSMC_NWEPD5写使能信号(低电平有效)4FSMC_NOEPD4读使能信号(低电平有效)5RESETNRST复位信号(低电平有效)6FSMC_D0PD14双向数据总线D07FSMC_D1PD15双向数据总线D18FSMC_D2PD0双向数据总线D29FSMC_D3PD1双向数据总线D310FSMC_D4PE7双向数据总线D411FSMC_D5PE8双向数据总线D512FSMC_D6PE9双向数据总线D613FSMC_D7PE10双向数据总线D714FSMC_D8PE11双向数据总线D815FSMC_D9PE12双向数据总线D916FSMC_D10PE13双向数据总线D1017FSMC_D11PE14双向数据总线D1118FSMC_D12PE15双向数据总线D1219FSMC_D13PD8双向数据总线D1320FSMC_D14PD9双向数据总线D1421FSMC_D15PD10双向数据总线D1522SD_CSPG6SD卡片选线23LCD_BLPB0LCD背光控制(1:点亮,0:关闭)243.3V3.3V电源供电253.3V3.3V电源供电26GNDGND电源地27GNDGND电源地285V5V电源供电29T_ M ISOPB2触摸屏SPI信号30T_ MOSIPF 9触摸屏SPI信号31T_PENPF10触摸屏中断信号32NCNC空33T_CSPF11触摸屏SPI片选信号34T_SCKPB1触摸屏SPI时钟信号

        ILI9341液晶控制器自带显存,其显存总大小为 172800(240*320*18/8),即 18 位模式(26 万色)下的显存量。在 16 位模式下,ILI9341 采用 RGB565 格式存储颜色数据,此时 ILI9341 的 18 位数据线与 MCU 的 16 位数据线以及 LCD GRAM 的对应关系,如图所示:

         ILI9341 在 16 位模式下面,数据线有用的是:D17~D13 和 D11~D1,D0 和 D12 没有用到,实际上在LCD 模块里面,ILI9341 的 D0 和 D12 没有引出来,ILI9341 的 D17~D13 和 D11~D1 对应 MCU 的 D15~D0。

          MCU 的 16 位数据,最低 5 位代表蓝色,中间 6 位为绿色,最高 5 位为红色。数值越大,表示该颜色越深。特别注意 ILI9341 所有的指令都是 8 位的(高 8 位无效),且参 除了读写 GRAM 的时候是 16 位,其他操作参数,都是 8 位的。要调用哪个颜色就令它对应的数据地址等于1就可以了。

        三、TFTLCD 模块的使用流程

         (1)设置 STM32F1 与 TFTLCD 模块相连接的 IO 。这一步,先将我们与 TFTLCD 模块相连的 IO 口进行初始化,以便驱动 LCD。这里用到的是 FSMC,FSMC 在 《STM32学习笔记》专栏,已经详细介绍了。

        (2)初始化 TFTLCD 模块。将 TFTLCD的 RST 同STM32F1的RESET连接在一起了,只要按下开发板的 RESET 键, 就会对 LCD 进行硬复位。

        初始化序列,就是向 LCD 控制器写入一系列的设置值(比如伽马校准)这些初始化序列一般 LCD 供应商会提供给客户。在初始化之后,LCD 才可以正常使用。

        (3)通过函数将字符和数字显示到 TFTLCD 模块上。即:设置坐标→写 GRAM 指令→写 GRAM来实现, 但是这个步骤,只是一个点的处理,要显示字符/数字,就必须要多次使用这个步骤,从而达到显示字符/数字的目的,需要设计一个函数来实现数字/字符的显示,之后调用该函数, 就可以实现数字/字符的显示了。

        四、软件设计         4.1、常用的LCD函数         4.1.1、LCD地址结构体

结构体如下:

//写寄存器 //LCD_Reg:寄存器地址 //LCD_RegValue:要写入的数据 void LCD_WriteReg(u16 LCD_Reg,u16 LCD_RegValue) { LCD->LCD_REG = LCD_Reg; //写入要写的寄存器序号 LCD->LCD_RAM = LCD_RegValue;//写入数据 }

         写完REG寄存器地址后,RAM地址自增+1。

        4.1.2、清屏函数:void LCD_Clear(u16 color)

函数代码如下:  

void LCD_Clear(u16 color) { u32 index = 0; u32 totalpoint = lcddev.width; totalpoint *= lcddev.height; //得到总点数 LCD_SetCursor(0x00, 0x0000); //设置光标位置 LCD_WriteRAM_Prepare(); //开始写入GRAM for (index = 0; index < totalpoint; index++) { LCD->LCD_RAM=color; } }         4.1.3、填充函数:void LCD_Fill(u16 sx, u16 sy, u16 ex, u16 ey, u16 color)

 函数代码如下:  

void LCD_Fill(u16 sx, u16 sy, u16 ex, u16 ey, u16 color) { u16 i, j; u16 xlen = 0; xlen = ex - sx + 1; for (i = sy; i LCD_RAM=color; //设置光标位置 } } }         4.1.4、填充指定的颜色函数:void LCD_Color_Fill(u16 sx, u16 sy, u16 ex, u16 ey, u16 *color)

  函数代码如下: 

void LCD_Color_Fill(u16 sx, u16 sy, u16 ex, u16 ey, u16 *color) { u16 height, width; u16 i, j; width = ex - sx + 1; //得到填充的宽度 height = ey - sy + 1; //高度 for (i = 0; i < height; i++) { LCD_SetCursor(sx, sy + i); //设置光标位置 LCD_WriteRAM_Prepare(); //开始写入GRAM for (j = 0; j < width; j++) { LCD->LCD_RAM=color[i * width + j]; //写入数据 } } }         4.1.5、画线函数:void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)

   函数代码如下: 

void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2) { u16 t; int xerr = 0, yerr = 0, delta_x, delta_y, distance; int incx, incy, uRow, uCol; delta_x = x2 - x1; //计算坐标增量 delta_y = y2 - y1; uRow = x1; uCol = y1; if (delta_x > 0)incx = 1; //设置单步方向 else if (delta_x == 0)incx = 0; //垂直线 else { incx = -1; delta_x = -delta_x; } if (delta_y > 0)incy = 1; else if (delta_y == 0)incy = 0; //水平线 else { incy = -1; delta_y = -delta_y; } if ( delta_x > delta_y)distance = delta_x; //选取基本增量坐标轴 else distance = delta_y; for (t = 0; t distance) { xerr -= distance; uRow += incx; } if (yerr > distance) { yerr -= distance; uCol += incy; } } }         4.1.6、画矩形函数:void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2)

    函数代码如下: 

void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2) { LCD_DrawLine(x1, y1, x2, y1); LCD_DrawLine(x1, y1, x1, y2); LCD_DrawLine(x1, y2, x2, y2); LCD_DrawLine(x2, y1, x2, y2); }         4.1.7、画圆函数:void LCD_Draw_Circle(u16 x0, u16 y0, u8 r)

     函数代码如下: 

void LCD_Draw_Circle(u16 x0, u16 y0, u8 r) { int a, b; int di; a = 0; b = r; di = 3 - (r = height)break; //退出 LCD_ShowChar(x, y, *p, size, 0); x += size / 2; p++; } }         4.2、主函数的调用

主函数main,如下所示: 

#include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "lcd.h" #include "usart.h" int main(void) { u8 x=0; u8 lcd_id[12]; //存放LCD ID字符串 delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为115200 LED_Init(); //LED端口初始化 LCD_Init(); POINT_COLOR=RED; sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);//将LCD ID打印到lcd_id数组。 while(1) { switch(x) { case 0:LCD_Clear(WHITE);break; case 1:LCD_Clear(BLACK);break; case 2:LCD_Clear(BLUE);break; case 3:LCD_Clear(RED);break; case 4:LCD_Clear(MAGENTA);break; case 5:LCD_Clear(GREEN);break; case 6:LCD_Clear(CYAN);break; case 7:LCD_Clear(YELLOW);break; case 8:LCD_Clear(BRRED);break; case 9:LCD_Clear(GRAY);break; case 10:LCD_Clear(LGRAY);break; case 11:LCD_Clear(BROWN);break; } POINT_COLOR=RED; LCD_ShowString(30,40,210,24,24,"Follow me ^_^"); LCD_ShowString(30,70,200,16,16,"wlcome my space"); LCD_ShowString(30,90,200,12,12,"bitter tea seeds"); LCD_ShowString(30,110,200,16,16,lcd_id); //显示LCD ID LCD_ShowString(30,130,200,12,12,"2022/7/17"); x++; if(x==12)x=0; LED0=!LED0; delay_ms(1000); } }


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有