OLED屏是一种小巧的显示器件,特别是I2C接口的OLED 屏更能节省I/O口资源。本次使用的是一款0.91'的单色OLED屏,它比常规的OLED屏要长且窄,故更适于显示信息和参数,也更适于用在便携装置上。 1. OLED屏显示 1)OLED屏与NV32F100的连接关系如下: SCL --- PA5 SDA --- PA6 2)为进行显示定义引脚输出高低电平的语句为: #defineOLED_SCLK_Clr() GPIO_PinClear(GPIO_PTE1); #defineOLED_SCLK_Set() GPIO_PinSet(GPIO_PTE1);
3 c& E$ ]; v/ {4 p( F: M#defineOLED_SDIN_Clr() GPIO_PinClear(GPIO_PTE0); #defineOLED_SDIN_Set() GPIO_PinSet(GPIO_PTE0);
# T* ?2 m9 E; v$ Z* z7 H/ p6 z, W3)OLED屏初始化函数为: - void OLED_Init(void), p: ]/ x5 W5 r# [
- { ' C+ _; z$ m. z. J, g2 U& v
- GPIO_InitTypeDef GPIO_InitStruct;
7 r6 V* P \* S - __HAL_RCC_GPIOA_CLK_ENABLE();$ t: N. p" I' L& A
- GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6;
+ T) F7 s, f& `% m# } ^ - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
. q# M; p5 n) k* q0 Y$ M$ f: u/ c - GPIO_InitStruct.Pull = GPIO_PULLUP; S( t; g) y' p+ k' q7 a
- GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
7 M- P- A/ T; ~6 L9 n% Y+ M x) G U - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
D; W e5 [( @2 J - OLED_SCLK_Set();
. |$ a4 F) w& c* y& T; b9 h - OLED_SDIN_Set();
0 F# M1 u0 q) d/ Q - Delay_1ms(800);1 P# l5 C/ I3 B- t2 O5 I% L( }
- OLED_WR_Byte(0xAE,OLED_CMD);//--display off$ v& g( Z( ~+ I! C
- OLED_WR_Byte(0x40,OLED_CMD);//--set start line address : i5 s8 u( G( D% {( P( d
- OLED_WR_Byte(0xB0,OLED_CMD);//--set page address
8 P% H# Q- t% L5 D% R) K - OLED_WR_Byte(0x81,OLED_CMD); // contract control% {' F' r* q4 M1 g# \! B% p
- OLED_WR_Byte(0xFF,OLED_CMD);//--128 3 t# q" X2 `( |- z& C3 L( t, z
- OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap, _7 h& G, x* E* n0 i0 c
- OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse
o" G8 }& X$ K& x, _7 B3 X7 Q - OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
+ I9 k' X6 b4 s - OLED_WR_Byte(0x1F,OLED_CMD);//--1/32 duty
4 b- P5 s! M% a- h& C - OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction
9 ^, \. U( C7 S. i6 Z W - OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset
5 @+ B0 E/ I) A' i0 F. e - OLED_WR_Byte(0x00,OLED_CMD);//& P! n* `% ]8 }7 |# G* T% ~/ v
- OLED_WR_Byte(0xD5,OLED_CMD);//set osc division
; k( D( A9 z& {$ b - OLED_WR_Byte(0xF0,OLED_CMD);//3 z+ Z; l! G+ k6 k8 U0 Q
- OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period) q5 }- D4 a& X0 j6 ~( I b
- OLED_WR_Byte(0x22,OLED_CMD);//8 l$ c7 |5 Z b6 d) r ^& A
- OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion
/ O4 C% a! {3 R2 @$ ~: b) S - OLED_WR_Byte(0x02,OLED_CMD);//
$ l+ V+ R8 y) K( u k3 b - OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh
, T- [. m# j4 @* V - OLED_WR_Byte(0x49,OLED_CMD);//
9 E3 M7 U- K/ K; ?4 R# s* O7 g - OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable
/ P" d0 ]' I {+ m - OLED_WR_Byte(0x14,OLED_CMD);//
% u# x0 k3 L. U# P( R - OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
; i9 ]5 K, X( ^- M, T# E* z2 R! _7 A - OLED_Clear();
& ]# s: N2 g& g% b' p0 `8 E& @9 J! I4 g - }
复制代码
, O T; r' s2 \4)汉字显示函数为: - void OLED_ShowCHinese(unsigned char x,unsigned char y,unsigned char no)% p5 U3 `5 s! ?" K$ W
- { ; B# D- }0 \: k) Q1 N8 N
- unsigned char t,adder=0;
/ F1 u! j5 \3 L9 b% `; U7 n - OLED_Set_Pos(x,y); 0 j, X* R n6 p! ?, ? I/ |4 Z( @6 ?
- for(t=0;t<16;t++)
+ A8 A) K+ l) k3 C - {
) u* w! u- l0 U2 n- \ - OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
' R: l" A/ t1 O! K" F! }# G - adder+=1;
% ] Q" ^3 [- f/ x- z# h - }. [" X% U$ F/ }4 I3 M
- OLED_Set_Pos(x,y+1);
8 k6 }# G1 r; N2 f1 k" z8 k" [/ o - for(t=0;t<16;t++)( I2 y( ?" _% w! }9 ]$ h
- {
r/ p, a& q, Q - OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
3 }. g# M3 |' Q% e - adder+=1;, h0 U4 o6 V1 G' K( A
- } - D5 w! K7 ^2 U7 V
- }
复制代码
! T/ k2 i% c( |$ h" ]/ M g2. 字模提取 为了显示汉字,需要提前相应的字模,以PCtoLCD2002字模提取软件为例,在提取前需按图1所示来进行设置。 图1 格式设置 , q$ T M1 U; L
1)录入需显示的内容,如图2所示。 图2 输入提取内容 / @0 {: f& e# G/ k
2)编写显示函数,其内容为: - void cd()5 F0 Y3 u% n) Q Y
- {3 G7 [9 n' v8 N8 T' {2 d7 ^
- OLED_ShowCHinese(18,0,0); 0 S6 Z% I I+ Y$ s; Q# j' d
- OLED_ShowCHinese(36,0,1);
% S& }; h4 q2 a% b - OLED_ShowCHinese(54,0,2);
5 ~1 x9 j1 b' p" u% W3 A6 W1 ]7 b - OLED_ShowCHinese(72,0,3);4 t6 m1 P) K/ X
- OLED_ShowCHinese(90,0,4);
% z+ ]% A7 R6 ]0 s$ p0 d& ] -
0 O; c' V4 Z6 j6 ]7 x9 j - OLED_ShowCHinese(18,2,5); 7 l% J, g, ^; e4 R1 v
- OLED_ShowCHinese(36,2,6);! H9 R2 ]" q, R$ N: w
- OLED_ShowCHinese(54,2,7); . s# [5 A- n# l% b( [3 N
- OLED_ShowCHinese(72,2,8);- X1 a. y" T; P' S3 W: Y
- OLED_ShowCHinese(90,2,9);( e+ G6 a, O+ X8 E+ @- r0 L
- }
复制代码 , J' c0 Q2 b: y$ r
3)编写主程序,其代码如下: - int main(void)8 N9 J) i2 {9 o/ v" c
- {3 J* j: p* Y1 Z0 R. m
- HAL_Init();# P" L4 _9 u: v+ D; J7 O" t
- /* Configure the system clock to 80 MHz */2 C$ a2 a3 ^- B/ _- v5 s
- SystemClock_Config();$ M# @. Q. [0 n4 ^- }$ b
- OLED_Init();
- U8 n) `; z" N+ @4 [7 r - OLED_Clear();2 `' n# o( D. R. z
- cd();$ L7 C$ A. Q w4 j; ^& M7 T
- while (1);4 h: d7 M0 g. N- d
- }
复制代码
5 P% Q) I( K/ U5 t1 ^0 F4)下载并运行后,其效果如图3所示。 图3 显示效果
7 q6 i5 Y9 c. `3 ~
, S$ A/ @1 g7 c# I! N工程代码:
8 c9 T3 {1 f7 `; U% b# I5 c3 T |