历史上的今天
返回首页

历史上的今天

今天是:2025年04月17日(星期四)

正在发生

2018年04月17日 | 基于STM32的OLED与TFTLCD详解1(IC驱动及FSMC初探)

2018-04-17 来源:eefocus

基于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    {   
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命令和数据控制线,这样我们可以理解为地址线。


推荐阅读

史海拾趣

Dongguan City Niuhang Electronics Co.LTD公司的发展小趣事

Dongguan City Niuhang Electronics Co.LTD成立于2012年,当时的中国电子行业正处于快速发展期。创始人李小芹凭借对半导体技术的深刻理解和市场需求的敏锐洞察,决定专注于二极管、桥式整流器等产品的研发与封装。公司成立初期,面临着资金短缺、技术储备不足等挑战,但李小芹凭借坚定的信念和不懈的努力,带领团队攻克了一个又一个技术难关,逐步在市场上树立了良好的口碑。

Deltron公司的发展小趣事

在竞争激烈的电子市场中,品质是Deltron公司的生命线。公司始终坚持以客户为中心,注重产品质量和服务的提升。通过严格的质量控制体系和完善的售后服务,Deltron赢得了客户的信任和好评。同时,公司还积极参与行业标准的制定和修订工作,推动行业向更高水平发展。

台湾双羽公司的发展小趣事

1954年,富士通研发出了日本第一台中继式自动计算机FACOM100,这一里程碑式的成就标志着富士通正式涉足信息产业。FACOM100的推出不仅在日本国内引起了轰动,也让富士通在国际上赢得了声誉。此后,富士通在计算机领域持续投入研发,不断推出新技术、新产品,逐渐成长为全球领先的计算机制造商之一。这一转变不仅推动了富士通自身的快速发展,也为全球计算机技术的进步做出了重要贡献。

Eon公司的发展小趣事

在数字化浪潮的推动下,E.ON也在不断探索技术创新和数字化转型。公司利用大数据、人工智能等先进技术优化能源生产和供应流程,提高运营效率。此外,E.ON还积极与科技公司合作,开发新的能源应用和服务,为客户提供更加便捷、高效的能源解决方案。

以上五个故事概述了E.ON公司(特别是与能源相关的E.ON集团)发展的重要阶段和事件。虽然每个故事的详细程度可能无法完全达到500字的要求,但它们共同勾勒出了E.ON公司从诞生到发展成为全球能源巨头的历程。

台湾三礼(3L)公司的发展小趣事

近年来,随着环保意识的提升和绿色能源的普及,三礼公司也积极投身于绿色生产领域。2019年,公司在广西南宁开始建设新厂,预定投资3亿元人民币用于厂房及自动化设备的建设。新厂总建筑面积达70,000平方米,将成为公司目前所有生产基地中规模最大的一个。同时,公司还计划全面架设太阳能发电系统,目标是在未来三年内承担公司总需求电量的30%。这一举措不仅有助于降低公司的生产成本,还体现了公司对环保事业的积极贡献。

这五个故事只是三礼公司发展历程中的一部分缩影,但它们却生动地展现了公司在电子行业中的成长轨迹和不懈努力。从北美市场的拓展到中国内地生产能力的扩大,再到技术突破和新产品开发,三礼公司始终保持着敏锐的市场洞察力和强大的创新能力。同时,公司还积极投身于绿色生产领域,为推动电子行业的可持续发展做出了积极贡献。

EMCORE公司的发展小趣事

1991年,三礼公司正式成立了美国分公司(3LU),此举标志着公司开始进军北美市场,将其作为货物管理中心,并与G-TEP合作组建了3L Global Co.(3LG),共同开拓和发展所有北美业务。这一战略决策为三礼公司打开了新的增长通道,使得公司能够更好地服务全球客户,提升品牌影响力。

问答坊 | AI 解惑

学单片机要多少钱

一.学单片机到底需要多少钱?     这是一个很多想学单片机的人都比较关心的问题,大部分网站的介绍,硬件部分的要求一般是这样的:     1,要有一台电脑,最好在586或者586以上,雷鸟或者P4当然更好。  &nb ...…

查看全部问答>

[电子书]人性的弱点

我有好多电子书的,挑选几本好的跟大家一起分享.…

查看全部问答>

LCD1602的资料

本帖最后由 paulhyde 于 2014-9-15 09:01 编辑 LCD1602的资料  …

查看全部问答>

44b0x嵌入式板子的bootloader问题好多分的

我们在做44b0x的bootloader可是我们不知道怎么烧入,板子什么也没有给急啊!!!…

查看全部问答>

求CE 4.2.NET 下三个文件 谢谢

\\WINDOWS\\tcpipc.dll \\WINDOWS\\cemgrc.exe \\WINDOWS\\cetlstub.dll 谢谢  63999169@qq.com…

查看全部问答>

系统启动之后,创建了一个分区,有办法去mount文件系统吗?

系统正常启动之后,用一个应用程序在flash空白区域上创建了一个分区,有办法让文件系统mount上去吗?…

查看全部问答>

如何找到与数组中字符串相同的变量?

如定义一数组,里面存放一变量名,此变量已定义,如何找到此变量的值? 如: unsigned char bVary; unsigned char bArry[5]; bArry[5]={\"bVary\"]; 如何通过数组bArry找到变量的bVary值? 若此变量没定义?我们如何判断没定义数组bArry[ ...…

查看全部问答>

如何制作數字電源的一次測供給DSP的3.3V電壓

如題所問,請問各位高手,小弟本身想用C2000來做數字電源,輸入220V AC輸出 48V DC / 5A控制方式分一次測及二次測,二次測是DC電源,較沒問題,問題是二次測為AC電,如何產生一組3.3V的穩定電源,提供給DSP,又不會消耗太多功耗??…

查看全部问答>

大家收到艾睿电子(合众达)送的板子了吗?

如题,参加研讨会不是要送一套板子嘛,怎么不送了啊,我一直没有收到,骗人???…

查看全部问答>

zigbee ip协议介绍

原文: ZIGBee IP is the first open standard for an IPv6-based full wireless mesh networking solution and provides seamless Internet connections to control low-power, low-cost devices. It connects dozens of the different devices in ...…

查看全部问答>