|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
COCOFLY教程 ——疯壳无人机·系列 SPI(OLED)
# I# Y: R% g7 j6 ^" H5 T( g+ \7 j
# ~6 H; ^ I" G7 ^$ q8 n
1 n* A% M) B9 u
# L3 t" I! B' d& [ 图1
5 @% D N( K: c, Z$ G. L8 m* d4 I ^1 `& V9 p
# n* ?0 F$ J; c
一、OLED 简介
0 H5 f5 ~& t; e
5 R+ o5 [. B! ^9 A% o. F OLED(OrganicElectroluminesence Display)有机发光显示器,与传统的显示器不同的是,传统的显示器需要背光,才能显示;而 OLED 则不需要,其自身就能够发光。. X4 p1 T% I8 D
而 OLED 之所以能够自发光,主要是通过电场驱动:有机半导体材料和发光材料通过过载流子注入和复合后实现发光。从本质上来说,就是通过 ITO 玻璃透明电极作为器件阳极,金属电极作为阴极,通过电源驱动,将电子从阴极传输到电子传输层,空穴从阳极注入到空穴传输层,之后分迁移到发光层,二者相遇后产生激子,让发光分子激发,经过辐射后产生光源。简单来说,一块 OLED 屏幕,就是由百千万个“小灯泡”组成。
1 X! [$ j1 K* ^& i/ O Z OLED 不仅更轻薄、功耗低、亮度高、发光率好、可以显示纯黑色,并且还可以做到弯曲,如当今的曲屏电视和手机等。当今国际各大厂商都争相恐后的加强了对 OLED 技术的研发投入,使得 OLED 技术在当今电视、电脑(显示器)、手机、平板等领域灵应用愈加广泛。如下图所示为 OLED 显示屏模块实物图。! O7 G2 }/ X8 I# M
$ @! D' K: _1 n5 R- ?: ^
' m, b* I$ I `9 D. u# ~! H( w4 M5 C8 j 图2
% J2 K8 C' K$ }1 D/ b
) K9 P; Y1 {3 R) X _ E: ~+ s' D5 R1 r 二、SPI 驱动 OLED 实验
3 x1 b4 D: M" ^3 h5 [: g$ R& V& M3 a0 \
在本节中应用的到的 SPI 与飞控开发基础篇《SPI(六轴传感器数据获取)》一节不同,本节用的到的是通过 GPIO 模拟的 SPI,而飞控开发基础篇《SPI(六轴传感器数据获取)》中应用的是 STM32 硬件 SPI。而 SPI 协议相关知识可以参考飞控开发基础篇《SPI(六轴传感器数据获取)》。# r+ l* @7 I4 R! E6 p9 ?5 J b3 W
根据原理图可知 OLED 屏的电气连接关系,如下图所示。
; T; b! t# e1 s" e- O% p* `4 P; c) u) E
/ G7 [6 ]; Z4 j, z. s; ~* L5 x
$ m1 g& }# X/ [6 q, } 图3
2 f$ s( k7 e9 z- I7 M4 ]+ z 可知 OLED 的复位脚 RES 接在 STM32 的 PB6、OLED 的命令/数据选择脚DC 接在 STM32 的 PB7、OLED 的时钟线接在 STM32 的 PA5、OLED 的数据输入接在 STM32 的 PA7。这里的 OLED 模块没有 CS 片选脚,是因为模块内部已经默认接地了。OLED 显示的整体代码编写思路如下。# }) ]3 u) v. n( @8 A
8 V& a. }6 } v; Y
代码思路
3 j+ V! F- P3 n1 ~7 w( e* _0 ]$ R. z1 H. H$ Y- z9 \
: i! b" |1 V$ P! a% i
表13 u" ]( e5 e8 N; X
根据 OLED 的驱动芯片 SSD1306 的手册可以得知控制时序,如下图所示。
: B$ j5 y- Z6 a u+ k. y, O3 E4 _5 w, V& b! }6 u6 _! p
6 t# o& P% w, W5 z; C+ Q 图4: _/ @8 F% L/ r: H' g
根据时序就可以编写对应时序的代码了。如下图所示为 OLED 写时序的代码。
7 k/ J2 e1 m' g+ X: N7 f0 O+ j. J0 U7 M, S" O
5 u5 W+ s2 I- i5 y* Z6 u! O 图5
& V$ ]1 p% |/ M, F ~2 L6 F9 S 根据 SSD1306 手册可得知 OLED 的初始化流程,如下图所示。
2 Z% V3 C( J! M8 z5 |5 w' H" X. j$ l$ _8 i
* e; |% j' W+ a) ~+ Q" W! B" I3 \ 图6
o2 l/ l/ Q1 M; r& E* W
' L t, Y5 Y% z2 o; N0 h1 l9 I OLED 初始化代码实现如下图所示。) @4 G) A( y9 u& V7 s
! Y5 V( o& r3 z8 [
: P8 b( Z3 \: w+ k
8 ~. t( h" b; N0 l
, {: z2 `, A; f5 g7 } 图7/ x% A1 S1 u& b1 ^) x/ i$ c4 u
OLED 的所有显示都是基于描点得来的,由点成线,再由线成面。OLED 的描点函数代码实现如下图所示。
* R9 r% p3 [- F$ x; ]( ]
' W @0 H& x5 [& q- R
! G5 ^% r s* u2 K/ r4 k+ A; ` 图8
; m. C3 ^% M/ K" T4 _4 Q. n: l! R% K6 p OLED 显示单个字符的代码如下图所示。
+ t) `+ m% g% H- m: j
1 Q5 r7 e, W7 t1 g4 L( @' [* N
' C1 o8 j% K- m1 [' M% N
图9
1 l! d9 c# E* U% f 显示字符需要对相应的字符取模,这里已经提供了两种取好模的字体,按照“阴码、逐列式、顺向”的取模方式,分别是 12*6、16*8 大小的字体,在 oledfont.h 里,如下图所示。5 `% b9 T7 J0 @3 M7 E+ T2 c' @- J
. \' S" ?# Q: b' R% c9 r/ E5 L( n
图10: o" M3 Z$ x, ]$ _- b. Q
取模需要通过取模软件,这里使用的是“PCtoLCD2002”,该软件有两大功能,一种是字符取模,另一种是图片取模。这里我们用到的是字符取模,根据代码驱动的描点方向,生成的 12*6 字模的字模选项设置如下图所示。
& Z1 @6 p m5 L! X' t0 r7 d6 Z# m4 a, C
3 W5 L. O9 D0 N: G/ Z7 g K/ [ 图11! E1 L c Z3 ^9 e7 {: D# b% u
这里以生成 12*6 的字符“1”做举例,按照上图设置好字模选项设置后,输入“1”,点击“生成字模”,即可生成对应的 16 进制字模代码,如下图所示。
" k# f+ Y, F3 [' v0 {0 u; ~/ D3 F$ f* M+ k- x- B; W" X1 g( u) f
: y5 f+ m" c, u, O9 u
图12
( V- e, h6 W3 }1 ]* s 本次是实验需要通过 OLED 显示“COCOFLY”以及“www.fengke.club”, 具体实现代码如下。- Z9 h: s( j" n1 E) }2 A; F
% x% Y) c2 _4 |% c) L/ ^
' _1 z. D7 c6 n6 v' K6 g
图13
0 V; G" B" D7 d+ F& a0 X5 B 保存编译下载,实现现象如下图。
8 _ `' h; \7 ?% Q6 I' [# J6 }1 Y2 W
7 f+ {+ p! Z' x# }7 E) _1 p \2 }
图14
, j3 ^: ]2 }2 n* i1 i8 W# j% t6 N0 H0 B9 `% ?
4 R1 Q4 K1 u& V
8 D% c) N+ J4 D. l3 S. z T# k7 G
由于图片和文件上传数量有限,部分图片无法继续上传,有兴趣的伙伴可以登陆官网:“疯壳”查看8 I; Q/ A7 c& q5 \7 G8 E
7 H r U1 Z: R' F; K( H# y9 i更多完整学习资料和对应开源套件,请登陆官网:“疯壳”
- G) b* ?' X- I* O6 Q- @& a. t, D
如需定制开发,请通过官网“疯壳”网页底部的“联系我们”进行联系
0 ]2 g4 V& ?/ O, {
: F0 u; C! H3 f0 Q |
|