LCD部分

  • 基础理论知识

1.1涉及ARM硬件资源简介

1.1.1 LCD中ILI934液晶控制器简介

本LCD内部包含有一个液晶控制芯片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背光源。

1.1.2液晶屏的信号线及 8080 时序

ILI9341 控制器根据自身的 IM[3:0] 信号线电平决定它与 MCU 的通讯方式,它本身支持 SPI 及 8080 通讯方式,本示例中液晶屏的 ILI9341 控制器在出厂前就已经按固定配置好 (内部已连接硬 件电路),它被配置为通过 8080 接口通讯,使用 16 根数据线的 RGB565 格式。内部硬件电路连 接完,剩下的其它信号线被引出到 FPC 排线,最后该排线由 PCB 底板引出到排针,排针再与实 验板上的 STM32 芯片连接,如图液晶屏引出的信号线。

图一:液晶屏引出的信号线

写命令时序由片选信号 CSX 拉低开始,对数据/命令选择信号线 D/CX 也置低电平表示写入的是命令地址 (可理解为命令编码,如软件复位命令:0x01),以写信号 WRX为低,读信号RDX为高表示数据传输方向为写入,同时,在数据线 D[17:0](或 D[15:0]) 输出命令地址,在第二个传输阶段传送的是命令的参数,所以 D/CX 要置高电平,表示写入的是命令数据,命令数据是某些指令带有的参数,如复位指令编码为 0x01,它后面可以带一个参数,该参数表示多少秒后复位。

1.1.3模拟 8080 接口时序

ILI9341 的 8080 通讯接口时序可以由 STM32 使用普通 GPIO 进行模拟,对于具有 FSMC 外设的 高型号 STM32,还能直接使用 FSMC 接口实现 8080 时序,像访问内部变量一样控制液晶屏。

二、硬件设计

4.3 LCD功能设计与实现

屏幕的 PCB 底板引出的信号线会通过 PCB 底板上的 FPC 接口与液晶面板连接,这些信包括液晶 控制相关的 CS、RS 等信号及 DB0-DB15 数据线,其中 RS 引脚以高电平表示传输数据,低电平 表示传输命令;另外还有引出 LCD_BK 引脚用于控制屏幕的背光供电,可以通过该引脚控制背 光的强度,该引脚为低电平时打开背光。如图为LCD原理图

图二:LCD原理图

三、软件设计

4.2 LCD显示的功能设计与实现

4.2.1串行模式驱动LCD

1.首先CS片选一直为高电平期间,LCD可接受数据或指令。

2.随后,单片机要给出数据传输起始位,这里是以5个连续的“1”作数据起始位,如模块接收到连续的5个“1”,则内部传输被重置并且串行传输将被同步。

3.紧接的两个位指定传输方向(RW,用于选择数据的传输方向,1是读数据,0是写数据)以及传输性质(RS,用于选择内部数据寄存器或指令寄存器,0是命令寄存器,1是数据寄存器)最后的第8位固定为“0”。到此第一个字节/数据传输起始位发送完成。

4.在接收到起始位及“RW”和“RS”的第1个字节后,之后便开始传输指令或者数据,在传输过程中会进行拆分处理,该字节将被分为2个字节来传输或接收。

5.你想发送的数据或指令的高4位,被放在发送的第2个字节串行数据的高4位,其低4位则置为“0”;数据或指令的低4位被放在第3个字节的高4位,其低4位也置为“0”,如此完成一个字节指令或数据的传送。

6 完成一个字节数据的发送需要24个时钟周期 因为1个字节实际是发送了3个字节 (3x8)。只有在时钟线SCLK拉低时,数据线SID上的数据才允许变化,在时钟线SCLK高电平时,SID上的数据必须保持稳定。

4.2.2 LCD程序设计

LCD初始化:

1.在开电之后,首先要等待40ms以上,等待液晶自检,使LCD系统复位完成。

2.之后便是功能的设定选择基本指令集或者扩充指令集随后延时等待100us以上。

3.功能设定2 选择8bit数据流 或者 4bit数据流  随后延时37us以上。

4.开关显示是否打开显示开关随后延时100us以上。

5.清屏清空RAM并初始化光标位置随后延时10us以上。

6.进入模式选择也就是设定游标相对于上一个位置的移位默认为地址自动+1。

7.之后初始化完成,可以对LCD进行数据的写入或读取。

#define WRITE_CMD   0xF8//写命令  

#define WRITE_DAT   0xFA//写数据

//接口(SID: PE1  SCLK: PE0)

#define SID PEout(1)

#define SCLK PEout(0)

void lcd_GPIO_init()

{

GPIO_InitTypeDef  GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOE时钟

//GPIOE0,E1初始化设置

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz

GPIO_InitStructure.GPIO_PuPd =  GPIO_PuPd_NOPULL;//无上拉

GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化

SID=1;

SCLK=1;

}

LCD写入字符或汉字:

/* 字符显示RAM地址    4行8列 */

uint8_t LCD_addr[4][8]={

{0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87},       //第一行

{0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97},       //第二行

{0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F},       //第三行

{0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F}        //第四行

};

void LCD_Display_Words(uint8_t x,uint8_t y,uint8_t*str)

{

Lcd_WriteCmd(LCD_addr[x][y]); //写初始光标位置

while(*str>0)

{

Lcd_WriteData(*str);    //写数据

str++;

}

}

显示背景颜色:

在指定区域内填充单个颜色(sx,sy),(ex,ey):填充矩形对角坐标,区域大小为:(ex-sx+1)*(ey-sy+1)color:要填充的颜色。

void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color)

{

u16 i,j;

u16 xlen=0;

u16 temp;

if((lcddev.id==0X6804)&&(lcddev.dir==1))    //6804横屏的时候特殊处理  

{

temp=sx;

sx=sy;

sy=lcddev.width-ex-1;

ex=ey;

ey=lcddev.width-temp-1;

lcddev.dir=0;

lcddev.setxcmd=0X2A;

lcddev.setycmd=0X2B;

LCD_Fill(sx,sy,ex,ey,color);

lcddev.dir=1;

lcddev.setxcmd=0X2B;

lcddev.setycmd=0X2A;

}else

{

xlen=ex-sx+1;

for(i=sy;i<=ey;i++)

{

LCD_SetCursor(sx,i);                    //设置光标位置

LCD_WriteRAM_Prepare();                 //开始写入GRAM    

for(j=0;j<xlen;j++)LCD->LCD_RAM=color;  //显示颜色      

}

}

}

LCD清屏:

首先写入DDRAM对应初始游标位置,然后在该位置写入字符串 写一个字节之后,DDRAM对应游标地址就自动+1到下一个游标位置继续写,直到字符串空为止。

void LCD_Clear(void)

{

Lcd_WriteCmd(0x01);         //清屏指令

delay_ms(2);                //延时以待液晶稳定【至少1.6ms】

}

字模的构成:

已知字模是图形数据,而图形在计算机中是由一个个像素点组成的,所以字模实质是一个个像素 点数据。为方便处理,我们把字模定义成方块形的像素点阵,且每个像素点只有 0 和 1 这两种状 态 (可以理解为单色图像数据)。见图字模 ,这是两个宽、高为 16x16 的像素点阵组成的两个汉字 图形,其中的黑色像素点即为文字的笔迹。计算机要表示这样的图形,只需使用 16x16 个二进制 数据位,每个数据位记录一个像素点的状态,把黑色像素点以“1”表示,无色像素点以“0”表 示即可。这样的一个汉字图形,使用 16x16/8=32 个字节来就可以记录下来。

/*------------------------------------------------------------

 ; 宽 × 高(像素): 16×16

 ; 字模格式/大小 : 单色点阵液晶字模,横向取模,字节正序/32 字节

 ----------------------------------------------------------*/

unsigned char code Bmp003[]=

{

0x02,0x00,0x01,0x00,0x3F,0xFC,0x20,0x04,0x40,0x08,0x1F,0xE0,0x00,0x40,0x00

,→0x80,0xFF,0xFF,0x7F,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,

0x02,→0x00,

};

小结:我们通过串行模式驱动LCD、对LCD初始化、定义清屏函数、LCD坐标设置函数、LCD画点函数LCD字符显示函数、正确取字模等操作、最后成功运行LCD屏幕。

四、系统测试与功能验证

下载验证

LCD与系统联调成功,正常显示字数和日期,背景为白色,计时模式数字运行正常。

五、过程记录

1、在LCD代码的移植时改变管脚时要注意stm32中A、B管脚中有一部分管脚与烧录有关(例如B04),因此常要在启动前加入代码(一般建议不要用这几号管脚),我选择避开这些管脚。

2、使用B08-B15当发现无法显示时,使用硬件仿真发现程序死在检测忙时状态(即检查DB7),网上摘录的程序是并行数据口DB0-DB7使用的是推挽输出,但因为使用并行方式,需要读取也需要写入,因此最合适的应该是开漏输出(具体介绍自查)。

3、在字体能成功输出,但是字体却与输入的字体对不上时,先别怀疑自己,这已经离成功非常接近了。可以通过硬件仿真跟踪每一步的过程,看输入的字符是否转换的字码是否正确,运行到显示输出时,观察屏幕输出的字码是否与你输入的一样(这时可能会出现为什么直接运行时不一样,但是仿真时却是一样呢?),这时,需要关注时序表(我是对比两个不同的程序码发现),我的LCD_Write_Cmd与LCD_Write_Dat没有在适当的位置延时,查资料可得每条指令发送的时间不能少于73微秒。我怀疑时32发送得太快,而lcd没反应过来。事实证明加入延时delay_ms(2)后字体显示正常。

STM32驱动SPI LCD屏幕相关推荐

  1. HAL库的STM32单片机LTDC驱动显示LCD屏幕

    本文基于STM32H750核心,学习使用LTDC外设,用CubeMX创建HAL库工程,驱动显示LCD屏幕.LCD屏采用AT070TN83. 文末有工程链接. 目录 一.CubeMX生成工程 LCD屏的 ...

  2. stm32 驱动 TFT LCD

    LCD/LCM的基本概念 液晶显示器(Liquid Crystal Display: LCD)的构造是在两片平行的玻璃当中放置液态的晶体,两片玻璃中间有许多垂直和水平的细小电线,透过通电与否来控制杆状 ...

  3. STM32驱动ST7789V2 tft屏幕

    一 . 简介 本次教程使用的是1.54寸240*240像素的tft屏幕,其接口协议为SPI协议.在使用的过程中仅需要四根数据即可驱动点亮屏幕.然后硬件使用的是STM32F103C8T6核心板,用的是S ...

  4. rk3328 rk3399使用fbtft驱动SPI LCD显示

    rk3328-jd4核心板  LCD lli9341驱动芯片 1.修改编译配置文件,将fbtft编进内核 参考:https://blog.csdn.net/jklinux/article/detail ...

  5. 基于WT2003H语音芯片在LCD屏幕驱动的应用实例解析

    基于WT2003H语音芯片在LCD屏幕驱动的应用实例解析 随着现代生活节奏的加快,简单快捷的产品越来越受到人们的青睐,产品也越来越注重人机交互和简单明了的用户体验,一款具备LCD屏幕的产品往往更具有竞 ...

  6. stm32 驱动 触摸屏

    由于智能手机的发展和大屏幕的兴起,触摸屏已经得到了广泛的应用.触摸屏分为两种:电阻触屏   俗称"软屏":电容触屏俗称"硬屏". 电阻触摸屏的屏体部分是一块多层 ...

  7. 传感器实验——LCD屏幕测试

    传感器实验--LCD屏幕测试 LCD屏幕测试 所选设备 1.54寸液晶屏st7789 spi 工作原理 接线说明 示例程序 小车基本做完了,后面我们在搞事情.现在来测试一下屏幕.用屏幕来做一些事情吧 ...

  8. 单片机:STM32F4x HAL库软硬SPI驱动ST7735s 1.8寸LCD屏幕

    单片机:STM32F4x HAL库软硬SPI驱动ST7735s 1.8寸LCD屏幕 说明:此篇为学习记录.可能存在错误或者不足.如有问题请指出. 硬件环境 主控芯片:STM32F411CEU6 主控开 ...

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

    基于stm32物联网开发板(2)–LCD屏幕 LCD应用展示: LCD屏幕应用 1.概述 屏幕尺寸为1.3寸,分辨率240*240,颜色格式RGB565,驱动IC:ST7789VW: 超大可视角度:大 ...

  10. stm32【 1.3寸LCD屏幕(2)】

    1.3寸LCD屏幕 显示图片 测试平台:STM32F103RFT6 库版本:官方标准库3.5.0版本 屏幕:中景园1.3寸24Pin接插式LCD屏幕 分辨率:240*240像素 驱动芯片:ST7789 ...

最新文章

  1. IBM迎来新任CEO,又一美国科技巨头被印度裔掌舵
  2. Excel:5种判断奇数和偶数的方法
  3. 微信小程序开发系列六:微信框架API的调用
  4. 数字信号处理基础----拉普拉斯变换与Z变换
  5. xrd连续扫描和步进扫描_多晶XRD步进扫描与连续扫描介绍
  6. 有哪些值得推荐的PS(Adobe Photoshop)插件?
  7. 随心所遇,随遇而安。
  8. 高通正式开源 aptX 和 aptX HD 编码器
  9. lol 如何进行拉扯
  10. 信息安全与管理2002_李付贵
  11. 软考网络工程师如何复习?
  12. HBase系列从入门到精通(一)
  13. getElementsByTagName的用法(附实例)
  14. Docker 环境下 Prometheus 和 Grafana 监控 Mysql
  15. 互联网史上最具影响力的50个人
  16. C语言中的选择结构语句
  17. 第一次写计算机论文无从下手怎么办?(一) - 易智编译easeediting
  18. Mac电脑使用EasyAR45的注意事项
  19. Python数据类型(二)文本类型-str
  20. Java Object类型如何转换为其它类型呢?

热门文章

  1. VMware虚拟机中大小写不停切换的问题
  2. 算法工程师面试基础题目及答案
  3. FME实现三调地类变化流量表制作
  4. 微擎使用腾讯地图拾取坐标
  5. 华为推送:应用中的百度地图jar包和华为Push SDK中的百度地图相冲突
  6. 超高频RFID通道门禁 仓储物流收发货系统应用
  7. s3c2416运行JAVA_实时时钟RTC - 基于S3C2440的Linux-3.6.6移植_Linux编程_Linux公社-Linux系统门户网站...
  8. 怎么制作自己的压缩软件
  9. SBI集团“逆市”入股玖富,背后意味着什么?|一点财经
  10. 安装绿色版本XShell6