你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第十七章 OLED显示实验

[复制链接]
正点原子-90136 提问时间:2013-1-22 22:56 /
<span class="postbody" id="post_body_65058">第十七章 OLED显示实验

      
前面几章的实例,均没涉及到液晶显示,这一章,我们将向大家介绍OLED的使用。在本章中,我们将使用战舰STM32开发板上的OLED模块接口(与摄像头共用的这个),来点亮OLED,并实现ASCII字符的显示。本章分为如下几个部分:
17.1 OLED简介
17.2 硬件设计
17.3 软件设计
17.4 下载验证
17.1 OLED简介

OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display OELD)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。
LCD都需要背光,而OLED不需要,因为它是自发光的。这样同样的显示,OLED效果要来得好一些。以目前的技术,OLED的尺寸还难以大型化,但是分辨率确可以做到很高。在本章中,我们使用的是ALINETEKOLED显示模块,该模块有以下特点:
1)模块有单色和双色两种可选,单色为纯蓝色,而双色则为黄蓝双色。
2)尺寸小,显示尺寸为0.96寸,而模块的尺寸仅为27mm*26mm大小。
3)高分辨率,该模块的分辨率为128*64
4)多种接口方式,该模块提供了总共5种接口包括:68008080两种并行接口方式、3线或4线的穿行SPI接口方式,、IIC接口方式(只需要2根线就可以控制OLED了!)。
5)不需要高压,直接接3.3V就可以工作了。
这里要提醒大家的是,该模块不和5.0V接口兼容,所以请大家在使用的时候一定要小心,别直接接到5V的系统上去,否则可能烧坏模块。以上5种模式通过模块的BS0~2设置,BS0~2的设置与模块接口模式的关系如表17.1.1所示:
 

                       17.1.1 OLED模块接口方式设置表 
17.1.1中:“1”代表接VCC,而“0”代表接GND
该模块的外观图如图17.1.1所示:
 


 
17.1.1 ALIENTEK OLED模块外观图

ALIENTEK OLED模块默认设置的是BS0GNDBS1BS2VCC ,即使用8080并口方式,如果你想要设置为其他模式,则需要在OLED的背面,用烙铁修改BS0~2的设置。
模块的原理图如图17.1.2所示:
 


 
 
17.1.2 ALIENTEK OLED模块原理图

该模块采用8*22.54排针与外部连接,总共有16个管脚,在16条线中,我们只用了15条,有一个是悬空的。15条线中,电源和地线占了2条,还剩下13条信号线。在不同模式下,我们需要的信号线数量是不同的,在8080模式下,需要全部13条,而在IIC模式下,仅需要2条线就够了!这其中有一条是共同的,那就是复位线RSTRES),RST上的低电平,将导致OLED复位,在每次初始化之前,都应该复位一下OLED模块。
ALIENTEK OLED模块的控制器是SSD1306,本章,我们将学习如何通过STM32来控制该模块显示字符和数字,本章的实例代码将可以支持2种方式与OLED模块连接,一种是8080的并口方式,另外一种是4线SPI方式。
首先我们介绍一下模块的8080并行接口,8080并行接口的发明者是INTEL,该总线也被广泛应用于各类液晶显示器,ALIENTEK OLED模块也提供了这种接口,使得MCU可以快速的访问OLEDALIENTEK OLED模块的8080接口方式需要如下一些信号线:
       CSOLED片选信号。
       WR:向OLED写入数据。
       RD:从OLED读取数据。
       D[70]8位双向数据线。
       RST(RES):硬复位OLED
       DC:命令/数据标志(0,读写命令;1,读写数据)。
模块的8080并口读/写的过程为:先根据要写入/读取的数据的类型,设置DC为高(数据)/低(命令),然后拉低片选,选中SSD1306,接着我们根据是读数据,还是要写数据置RD/WR为低,然后:
RD的上升沿, 使数据锁存到数据线(D[70])上;
WR的上升沿,使数据写入到SSD1306里面;
SSD13068080并口写时序图如图17.1.3所示:
 


 
17.1.3  8080并口写时序图

SSD13068080并口读时序图如图17.1.4所示:
 


 
17.1.4  8080并口读时序图

SSD13068080接口方式下,控制脚的信号状态所对应的功能如表17.1.2
            
功能

            
            
RD

            
            
WR

            
            
CS

            
            
DC

            
            
写命令

            
            
H

            
            

            
            
L

            
            
L

            
            
读状态

            
            

            
            
H

            
            
L

            
            
L

            
            
写数据

            
            
H

            
            

            
            
L

            
            
H

            
            
读数据

            
            

            
            
H

            
            
L

            
            
H

            

                             17.1.2  控制脚信号状态功能表

8080方式下读数据操作的时候,我们有时候(例如读显存的时候)需要一个假读命(Dummy Read),以使得微控制器的操作频率和显存的操作频率相匹配。在读取真正的数据之前,由一个的假读的过程。这里的假读,其实就是第一个读到的字节丢弃不要,从第二个开始,才是我们真正要读的数据。
一个典型的读显存的时序图,如图17.1.5所示:
 


17.1.5  读显存时序图 
可以看到,在发送了列地址之后,开始读数据,第一个是Dummy Read,也就是假读,我们从第二个开始,才算是真正有效的数据。
并行接口模式就介绍到这里,我们接下来介绍一下4线串行(SPI)方式,4先串口模式使用的信号线有如下几条:
CSOLED片选信号。
RST(RES):硬复位OLED
DC:命令/数据标志(0,读写命令;1,读写数据)。
SCLK:串行时钟线。在4线串行模式下,D0信号线作为串行时钟线SCLK
SDIN:串行数据线。在4线串行模式下,D1信号线作为串行数据线SDIN
模块的D2需要悬空,其他引脚可以接到GND。在4线串行模式下,只能往模块写数据而不能读数据。
4线SPI模式下,每个数据长度均为8位,在SCLK的上升沿,数据从SDIN移入到SSD1306,并且是高位在前的。DC线还是用作命令/数据的标志线。在4线SPI模式下,写操作的时序如图17.1.6所示:
 



 
17.1.6 4线SPI写操作时序图

4线串行模式就为大家介绍到这里。其他还有几种模式,在SSD1306的数据手册上都有详细的介绍,如果要使用这些方式,请大家参考该手册。
接下来,我们介绍一下模块的显存,SSD1306的显存总共为128*64bit大小,SSD1306将这些显存分为了8页,其对应关系如表17.1.3所示:
 


 
17.1.3  SSD1306显存与屏幕对应关系表

可以看出,SSD1306的每页包含了128个字节,总共8页,这样刚好是128*64的点阵大小。因为每次写入都是按字节写入的,这就存在一个问题,如果我们使用只写方式操作模块,那么,每次要写8个点,这样,我们在画点的时候,就必须把要设置的点所在的字节的每个位都搞清楚当前的状态(0/1?),否则写入的数据就会覆盖掉之前的状态,结果就是有些不需要显示的点,显示出来了,或者该显示的没有显示了。这个问题在能读的模式下,我们可以先读出来要写入的那个字节,得到当前状况,在修改了要改写的位之后再写进GRAM,这样就不会影响到之前的状况了。但是这样需要能读GRAM,对于3线或4线SPI模式,模块是不支持读的,而且读->->写的方式速度也比较慢。
所以我们采用的办法是在STM32的内部建立一个OLEDGRAM(共128*8个字节),在每次修改的时候,只是修改STM32上的GRAM(实际上就是SRAM),在修改完了之后,一次性把STM32上的GRAM写入到OLEDGRAM。当然这个方法也有坏处,就是对于那些SRAM很小的单片机(比如51系列)就比较麻烦了。
SSD1306的命令比较多,这里我们仅介绍几个比较常用的命令,这些命令如表17.1.4所示:

17.1.4  SSD1306常用命令表

第一个命令为0X81,用于设置对比度的,这个命令包含了两个字节,第一个0X81为命令,随后发送的一个字节为要设置的对比度的值。这个值设置得越大屏幕就越亮。
第二个命令为0XAE/0XAF0XAE为关闭显示命令;0XAF为开启显示命令。
第三个命令为0X8D,该指令也包含2个字节,第一个为命令字,第二个为设置值,第二个字节的BIT2表示电荷泵的开关状态,该位为1,则开启电荷泵,为0则关闭。在模块初始化的时候,这个必须要开启,否则是看不到屏幕显示的。
第四个命令为0XB0~B7,该命令用于设置页地址,其低三位的值对应着GRAM的页地址。
第五个指令为0X00~0X0F,该指令用于设置显示时的起始列地址低四位。
第六个指令为0X10~0X1F,该指令用于设置显示时的起始列地址高四位。
其他命令,我们就不在这里一一介绍了,大家可以参考SSD1306 datasheet的第28页。从这页开始,对SSD1306的指令有详细的介绍。
最后,我们再来介绍一下OLED模块的初始化过程,SSD1306的典型初始化框图如图17.1.7所示:
 


 
 
17.1.7  SSD1306初始化框图

驱动IC的初始化代码,我们直接使用厂家推荐的设置就可以了,只要对细节部分进行一些修改,使其满足我们自己的要求即可,其他不需要变动。
OLED的介绍就到此为止,我们重点向大家介绍了ALIENTEK OLED模块的相关知识,接下来我们将使用这个模块来显示字符和数字。通过以上介绍,我们可以得出OLED显示需要的相关设置步骤如下:
1)设置STM32OLED模块相连接的IO
这一步,先将我们与OLED模块相连的IO口设置为输出,具体使用哪些IO口,这里需要根据连接电路以及OLED模块所设置的通讯模式来确定。这些将在硬件设计部分向大家介绍。
2)初始化OLED模块。
其实这里就是上面的初始化框图的内容,通过对OLED相关寄存器的初始化,来启动OLED的显示。为后续显示字符和数字做准备。
3)通过函数将字符和数字显示到OLED模块上。
这里就是通过我们设计的程序,将要显示的字符送到OLED模块就可以了,这些函数将在软件设计部分向大家介绍。
通过以上三步,我们就可以使用ALIENTEK OLED模块来显示字符和数字了,在后面我们还将会给大家介绍显示汉字的方法。这一部分就先介绍到这里。
 
17.2 硬件设计

本实验用到的硬件资源有:
1)  指示灯DS0
2)  OLED模块
OLED模块的电路在17.1节已有详细说明了,这里我们介绍OLED模块与ALIETEK 战舰STM32开发板的连接,战舰STM32开发板有两个地方可以接OLED模块,第一个是左下角的摄像头模块/OLED模块共用接口,第二个是LCD模块和OLED模块的共用接口,不论哪个共用接口,OLED都是靠左插的。这里我们选择摄像头模块/OLED模块共用接口来接OLED模块,OLED模块同战舰STM32开发板的连接图如图17.2.1所示:
 


 
 
17.2.1 OLED模块与开发板连接示意图

图中圈出来的部分就是连接OLED的接口,这里在硬件上,OLED与战舰STM32开发板的IO口对应关系如下:
       OLED_CS对应PD6;
OLED_RST对应PG15;
       OLED_RS对应PD3;
       OLED_WR对应PG14;
       OLED_RD对应PG13;
       OLED_D[70]对应PC[70];
这些线的连接,战舰STM32的内部已经连接好了,我们只需要将OLED模块插上去就好了。实物连接如图17.2.2所示:
 


 
17.2.2 OLED模块与开发板连接实物图

17.3 软件设计

软件设计我们依旧在之前的工程上面增加,首先在HARDWARE文件夹下新建一个OLED的文件夹。然后打开USER文件夹下的工程,新建一个oled.c的文件和oled.h的头文件,保存在OLED文件夹下,并将OLED文件夹加入头文件包含路径。
oled.c的代码,由于比较长,这里我们就不贴出来了,仅介绍几个比较重要的函数。首先是OLED_Init函数,该函数的结构比较简单,开始是对IO口的初始化,这里我们用了宏定义OLED_MODE来决定要设置的IO口,其他就是一些初始化序列了,我们按照厂家提供的资料来做就可以。最后要说明一点的是,因为OLED是无背光的,在初始化之后,我们把显存都清空了,所以我们在屏幕上是看不到任何内容的,跟没通电一个样,不要以为这就是初始化失败,要写入数据模块才会显示的。OLED_Init函数代码如下: 
//初始化SSD1306                                
void OLED_Init(void)
{                                                                  
       RCC->APB2ENR|=1CRH|=0X33300000;     
       GPIOG->ODR|=7CRL|=0X00000033;          
      GPIOC->ODR|=3CRH|=0X30000000;     
       GPIOG->ODR|=1127;
       OLED_WR_Byte(0xC0,OLED_CMD);
//设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]->COM0;N:驱动路数
       OLED_WR_Byte(0xDA,OLED_CMD);//设置COM硬件引脚配置
       OLED_WR_Byte(0x12,OLED_CMD);//[5:4]配置            
       OLED_WR_Byte(0x81,OLED_CMD);//对比度设置
       OLED_WR_Byte(0xEF,OLED_CMD);//1~255;默认0X7F (亮度设置,越大越亮)
       OLED_WR_Byte(0xD9,OLED_CMD);//设置预充电周期
       OLED_WR_Byte(0xf1,OLED_CMD);//[3:0],PHASE 1;[7:4],PHASE 2;
       OLED_WR_Byte(0xDB,OLED_CMD);//设置VCOMH 电压倍率
       OLED_WR_Byte(0x30,OLED_CMD);//[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;
       OLED_WR_Byte(0xA4,OLED_CMD);//全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)
       OLED_WR_Byte(0xA6,OLED_CMD);//设置显示方式;bit0:1,反相显示;0,正常显示       
       OLED_WR_Byte(0xAF,OLED_CMD);//开启显示    
       OLED_Clear();

接着,要介绍的是OLED_Refresh_Gram函数。我们在STM32内部定义了一个块GRAMu8 OLED_GRAM[128][8];此部分GRAM对应OLED模块上的GRAM。在操作的时候,我们只要修改STM32内部的GRAM就可以了,然后通过OLED_Refresh_Gram函数把GRAM一次刷新到OLED GRAM上。该函数代码如下:
//更新显存到LCD       
void OLED_Refresh_Gram(void)
{
       u8 i,n;               

<span lang="EN-US">       for(i=0;i

《STM32开发指南》第十六章 电容触摸按键实验.rar

下载

657.6 KB, 下载次数: 22, 下载积分: ST金币 -1

实验11 电容触摸按键实验.rar

下载

40.02 KB, 下载次数: 12, 下载积分: ST金币 -1

收藏 评论1 发布时间:2013-1-22 22:56

举报

1个回答
lovelymnk 回答时间:2013-1-23 08:59:57

回复:【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第十七章 OLED显示实验

附件弄错了,还是上一章的。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版