基于STM32的OLED与TFTLCD详解1(IC驱动及FSMC初探)

好久不见. 提交于 2019-12-01 06:59:33

基于STM32的OLED与TFTLCD详解

       最近用到显示屏就对OLED与TFTLCD屏进行一定的研究,查看网上相关文献虽多,却有很多地方我自认为讲的不是很详细,在此有一定收获,分享给大家,同时记录自己学习液晶屏笔记,若有大神勿喷,同时真心希望大家以后无论是51还是ARM都可以随心所欲的操作OLED与TFTLCD显示屏,文中有错误的地方欢迎大家指出,让我不再一直错下去,谢谢大家。文中第零章主要介绍运用OLED和TFTLCD的初步思路,相信大家和我一样也是需要把系统中每个步骤想清楚才能进行代码编写或者系统的构建,所以初步思路就很重要。第一章主要介绍OLED模块的使用,包括8080并口和SSD1306驱动器。第二章主要讲述TFTLCD使用包括FSMC、IC9341(PS一句,文中所涉及代码为基于库函数编写的)

第零篇 OLED与TFTLCD编写思路初探

一、OLED

OLED编写思路初略为硬件连接,确定8080并口传输时序,根据SSD1306命令对OLED进行初始化,根据硬件连接初始化GPIO接口,根据读写时序编写写数据命令函数,再写刷新显存到OLED的函数,最后写画点函数和写字符函数。


第一篇 OLED(0.96寸128X64)

一、OLED简介

      OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示。其由于通知具备自发光,不需要光源,对比度高、厚度薄、视角广,反应速度快,可用于绕曲性面板、使用温度范围广、构造及制造较简单等优异特性,被认为是下一代的平面实现其新兴技术。我们都知道LCD都需要背光,OLED不需要,因为它是自发光。目前OLED很难做到大型化,但分辨率可以做到很高。
(参考百度百科:http://baike.baidu.com/link?url=gPJYhnIGs8W4xDYUwQUGoqnPMuOAuIqnYXhelbFFgqosJe3TL7IFVrW_U1JFluhL2qNWJgvdc5EKieGK501i4a)
文中所用到OLED屏幕如下图所示:
图一
这是一块采用8080并口,0.96寸分辨率为128*64的OLED屏幕,当然若有需要的读者可以尝试采用SPI和IIC接口方式编写。

二、8080并口简介

     本文重点讲述采用8080并口的,后续会有关于SPI和IIC接口方式的文章出来,请大家敬请期待。下面首先介绍该
图二

使用8080并口大体思路如下,先根据命令还是数据设置DC信号线,然后拉低片选,选中SSD1306驱动器,接着根据读数据还是写置读写信号线为低,在RD上升沿到来后把数据锁存到数据接口,WR上升沿到来把数据写入SSD1306里。SSD1306的8080并口时序图如下,详细了解可以去SSD1306datasheet里查看:

图三RD 读时序图

图四 WR时序图

图五 控制信号线状态功能表


      若有暂时不会读时序图的读者,图五里面详细说明了如何看时序图,以读数据时序为例,CS先拉低片选,DC至高,WR状态为H,RD上升沿来到时数据锁存数据到8080并口即可。

三、SSD1306简述

SSD1306OLED驱动器,显存大小总共为128X64bit大小,并且把这些显存分为8页如下图所示。因此在编写代码过程中可以直接建立相对应的矩阵即可一次性刷新显存到OLED中。

图六 SSD1306显存分配
SSD1306拥有各种各样的命令,这里介绍一下常用的几个命令分别是0x81,0xAE/0xAF,0X 8D,0XB0~B7,0X00-0X0F,0X10-1F.第一个命令设置对比度包含两个字节,第一个字节0x81为命令,第二个字节为设置对比度的值。第二个命令0xAE/AF,为显示开关,AE开AF关。第三个命令电荷泵设置命令0X8D,第二个为命令字,模块初始化需要开启不然屏幕不显示。第三个命令为页地址设置命令,低三位有效,最后两个为显示是的其实列地址低四位和高四位。

四、程序简介

由于基于库函数编写,第一个函数OLED_Init();函数主要包含两个部分,OLED相关管脚连线的GPIO初始化和时钟使能,第二部分,根据OLED厂家提供的初始化代码对OLED进行初始化。这部分OLED厂家会提供,相信OLED初始化难不倒大家,下面主要介绍操作OLED四个重要函数,第一个OLED_WR(u8 dat,u8 cmd),该函数主要是控制向驱动器写入命令还是数据。函数如下所示:
void OLED_WR(u8 dat,u8 cmd){
DATAOUT(dat);//把数据放PC.0~7口
OLED_RS=cmd;//1表示数据
OLED_CS=0;
OLED_WR=0;
OLED_WR=1;
OLED_CS=1;
OLED_RS=1;
}
可以看到这就是把上面讲到的8080并口时序用代码实现了一遍,函数体中的采用宏定义好的GPIO接口,根据你用MCU的GPIO采用位带操作或者库函数操作都行。
下面是一个把我们自己定义的显存GRAM[128][8],刷新到SSD1306从而显示的函数。
void OLED_RefreshGrm(void)
{
u8 i,j;   
for(i=0;i<8;i++)  
{  
OLED_WR (0xb0+i,OLED_CMD);    //设置页地址(0~7)
OLED_WR (0x00,OLED_CMD);      //设置显示位置—列低地址
OLED_WR (0x10,OLED_CMD);      //设置显示位置—列高地址   
for(j=0;j<128;j++)OLED_WR(OLED_GRAM[n][i],OLED_DATA); //下次来试一下反过来的

}
其中OLED_CMD=0,OLED_DATA=1.i代表页,j代表列,每一页代表OLED上占八行。把相应的值写入显示器显存,从而显示。
下面介绍第三个重要函数画点函数,假设我们要设置x=120,y=30,且这个点写入1,即点亮点阵中一个二极管。则如下实现:
OLED_GRAM[120][4]|=1<<(7-30%8)=1<<1,这里是因为点阵取摸方式是D7-D0,即在每一页高位在上,低位在下。要理解这一点,画点就没问题。公式已经给出大家可以尝试写一下。
最后说一个重要函数,现在我们只知道画点,而不能显示其他,要想显示字符就必须要用到字库,这里可以采用很多取摸软件进行取摸,不过一定要设置为C51模式,逐列式,顺向高位在前低位在后,阴码即可。这里给出核心实现方式:

for(t=0;t<size;t++)
    {   
if(size==12)temp=asc2_1206[chr][t]; //调用1206字体
。。。。
        调用字库
        for(t1=0;t1<8;t1++)
{
if(temp&0x80)OLED_DrawPoint(x,y,mode);//这里采用每次取最高位依次画点。然后根据是否画完进行横坐标的转变。
else OLED_DrawPoint(x,y,!mode);
temp<<=1;
y++;
if((y-y0)==size)
{
y=y0;
x++;
break;
}
}    
    }   

第二篇 TFTLCD(2.8寸320X240)

一、TFTLCD简介

 TFT(Thin Film Transistor)即薄膜场效应晶体管。所谓薄膜晶体管,是指液晶显示器上的每一液晶象素点都是由集成在其后的薄膜晶体管来驱动。从而可以做到高速度、高亮度、高对比度显示屏幕信息。TFT属于有源矩阵液晶显示器。(参考http://baike.baidu.com/link?url=HBNiO_VsdxPs-NWltenpj6lpIvHBwZxRjVzAB0XpLcCVXQq02gy5n1tWWObSDXq5_i1EBea4YvK6XlCeDHnLcffZyYq_o_g6z-WsMQPc41B5v0ewW_AUfUxLNtSYodNFS5Y_LY-UTnr-4WeU-LtqRa)文中所用LCD为2.8寸自带触摸屏,320X240,接口为16位8080并口LCD模块。同时这块模块支持65K色显示,采用IL9341驱动器。下面介绍80并口信号线:
CS:TFTLCD片选信号
WR:向TFTLCD写入数据信号线
RD:读取数据
D[15:0]:16位双向数据线
RST:硬复位
RS:命令数据标志位,0读写命令,1读写数据。

二、IL9341简介

这里用到驱动器当时很诧异为什么需要9341之类的驱动器,于是去大概了解了一下TFTLCD制造原理就明白了,直接用IO口是不可能达到点亮LCD屏幕的物理条件,如电流电压就这么简单的理解。面开始介绍9341基本知识。

先IL9341液晶控制器自带显存,其显存大小为172800(240*320*18/8),即18位模式下的显存量,在16位模式下IL9341采用RGB565格式存储,对应的如下图:


图一 RGB565
图中红色绿色蓝色,分别对应相应接口线,D12和D0没有用到。比如我们要写入红色那么写入0XF800即为红色。下面介绍9341常用命令,指令都是八位的,下面介绍6个指令,0XD3,0X36,0X2A,0X2B,0X2C,0X2E.文中只简单介绍用途,详细请参考IL9341datasheet。
第一个指令0XD3是读驱动器型号ID的,如果你知道该模块的驱动器型号就没有必要关注这个,若有很多不同种类的驱动器就必须要关注,因为这个是用于区别不同驱动器的最关键参数。
0X36,这是存储访问控制命令,即控制存储器的读写指针增长方向,可以简单理解为LCD扫描方式,比如从左到右,从上到下,当然这个指令后面跟随的是一个只用了低八位的参数,可以产生巴中不同方式扫描。
0X2A设置列地址设置命令,0X2B行地址设置命令0X2C和0X2E分别为写GRAM和读GRAM命令。这里需要注意的是读GRAM命令,在后续代码中若遇到要读GRAM,需要进行组合为RGB形式,因为读出来模式为R1G1->B1R2......,详情可以看datasheet。
其实讲述到这里没有FMSC的MCU可以进行软件编写了,流程为,硬复位,初始化LCD,设置坐标,写GRAM指令,写颜色和数据,显示,要读GRAM指令,读出颜色。即可。
但本文采用FSMC故下面还会介绍FSMC,这里运用FSMC可以大大简化LCD控制代码,很多时候不需要像OLED代码那样需要我们自己控制8080并口时序,这个时序由FSMC自己控制。而且可以加快LCD显示速度。

三、FSMC简介

FSMC,即灵活的静态存储控制器,能够同步或异步存储器和16位PC存储器卡项链,STM32103系列接口支持,SRAM,NANDFLASH ,NOR FLASH和PSRAM等大概浏览如下图:


图二FSMC可用接口
这里我们把TFTLCD当成一块SRAM用,我们知道存储器最重要两组线,地址线和数据线,文中LCD包含数据线,但没有地址线,但我们有RS命令和数据控制线,这样我们可以理解为地址线。

四、程序设计简介

第三篇 TFTLCD与OLED对比总结


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!