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

【经验分享】STM32 OLED简介

[复制链接]
STMCU小助手 发布时间:2022-6-14 18:32
01. OLED概述$ G4 S5 n* w! I  \7 s
OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(OrganicElectroluminesence Display, OELD)。OLED 由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。
' R8 l& X: |3 B4 \7 [: Y+ o! c  `- X/ `# c' \
LCD 都需要背光,而 OLED 不需要,因为它是自发光的。这样同样的显示,OLED 效果要来得好一些。以目前的技术,OLED 的尺寸还难以大型化,但是分辨率确可以做到很高。' q' S( h% X* U3 l" P

9 ~' F) D& X+ W$ |4 D. t3 b02. OLED特性参数, B3 Y8 ^4 A& ?. w# ], @3 P
ATK-0.96’ OLED 模块是 ALIENTEK 推出的一款小尺寸(0.96 寸)、高亮、自带升压电路的高性能 OLED 显示模块,分辨率为 128*64,该模块采用原装维信诺高亮 OLED 屏,采用SSD1306 驱动 IC,该芯片内部集成 DCDC 升压,仅需 3.3V 供电,即可正常工作,无需用户再添加升压 DCDC 电路。  D% E" o* O; ]$ q1 `

0 @) R# l5 Z% B  B/ l模块支持:8 位 6800 并口、8 位 8080 并口、IIC 以及 4 线 SPI 等 4 种通信接口,通过模块背面的 BS1,BS2 焊盘,可以自行设置模块的接口方式。默认为:8 位 8080 并口。该模块各参数如表 1.1 和表 1.2 所示:  t! V2 Z0 F& h3 C% }; a
! {" M; _( V. H" ?; |" W
Y8}C]KV%8YQP0`H)8%~5U[N.png $T1J}87@LI2N{RRREDZOS~Y.png
9 f5 q2 N& T; b+ o  `! `% N+ O, V4 q1 Q8 }" M
ATK0.96’ OLED 模块支持多种通信接口,通过模块背面的 BS1,BS2,可以自行设置模块的通信接口方式,见表 1.3:
4 O7 P  M2 E5 v5 T) c' K" G2 J9 X& N/ E
20200904151042418.png . H! Y. T8 r$ J5 S! N( E* `
3 u- I8 w! @& h5 f3 V5 c
03. OLED模块描述
0 U0 n. c2 l  ^
ATK-0.96’ OLED 模块是 ALIENTEK 推出的一款高性能 OLED 显示模块,尺寸小巧(27mm*26mm),结构紧凑,模块通过 1 个 2*8P 的 2.54mm 间距排针与外部连接,模块外观如图 2.1.1 所示:
: d2 i1 G* u3 f! U6 q- K
7 i9 U) \# w% D5 X7 V XVS545ZPV930PL)_KW_8Y{D.png $ Q5 d* }9 Q$ [' h
& O& ~- q8 E" i& |; d0 Q
该模块具有如下特点:
, X8 z$ {$ u- k2 e5 p 双色可选,提供纯蓝色或黄蓝双色两种模块+ s) ^5 O& V2 J3 q1 G
 高分辨率,分辨率为:128*64- J4 D* D) }+ g" e( ^, d3 ?6 L
 超小尺寸,OLED 显示屏为 0.96 寸,模块尺寸仅为 27mm*26mm  S0 d' Z' @0 _6 W2 q9 _# Z
 多种接口方式,提供 8086 并口、6800 并口、4 线 SPI 和 IIC 等五种接口方式& R# ^( }2 u8 \0 K5 |4 J8 L& Z
 集成 DCDC,无需外部高压,仅需提供 3.3V 电源,即可正常工作
0 o! n6 L& H' T) K7 o) g. A2 a4 H图 2.1.1 中,左侧的图片是模块的背面图,右侧的是正面图。% t" }& M6 X' a& Q0 w

; a( ^# U8 g/ O1 }/ |" Z8 J04. OLED模块原理图$ {' E6 w( K7 x1 f
5 R/ J$ Q) y( D2 O
CBF}7]%3{N8]F`_S}~ZUCQ7.png 7 E0 n  _) s* `; O, l/ T

! q7 v& [* R1 N05. OLED模块引脚说明# j0 J6 Y8 B& N* z/ ]
ATK-0.96’ OLED 模块通过 2*8 的 2.54 排针同外部单片机通信,各引脚的详细描述如下表所示  T, b" K) J; g9 D+ T7 l0 o8 x$ Y
0 v8 C5 r2 D7 i$ o, M' E9 ?
_8UJ9B(H)WFRP8SA5LH1.png
. F0 c- h& _4 g
# u- T3 ~8 w) K) p% M II(@[Y$UF6WW9}_F@@YUSBR.png
+ B. E4 K: @2 j
: K: P/ L/ B4 b/ I6 F4 j温馨提示
) y' L; i  y  v4 m4 `; C% `% W5 z. h
模块在使用 IIC 模式或者 4 线 SPI 模式的时候,是不支持读操作的,所以如果你需要读操作,只能选择 6800 或者 8080 并口模式。模块默认是:8080 并口模式,大家根据自己选择的接口模式,来接线。8 u/ Z" }/ _8 @' ?
7 @8 w: z8 v" U* N* u; {4 u( }
06. OLED模块使用
2 m3 l! v+ L9 S5 p2 A( P) [
ATK-0.96’ OLED 模块的控制器是 SSD1306,支持多种接口方式,我们模块支持 4 种连接方式,这里我们介绍其中 8080 并口模式。4 g8 W. Y! n( V% K$ n9 P
# M! J& q7 [, Y7 G5 ]
8080并口模式
9 ^0 R  n: }; N$ H
" y2 O8 ]$ j. I. X) b5 |ATK-0.96’ OLED 模块支持 8 位 8080 并口模式,总共需要 13 根信号线通信,这些信号线如下:
* k- J! G! }2 X0 I  OCS:OLED 片选信号。$ r. i' P+ @: h) _  U5 W- N
WR(RW):向 OLED 写入数据。* [8 U5 b! n# Z- j6 z) }4 `- @
RD:从 OLED 读取数据。  K( p* b& |: w- _0 P
D[7:0]:8 位双向数据线。; m5 ^; q+ {" d( ~) I3 b+ _
RST(RES):硬复位 OLED。5 F, n, z2 E% }5 L4 [% z
DC:命令/数据标志(0,读写命令;1,读写数据)。! Y  X- G1 N+ s$ Z% d/ s% |$ D# @" I
3 j* @8 a% }" K7 U" J2 s
模块的 8080 并口读/写的过程为:先根据要写入/读取的数据的类型,设置 DC 为高(数据)/低(命令),然后拉低片选,选中 SSD1306,接着我们根据是读数据,还是要写数据置RD/WR 为低,然后:
2 M1 t+ ?4 C/ q4 m/ b- H
: Y" p$ V, f* n, _$ h9 d) V% C- M! H在 RD 的上升沿, 使数据锁存到数据线(D[7:0])上;- B0 z; J, \, m# a+ {

% ^; \7 m) W6 g; J! h在 WR 的上升沿,使数据写入到 SSD1306 里面;* ~3 Z! D& I/ G5 z9 `0 `, ~1 M

+ j; q- Y$ A" o9 \7 ZSSD1306 的 8080 并口写时序如图所示:
6 v$ e" Y" W6 ~8 h
9 v8 G( B, s! d) v* ^& P7 a( d 9K@$W[))3$V1@]1KVCH]Y12.png 1 I2 w" y5 g* ^0 ~' \  P, I2 Y

. `9 D) }$ R+ N# F! PSSD1306 的 8080 并口读时序如图 2.3.1.2 所示:
8 ~/ N- J" k- Q+ |5 z* f' J
7 o4 m5 [6 u" z7 x, x1 F. m & W% D! p2 `6 @$ G& I1 P5 g% Q
9 F  M/ P8 |, P4 v! F
SSD1306 的 8080 接口方式下,控制脚的信号状态所对应的功能如表所示:
: a8 \) S0 _% _! @4 E/ p/ O. q. G- e
6(NP87G}6@91@28D7F%_RBU.png + c9 l6 B* ~, ]! h9 Q% T
' I* W9 y: p; ]8 x- R4 b
注 1:H 代表高电平(VCC),L 代表低电平(GND),↑代表上升沿。, Q: u0 y8 Z0 w5 j7 o; ?1 f
: q/ ]/ h" d1 Z  l1 V& _9 q
在 8080 方式下读数据操作的时候,我们有时候(例如读显存的时候)需要一个假读命(Dummy Read),以使得微控制器的操作频率和显存的操作频率相匹配。在读取真正的数据之前,由一个的假读的过程。这里的假读,其实就是第一个读到的字节丢弃不要,从第二个开始,才是我们真正要读的数据。4 x- S- k3 B/ R/ J0 i( i
2 Q3 H" I: ?1 V0 t5 [8 {9 |9 E
一个典型的读显存的时序图,如图所示:: d8 H" k3 F5 |  T9 Z

2 U0 ^; M6 t' W6 a+ S {S4Y]]CJ]NXMSJXKDZ%DOW9.png
5 e# u8 Q9 l1 H- D( k
8 q  A( H, V& V; M6 K; g9 _可以看到,在发送了列地址之后,开始读数据,第一个是 Dummy Read,也就是假读,我们从第二个开始,才算是真正有效的数据。
2 E$ [7 {# p" I0 X. M* N& V. V: }3 c& T( T; C1 p
显存% d  r& G2 d& U3 T: }8 H

1 a. q6 ?, g7 I  I3 x- d/ H* GSSD1306 的显存总共为 128*64bit 大小,SSD1306 将这些显存分为了 8 页,其对应关系如表所示:
) {* d. o0 O1 [+ Z6 c2 J4 l/ u" r
( A! V6 U. m# _! l 1BUUCI7~6ZRPS8(WQ_EJFY2.png ' x% d( L: S, t  M% ]$ N
1 X8 _, A+ A3 }$ t7 U
SSD1306 的每页包含了 128 个字节,总共 8 页,这样刚好是 128*64 的点阵大小。因为每次写入都是按字节写入的,这就存在一个问5 D3 [% Z6 V! C4 W
1 A' D/ o! U' S1 C6 z
题,如果我们使用只写方式操作模块,那么,每次要写 8 个点,这样,我们在画点的时候,就必须把要设置的点所在的字节的每个位都搞0 H+ j3 ?* n3 S) l

6 z, x6 q; d0 Y7 ^' _清楚当前的状态(0/1?),否则写入的数据就会覆盖掉之前的状态,结果就是有些不需要显示的点,显示出来了,或者该显示的没有显
5 a5 x% G2 T! U: Q+ b. c! `
9 h% d9 t# n; B  n示了。这个问题在能读的模式下,我们可以先读出来要写入的那个字节,得到当前状况,在修改了要改写的位之后再写进 GRAM,这样就
2 \/ A" u& {8 E' K- w- {3 L! x9 p* Q) B! r( P7 ]
不会影响到之前的状况了。但是这样需要能读 GRAM,对于 4 线 SPI 模式或者 IIC 模式来说,模块是不支持读的,而且读->改->写的方式. _) F8 D. X1 p5 M1 N$ l
# z& o! ]9 N5 I
速度也比较慢。
% g/ i+ @' h- l( I
' e: y% j9 a5 h1 E0 q5 u我们推荐采用的办法是在单片机的内部建立一个 OLED 的 GRAM(需要 128*8 个字节),在每次修改的时候,只是修改单片机上的 GRAM(实际上就是 SRAM),在修改完了之后,一次性把单片机内部的 GRAM 写入到 OLED 的 GRAM。当然这个方法也有坏处,就是对于那些 SRAM 很小的单片机(比如 51 系列)就比较麻烦了,如果内存不够,那就推荐还是采用并口模式,这样可以节约内存。
. f( k' [3 o1 I4 U
, w# H3 H$ R- s% ]  U: l指令
5 r3 y0 Q& a" b2 f( T+ L: `( F. c( ]4 R
SSD1306 的指令比较多,这里我们仅介绍几个比较常用的命令
1 ]9 s! N3 @+ H  X7 T) G  j
1 e9 Y- w: Y) s5 A NHBHR@8WBNEFTASVI`2FK}J.png 5 D+ V* ]* r; w8 ?7 M  O
" X* ^) H. w' u' w# |7 ^: t
第一个命令为 0X81,用于设置对比度的,这个命令包含了两个字节,第一个 0X81 为命令,随后发送的一个字节为要设置的对比度的值。这个值设置得越大屏幕就越亮。
/ x$ H9 j9 m3 X3 U" E1 D! J: K- j; ~" {1 O  w2 M
第二个命令为 0XAE/0XAF。0XAE 为关闭显示命令;0XAF 为开启显示命令。9 }& ?9 H0 E! e: i9 Y# ~( ^

' Z  O, x. Q# |. B: t+ O4 ]( i第三个命令为 0X8D,该指令也包含 2 个字节,第一个为命令字,第二个为设置值,第二个字节的 BIT2 表示电荷泵的开关状态,该位为 1,则开启电荷泵,为 0 则关闭。在模块初始化的时候,这个必须要开启,否则是看不到屏幕显示的。
% C5 w9 F4 Z( c; U- ]( v
8 `' N! G4 `& H第四个命令为 0XB0~B7,该命令用于设置页地址,其低三位的值对应着 GRAM 的页地址。
  g9 F* w( v. A
, Q  ]# E: m6 w! ~4 I第五个指令为 0X00~0X0F,该指令用于设置显示时的起始列地址低四位。! e' I; s$ n$ ?! ]4 l. e
/ r" v  f" Q* X/ u
第六个指令为 0X10~0X1F,该指令用于设置显示时的起始列地址高四位。
, K: z( c& o6 E  H6 x* d2 c0 C# L$ ]8 S, D
其他命令,我们就不在这里一一介绍了,大家可以参考 SSD1306 datasheet 的第 28 页。从这页开始,对 SSD1306 的指令有详细的介绍。, {' U( z2 _! R2 U
$ B) H+ [8 f, e* i

1 E- X' C1 y1 i, D, A6 ?$ f- g" S" P) ^& X
2 Q! @" |/ u9 k
收藏 评论0 发布时间:2022-6-14 18:32

举报

0个回答

所属标签

相似分享

官网相关资源

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