|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
COCOFLY教程 ——疯壳无人机·系列 SPI(OLED)
8 `. _9 I0 y# I/ Q$ h
+ x8 J& N( ^# w/ x! X2 `, Z9 G- m# U
2 P& _ B% X- H# B; Q1 x
2 G7 W6 A* ~) h- R, f n: L 图1- d& u9 a) X0 v+ n+ c
, L4 U3 K& A/ ^) U' }0 {# a2 X1 n4 Z( f) k4 C ^; x
一、OLED 简介" |( F" @6 H8 a& t. B7 ~
3 J7 M4 e9 b+ ^# C' Y0 J
OLED(OrganicElectroluminesence Display)有机发光显示器,与传统的显示器不同的是,传统的显示器需要背光,才能显示;而 OLED 则不需要,其自身就能够发光。7 {, S# a9 F; w+ G
而 OLED 之所以能够自发光,主要是通过电场驱动:有机半导体材料和发光材料通过过载流子注入和复合后实现发光。从本质上来说,就是通过 ITO 玻璃透明电极作为器件阳极,金属电极作为阴极,通过电源驱动,将电子从阴极传输到电子传输层,空穴从阳极注入到空穴传输层,之后分迁移到发光层,二者相遇后产生激子,让发光分子激发,经过辐射后产生光源。简单来说,一块 OLED 屏幕,就是由百千万个“小灯泡”组成。
) n# v6 `2 `7 |1 |9 |1 u# u* Z OLED 不仅更轻薄、功耗低、亮度高、发光率好、可以显示纯黑色,并且还可以做到弯曲,如当今的曲屏电视和手机等。当今国际各大厂商都争相恐后的加强了对 OLED 技术的研发投入,使得 OLED 技术在当今电视、电脑(显示器)、手机、平板等领域灵应用愈加广泛。如下图所示为 OLED 显示屏模块实物图。) ^( u2 J/ `9 w( a5 ~! u( @
f& R2 ?) }8 Y. A; G
" v( v3 g( r( @+ N* z1 k8 W. ] 图2
, N' g3 @9 h4 B
) J* Y; y: T7 m3 {8 F0 |* r 二、SPI 驱动 OLED 实验
9 P. F4 E3 s D T/ |* M9 ?8 g8 u- j
. e: ?" E7 e* @/ W" t5 ] 在本节中应用的到的 SPI 与飞控开发基础篇《SPI(六轴传感器数据获取)》一节不同,本节用的到的是通过 GPIO 模拟的 SPI,而飞控开发基础篇《SPI(六轴传感器数据获取)》中应用的是 STM32 硬件 SPI。而 SPI 协议相关知识可以参考飞控开发基础篇《SPI(六轴传感器数据获取)》。
" j6 t: a5 A% ?2 N, L5 l* S7 F3 n 根据原理图可知 OLED 屏的电气连接关系,如下图所示。# D5 s3 \/ |# m- R+ c" n# ^
! f6 }- X* H+ u
+ P4 [5 u3 w/ c- j
2 t# W, m" ~4 B. q) C5 o- q/ u 图3
5 L2 U+ g! s1 M2 A# { 可知 OLED 的复位脚 RES 接在 STM32 的 PB6、OLED 的命令/数据选择脚DC 接在 STM32 的 PB7、OLED 的时钟线接在 STM32 的 PA5、OLED 的数据输入接在 STM32 的 PA7。这里的 OLED 模块没有 CS 片选脚,是因为模块内部已经默认接地了。OLED 显示的整体代码编写思路如下。
- Y; T9 F: l: F2 R. O! b7 I4 ~+ W' Q" j% A
代码思路
1 Q4 m2 k7 d4 i2 J8 T' C$ E5 V2 t7 H% E
" S2 S8 `* R( h4 e/ b2 ~3 W 表1
% |$ n7 } N& H# X/ |: ^ 根据 OLED 的驱动芯片 SSD1306 的手册可以得知控制时序,如下图所示。, H0 V4 Q6 [: X& K0 N- e' C$ q/ J+ X
; X6 X+ v8 \4 y7 _1 G. n( J
6 f8 n- G; H2 C* b' v 图4! ]! e- U! @ _7 i! U. Y1 S L
根据时序就可以编写对应时序的代码了。如下图所示为 OLED 写时序的代码。
* S" Y/ J7 r3 v0 e! @ B0 C2 G8 ~- |3 i( s, m+ n2 M
+ l9 \, j8 Q" [
图54 y- z) L3 M' _4 f1 H/ k
根据 SSD1306 手册可得知 OLED 的初始化流程,如下图所示。
" i( S K' u7 ]
" ], }' }& z4 F) i
2 R7 R6 t8 A3 u; R 图6
- ~4 t& ^) j" `: [1 ]$ H6 ~, g. v8 Q7 {+ m
OLED 初始化代码实现如下图所示。" J* B% y1 Z" K [" u$ N- U
, C0 O- D+ u, [
2 W! N9 |5 u$ r/ _6 l" {
* \$ M8 Y) K" d
' T5 F+ t: u6 V' L6 D* Z$ b) C 图7
2 q2 t; `' D8 m+ e6 t3 d5 b% \' m OLED 的所有显示都是基于描点得来的,由点成线,再由线成面。OLED 的描点函数代码实现如下图所示。
# A6 G1 X6 F) W
4 u- ]5 \- p. }' D1 d: ]3 x3 p. _) m
: [6 [: {& @; _* J 图8
! W9 A. N/ T1 b9 p# `1 X5 C8 \& F9 z OLED 显示单个字符的代码如下图所示。1 A: i' A3 a$ ^$ a
5 C2 N) d; l3 G+ M7 r2 G% m- K6 m% ?
S9 q- p8 L9 Z" m
图9
1 O/ f- i( Y8 L: y4 P+ n, r6 P 显示字符需要对相应的字符取模,这里已经提供了两种取好模的字体,按照“阴码、逐列式、顺向”的取模方式,分别是 12*6、16*8 大小的字体,在 oledfont.h 里,如下图所示。 J. |. @: @2 D% t0 f
8 h) V/ x" T; e2 ?5 N' q
8 [4 Y( y& a7 H 图104 Z9 I) D ~! o7 q! j/ j
取模需要通过取模软件,这里使用的是“PCtoLCD2002”,该软件有两大功能,一种是字符取模,另一种是图片取模。这里我们用到的是字符取模,根据代码驱动的描点方向,生成的 12*6 字模的字模选项设置如下图所示。
- p4 s6 E0 s3 N. U" p! j
0 X# V7 |, d9 `
* @" {4 |* C: M$ G( b4 L 图119 ]/ ~& J# E; Q
这里以生成 12*6 的字符“1”做举例,按照上图设置好字模选项设置后,输入“1”,点击“生成字模”,即可生成对应的 16 进制字模代码,如下图所示。+ ^8 r: B$ n; A {# r3 Z
) v+ K" B, u% ^. p6 V5 j1 I+ u# J* Z9 F3 }9 }
图120 S/ i' }' X+ c! m
本次是实验需要通过 OLED 显示“COCOFLY”以及“www.fengke.club”, 具体实现代码如下。
+ O0 c: R; s( r6 M8 r
- m- P; r$ p6 q4 n. D9 F5 o6 [& Z: k7 d
图13$ ~% \9 m+ Y2 x+ j/ f1 [
保存编译下载,实现现象如下图。
; _6 W$ C% \+ N- P! I. n2 @4 b
5 ^4 u! U/ t. ~, ]) G" F E 图14% [" X% G& H+ q; S9 J
' I$ V1 A3 C1 T2 q/ ]4 x; M5 ]: J6 i+ L, P- q0 |6 v% x, g
+ F3 n( c8 y+ i& \) |6 r/ u: L0 M, W! s u0 T
由于图片和文件上传数量有限,部分图片无法继续上传,有兴趣的伙伴可以登陆官网:“疯壳”查看4 l1 a) g0 y9 r9 U& F& t
- I/ C/ v. ]% Q8 y4 ?0 c% ^
更多完整学习资料和对应开源套件,请登陆官网:“疯壳”1 Q( l4 g# Q s% J& |& u$ |* q4 C0 w
* K( ^* M7 A' c
如需定制开发,请通过官网“疯壳”网页底部的“联系我们”进行联系
/ x& ^. L! H& z7 X! k2 p ?9 Q. l2 c3 j/ w
|
|