APP下载

基于STM32的OLED显示屏接口设计

2017-11-09刘正翔

电子技术与软件工程 2017年19期
关键词:显示屏

刘正翔

摘 要近年来,新兴的OLED技术以其优越的性能受到众多应用厂商的青睐。本文以STM32控制OLED显示屏为例,通过介绍模块硬件特性,阐述如何用STM32控制显示屏,并给出关键的读写驱动源码,对OLED驱动的应用者具有一定的借鉴意义。

【关键词】STM32 OLED 显示屏

近年来,一种新兴的有机发光二极管显示器OLED,以其优越的性能,在众多的显示屏器件中脱颖而出,广泛应用于商业领域和军事领域中。传统的小尺寸显示屏大多采用LCD液晶显示,虽然有较好的亮度和较低的功耗,但需要单独给背光才可清晰看清楚显示屏的数据信息,且液晶屏在黑位水平、对比度、厚度、视角、颜色均匀性等方面的性能,较之OLED性能相差甚远。

1 OLED屏硬件接口设计

为缩短研发周期,国内一些公司将OLED屏组装成模块并引出模块控制引脚。客户只要根据模块引脚即可控制OLED模块进行显示。经过比较,这里以广州星翼电子科技有限公司推出的ATK-0.96 OLED模块为例,介绍该显示模块屏与主控芯片的硬件接口电路设计。

该模块工作温度为-40~+70℃,内部自带升压电路,分辨率为128*64像素,采用SSD1306驱动芯片,仅需3.3V供电即可。该模块支持8位6800并口、8位8080并口、I2C总线、4线SPI总线等四种通信接口方式,通过背面两个焊点可设置模块接口方式:都为高电平时,为8位8080并口模式。模块出厂默认该模式。

本文即是采用默认的8080并口模式,通过排针与外部的STM32通信,使用到的引脚与LCD液晶模块大同小异:除了电源与接地引脚外,主要的引脚为CS片选信号;RW写入数据信号;RS读取数据信号;D[0-7]8位双向数据线信号;RST复位;DC数据或指令选择信号等。为了控制OLED模块只要先选择输入的是指令还是数据,然后设置片选引脚为低电平,设置写信号使能并将数据写到数据线上,即可进行数据的读写操作。

由于STM32的GPIO端口都是16位的,为了与模块连接,只要选择STM32其中一个PA端口(也可选择其他通用端口)中的5个通用引脚作为模块的控制信号线,再选择另一个PB端口的低8位通用引脚作为数据线与模块通信即可。这里选择PA端口用做控制信号,PB端口用作数据线。由于引脚连接较为简单,不再图示。具体是:PA0连DC脚,PA1连片选CS,PA2连RD脚,PA3连RW脚,PA4连RST脚。PB0-PB7连数据线D0-D7脚。

2 OLED模块的程序设计

2.1 初始化程序设计

OLED屏与液晶屏类似,在应用前都需要进行初始化。整个初始化工作为一系列显示控制芯片的设置工作,主要包括关闭显示、设置时钟分频因子、设置显示偏移、设置内存地址、行列起始地址等。每个显示模块厂商均提供该初始化源码,由于每个厂家提供的初始化源码不同,这里就不再详细阐述,读者可查看厂家说明书,直接参考源码即可。

2.2 读写数据/指令

进行显示屏模块的读写操作,实际上就是与模塊内的控制芯片进行通信。若进行写数据/指令,则设置DC为低电平选择指令线,拉低片选并设置RW上升沿,使得数据写入到显示模块中。数据写入显示模块即写入到显存与屏幕对应的位置。若进行读数据,则设置DC为高电平选择数据线。然后拉低片选并设置RD上升沿,使得数据锁存到数据线上,即可在引脚上可读取到数据。具体的时序图读者可参考厂家说明书。下面以向显示模块进行一次写操作的函数为例说明。

Void WR_Byte()

{

RS_Set(); //DC=1表示写数据

CS_Clr(); //拉低片选

WR_Clr(); //WR的上升沿开始写入数据

WR_Set();

CS_Set();

RS_Set();

}

若要向显示模块写入一个字节数据,则在写操作函数基础上送入数据即可。由于主控芯片的IO端口是16位的,因此需要屏蔽高8位,只送入低8位,以避免不必要的影响。因此向显示模块写入一个字节的源码只要添加下面这行代码即可:

GPIOB->ODR=(GPIOB->ODR&0xff00)|(x&0x00FF);

读操作与写操作类似,这里就不详细阐述。

2.3 显存编码思路

输入OLED模块的数据之所以能显示到屏幕上,是因为内部有一个显存,该显存与模块屏幕上的像素点是一一对应的关系。只要把数据送到显存对应的地址上,就会按显存的地址显示到屏幕上。SSD1306的显存为128*64bit,分为8页,每页128个字节。可以把显存想象成一个屏幕,屏幕上的每个像素点就是显存的一个存储位置。现在考虑,若要画一个图形或汉字,是否直接写入字节就可以实现全部的情况?由于每次写入都是按字节写入的。也就是说,每次都必须写入8个像素点。若有一次写入时,8位像素点中,低2位的像素点刚好是相邻图形的一个组成部分,此时再写入完整一个字节,就会把原来的图形覆盖掉2个像素点。为解决该问题,最简单的解决方法是,先将该字节的8个位读取出来,按要求修改完写入的位,然后重新写入。该方法缺陷是,每次都要先读取,再写入,消耗了时间。另一种方法,新建一个128*8字节的二维数组GRAM[i][j],修改时,直接在数据上修改,修改完一次性写到OLED的显存里。此思路虽然方便STM32对该模块的控制,但需要一定内存空间,因此对内存小的单片机可能就不太合适。

3 结论

本文阐述了OLED显示屏模块的结构、硬件电路设计及软件关键读写函数编写等。通过项目实践,对选用的显示模块应用可能遇到的问题进行总结,给出显示屏硬件接口电路,及其关键驱动源代码,对显示屏应用有一定的借鉴意义。

参考文献

[1]翁梦婷.OLED显示驱动控制电路的设计[D].浙江大学硕士学位论文,2016(01).

[2]张洋,刘军.原子教你玩STM32(库函数版)第2版[M].北京:航空航天大学出版社,2015(11).

[3]刘火良,杨森.STM32库开发实战指南[M].北京:机械工业出版社,2013(06).

作者单位

福州职业技术学院 福建省福州市 350108

猜你喜欢

显示屏
一块布就是一个显示屏?
苍蝇迷恋显示屏
基于AT89S51单片机控制的旋转LED显示屏研究
未来五年LED显示屏出货将保持16%增长
可折叠十万次的触摸显示屏
基于AT89S52的手势可控LED滚动显示屏设计