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

【经验分享】STM32 OLED简介

[复制链接]
STMCU小助手 发布时间:2022-3-29 10:18
01. OLED概述
$ y" V9 y- a) q. u/ rOLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(OrganicElectroluminesence Display, OELD)。OLED 由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。
8 ]% y/ g3 F$ o
. P1 Z# P- P$ T2 w& z# B! j4 E1 p- LLCD 都需要背光,而 OLED 不需要,因为它是自发光的。这样同样的显示,OLED 效果要来得好一些。以目前的技术,OLED 的尺寸还难以大型化,但是分辨率确可以做到很高。+ f3 e8 V; D) Q! }5 X0 d2 S

( U' C$ t% a* P0 a  M02. OLED特性参数& @) z5 B9 d# E* d0 ?
ATK-0.96’ OLED 模块是 ALIENTEK 推出的一款小尺寸(0.96 寸)、高亮、自带升压电路的高性能 OLED 显示模块,分辨率为 128*64,该模块采用原装维信诺高亮 OLED 屏,采用SSD1306 驱动 IC,该芯片内部集成 DCDC 升压,仅需 3.3V 供电,即可正常工作,无需用户再添加升压 DCDC 电路。
; F5 h$ Q, z, u7 v- A* \/ v- K# o3 F5 y7 {  S$ P9 S+ ?# }9 `0 i
模块支持:8 位 6800 并口、8 位 8080 并口、IIC 以及 4 线 SPI 等 4 种通信接口,通过模块背面的 BS1,BS2 焊盘,可以自行设置模块的接口方式。默认为:8 位 8080 并口。该模块各参数如表 1.1 和表 1.2 所示:
" g) g5 s: a7 G  K% L3 [4 Z
: r6 U. n1 B2 J$ f ]L05UF0K35JTEGMCHVFZK%J.png
( r: T4 t# `' l, G4 A# @' v L4Q1ZX5O`@OOQB(5)W5B2`C.png 2 f4 C; I+ R, o- x! s

% {. ?  f2 O. r- v4 kATK0.96’ OLED 模块支持多种通信接口,通过模块背面的 BS1,BS2,可以自行设置模块的通信接口方式,见表 1.3:
) n2 X# b# Z* k7 k1 {' r( ]
3 p. a. M1 \5 ~/ D$ a 20200904151042418.png
" g2 a" l1 u; D" |+ {& X  x9 t% f9 e5 B2 [2 i3 U0 |# D' [
03. OLED模块描述
, |5 b9 ]; D2 ?& R+ uATK-0.96’ OLED 模块是 ALIENTEK 推出的一款高性能 OLED 显示模块,尺寸小巧(27mm*26mm),结构紧凑,模块通过 1 个 2*8P 的 2.54mm 间距排针与外部连接,模块外观如图 2.1.1 所示:1 p5 ]" F4 o- J+ S8 E

  W! F0 \/ ~& r- M  f, a2 f6 z _O)V]%O2RIKC8@9}OWC)O`B.png
) }: j6 {; V, C5 R5 O2 R
. w' k, v2 K6 p$ r+ n该模块具有如下特点:8 Y: _4 B8 d& X% F
 双色可选,提供纯蓝色或黄蓝双色两种模块; f$ F$ Q$ a8 X0 a+ ^/ O
 高分辨率,分辨率为:128*640 C. d1 \/ S" j% u( L6 ~
 超小尺寸,OLED 显示屏为 0.96 寸,模块尺寸仅为 27mm*26mm  B' U  l, O0 @. x& c0 a
 多种接口方式,提供 8086 并口、6800 并口、4 线 SPI 和 IIC 等五种接口方式3 S" Y+ s  [" e( W/ o
 集成 DCDC,无需外部高压,仅需提供 3.3V 电源,即可正常工作( L  B( {% p; a, p) }4 j
图 2.1.1 中,左侧的图片是模块的背面图,右侧的是正面图。
4 Q/ Q4 F  F9 z. Z  c# s
7 h; V7 c) z, F/ {# F* h( @  k04. OLED模块原理图
* k: _* P+ |- M' u
, M( U' s8 h- a5 h  k# j# y5 @# t IRH0D6U9JP$H[66SXXCK@}X.png $ ]& M" W! |0 D7 H, t) ~1 ~

* j4 Y3 T3 e8 A( u* X05. OLED模块引脚说明
! I' o7 y9 Q' q/ q# y' CATK-0.96’ OLED 模块通过 2*8 的 2.54 排针同外部单片机通信,各引脚的详细描述如下表所示
, m$ N% ], n) W% u+ `& K+ u  E
) p9 g; O5 N5 k  Q L}4{)B69_9JUWWOC@{@T{IF.png , d5 U; R% f; E* W' K7 V- ^2 x! `

: ^# z, k/ x6 _1 C 0BE5%]]@%J~(PUK8CKOSPMY.png
9 u0 r( D. ?$ K1 e0 V: w, l) D2 \7 a) u
温馨提示
- T3 P; \) T0 w+ m) e0 c
, [/ ?& a" g0 U1 |模块在使用 IIC 模式或者 4 线 SPI 模式的时候,是不支持读操作的,所以如果你需要读操作,只能选择 6800 或者 8080 并口模式。模块默认是:8080 并口模式,大家根据自己选择的接口模式,来接线。9 M" Z; o% f, R

  L$ p. _; e. q& W2 g8 m( Y06. OLED模块使用
# Z' S; G9 N" f2 v; F9 c3 w% d4 C/ f* zATK-0.96’ OLED 模块的控制器是 SSD1306,支持多种接口方式,我们模块支持 4 种连接方式,这里我们介绍其中 8080 并口模式。
: K% z  h& F) u: a: k9 a
+ o! |- I; g+ r" _  V7 y/ ?0 a. J8080并口模式. e  e) G) e* ~, B$ g2 i

. \" h& ^/ Y# t2 q2 d& ~7 vATK-0.96’ OLED 模块支持 8 位 8080 并口模式,总共需要 13 根信号线通信,这些信号线如下:# Y2 N/ f3 @6 Z6 a' q) _) N
/ F3 L8 A* J6 \! L8 P
CS:OLED 片选信号。" b& ~. R0 z; Z3 s- c2 d# C+ m' g5 l
WR(RW):向 OLED 写入数据。7 h/ b0 z4 W/ N7 d. T& r$ D% I
RD:从 OLED 读取数据。+ g4 ?0 B% B! I- k; a3 n) Q1 }# L/ y
D[7:0]:8 位双向数据线。
+ m3 z3 p4 X  H" V6 U: ?+ ^. URST(RES):硬复位 OLED。+ I& t% w5 X5 V- v
DC:命令/数据标志(0,读写命令;1,读写数据)。; H' g: K8 L" p4 N% M# f: p- Z2 x: l
模块的 8080 并口读/写的过程为:先根据要写入/读取的数据的类型,设置 DC 为高(数据)/低(命令),然后拉低片选,选中 SSD1306,接着我们根据是读数据,还是要写数据置RD/WR 为低,然后:4 _8 G! F1 h; g. v

5 f* l- q2 r' ]& x) ^* E在 RD 的上升沿, 使数据锁存到数据线(D[7:0])上;
6 z& a: {& s2 u! D+ B8 m0 ^* l" l0 ~$ j2 ?
在 WR 的上升沿,使数据写入到 SSD1306 里面;+ h: P, X" |9 W; e+ Y

+ P6 g! y) R9 t7 cSSD1306 的 8080 并口写时序如图所示:
6 C3 z' w5 h. M. B9 X( b2 x" G: C1 z  t% R; Q* n
PFRY_B]]_DUUWCHFCHHO(6B.png
5 }1 h9 k3 H5 F+ r' D1 g
& ?2 z# c8 [! \% cSSD1306 的 8080 并口读时序如图 2.3.1.2 所示:
( ^# c+ o2 Z" Y9 R7 |' J9 _+ k  i- E# k; v7 }& g, u& W
C)@3Y@%HI$B4K9JNOFY(P0Z.png % I( B6 K: T2 `  H4 a& w
2 R- \- g  ^. a; B0 K8 E
SSD1306 的 8080 接口方式下,控制脚的信号状态所对应的功能如表所示:
3 l- k6 ]0 O" p: b/ v# K3 e; F( O& v- w% h
4{RQQP_GIXRED{607VK38]S.png
/ M* j* y- {' M$ n; l
5 U) F7 g( p2 l, J注 1:H 代表高电平(VCC),L 代表低电平(GND),↑代表上升沿。
2 [3 G- c3 I' }0 N7 V2 D0 q) e7 U/ f
在 8080 方式下读数据操作的时候,我们有时候(例如读显存的时候)需要一个假读命(Dummy Read),以使得微控制器的操作频率和显存的操作频率相匹配。在读取真正的数据之前,由一个的假读的过程。这里的假读,其实就是第一个读到的字节丢弃不要,从第二个开始,才是我们真正要读的数据。
) q+ a) Q" D1 v& L7 c
; ]) }+ ?; k" R: t# X  ~/ a一个典型的读显存的时序图,如图所示:/ e6 A6 F4 S. @2 J0 c% f
5 \5 n! l; [- N9 e& o& Z  L
J]936{C0(YL05(6}X{Z({6P.png ! L; x) i& P+ x# R
8 t* ]1 z, u, o2 o+ e
可以看到,在发送了列地址之后,开始读数据,第一个是 Dummy Read,也就是假读,我们从第二个开始,才算是真正有效的数据。
- j% B6 U$ f8 |/ n4 b% {( L; {* ^: X- N6 W* Z
显存
5 X& ]) Z9 d9 W
/ D$ A5 q: q3 J5 m6 jSSD1306 的显存总共为 128*64bit 大小,SSD1306 将这些显存分为了 8 页,其对应关系如表所示:
: R( P$ N) \4 V
# n! D( m7 v' w: @7 T 8DU{OM_DNGPX5]_70F_V$IB.png
  W8 J) V" C. R# a7 ]3 P' x
% S8 P3 \, P& @1 M/ PSSD1306 的每页包含了 128 个字节,总共 8 页,这样刚好是 128*64 的点阵大小。因为每次写入都是按字节写入的,这就存在一个问
1 a; r! m* I8 Z7 F% Y0 G$ n) @' S3 S& a. @! l
题,如果我们使用只写方式操作模块,那么,每次要写 8 个点,这样,我们在画点的时候,就必须把要设置的点所在的字节的每个位都搞
0 Q6 p% P$ g0 ?7 ^+ s
' K/ H% c1 J- G" G$ Y% z清楚当前的状态(0/1?),否则写入的数据就会覆盖掉之前的状态,结果就是有些不需要显示的点,显示出来了,或者该显示的没有显7 p) G8 S9 \; T  e- _4 \+ }
2 ^" S3 P6 t9 X9 M) H
示了。这个问题在能读的模式下,我们可以先读出来要写入的那个字节,得到当前状况,在修改了要改写的位之后再写进 GRAM,这样就1 V; r9 _2 w% Q9 t
/ o! |' K6 |% U6 l; v+ s
不会影响到之前的状况了。但是这样需要能读 GRAM,对于 4 线 SPI 模式或者 IIC 模式来说,模块是不支持读的,而且读->改->写的方式
; j  a! S. v# m( {7 q( L7 [9 _( N  U; n3 y; u5 ~
速度也比较慢。# O0 i# p' f! U6 x# ~

( T' h  ]- e# }" O# [我们推荐采用的办法是在单片机的内部建立一个 OLED 的 GRAM(需要 128*8 个字节),在每次修改的时候,只是修改单片机上的 GRAM(实际上就是 SRAM),在修改完了之后,一次性把单片机内部的 GRAM 写入到 OLED 的 GRAM。当然这个方法也有坏处,就是对于那些 SRAM 很小的单片机(比如 51 系列)就比较麻烦了,如果内存不够,那就推荐还是采用并口模式,这样可以节约内存。  ~% P8 O. V) N+ y$ L# V. d1 Y

4 u( ?4 e" ]0 g指令1 b0 |5 w! `. ^! _! L" x3 }  D
1 P3 p8 w, ^7 k
SSD1306 的指令比较多,这里我们仅介绍几个比较常用的命令* @& W/ g* Z  P5 ~3 v% n

$ @  h, U3 j0 q# {9 C% z (1RNB@KEV13@5UO6}4{]1JR.png
/ N/ ?& W2 v5 s# Q
, D' X) j  a  `9 D# c7 b% h第一个命令为 0X81,用于设置对比度的,这个命令包含了两个字节,第一个 0X81 为命令,随后发送的一个字节为要设置的对比度的值。这个值设置得越大屏幕就越亮。
. u; t  N' d- T
  L7 V& x0 y/ \" n# Q第二个命令为 0XAE/0XAF。0XAE 为关闭显示命令;0XAF 为开启显示命令。
- g8 j  a9 b, j7 I- S' K2 o& g: V; R3 R
第三个命令为 0X8D,该指令也包含 2 个字节,第一个为命令字,第二个为设置值,第二个字节的 BIT2 表示电荷泵的开关状态,该位为 1,则开启电荷泵,为 0 则关闭。在模块初始化的时候,这个必须要开启,否则是看不到屏幕显示的。
0 F6 B1 A, \' s& g3 g* H0 c4 @0 C# ?8 @  h' }5 t
第四个命令为 0XB0~B7,该命令用于设置页地址,其低三位的值对应着 GRAM 的页地址。" R. U7 w, a* |3 e

+ y( U: A* n4 K; N! [第五个指令为 0X00~0X0F,该指令用于设置显示时的起始列地址低四位。% c2 E9 \% b# v
( @# d. k. Z0 o% T1 x
第六个指令为 0X10~0X1F,该指令用于设置显示时的起始列地址高四位。
' l% g) f# B5 i1 D1 K6 h
0 \$ k  n2 @. i其他命令,我们就不在这里一一介绍了,大家可以参考 SSD1306 datasheet 的第 28 页。从这页开始,对 SSD1306 的指令有详细的介绍。
# \# z7 O0 \  ^  J
' }6 D; H0 h; B: s- p* G& ]" ^$ h5 u2 A! g4 W: @; Z) `, o
/ y8 `9 B  q8 B5 b; B0 w  o! W+ w3 X
收藏 评论0 发布时间:2022-3-29 10:18

举报

0个回答

所属标签

相似分享

官网相关资源

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