我是靠谱客的博主 受伤发夹,这篇文章主要介绍STM32基于SPI的显示(OLED)前言OLED 屏幕实验目标主函数实验结果总结,现在分享给大家,希望可以做个参考。

文章目录

  • 前言
  • OLED 屏幕
  • 实验目标
    • 代码分析1
    • 代码分析2
  • 主函数
  • 实验结果
  • 总结


前言

本文使用SPI 通信的OLED屏幕,芯片使用的是STM32F103ZET6。OLED模块整体来说比较简单,就是加字模,调函数的过程。初学者可以好好看看里面包含的函数,还是很有趣的。

OLED 屏幕

OLED,即有机发光二极管。OLED由于同时具备自发光,不需要光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示技术。

LCD都需要背光,而 OLED 不需要,因为它是自发光的。这样同样的显示, OLED 效果要
来得好一些。 以目前的技术, OLED 的尺寸 还难以大型化,但是分辨率确可以做 到很高。在本章中 ,我们使用的是 ALINETEK 的 OLED 显示模块;

该模块有以下特点:

  1. 模块有单色和双色两种可选,单色为 纯蓝色 ,而双色则为黄蓝双色。
  2. 尺寸小,显示尺寸为 0.96 寸,而模块的尺寸仅为 27mm*26mm 大小。
  3. 高分辨率,该模块的分辨率为 128*64 。
  4. 多种接口方式,该模块提供了总共 5 种接口包括: 6800 、 8080 两种并行接口方式、3
    线或 4 线的穿行 SPI 接口方式, IIC 接口方式(只需要 2 根线就可以控制 OLED 了!)。
  5. 不需要高压,直接接 3.3V 就可以工作了。
  • 本文使用的是7线0.96寸SPI的OLED模块。
  • 芯片:STM32F103ZET6(正点原子)

在这里插入图片描述
图片来自网络(如果侵权,请联系删除)。
引脚连接:

OLEDSTM32
VCC3V3 或 5V
D0PD6(SCL)
D1PD7(SDA)
RESPD4
DCPD5
CSPD3

其中,CS 可以不用连接。

实验目标

  • 显示自己的学号和姓名
  • 显示AHT20的温度和湿度
  • 上下或左右的滑动显示长字符,比如“Hello,欢迎来到重庆交通大学物联网205实训室!”

需要找一个OLED的例程,在例程里进行修改。(一般商家会提供例程)

学号显示可以使用显示字符串的函数,姓名则需要显示汉字的函数。
注意:显示汉字时,需要将汉字的点阵(利用软件生成点阵)放到存放点阵的文件中。
在这里插入图片描述

代码分析1

显示字符串函数
复制代码
1
2
3
4
5
6
7
8
9
10
11
void OLED_ShowString(u8 x,u8 y,u8 *chr) { unsigned char j=0; while (chr[j]!='') { OLED_ShowChar(x,y,chr[j]); x+=8; if(x>120){x=0;y+=2;} j++; } }

例:OLED_ShowString(32,0,"********");
其中x,y是定义显示的位置,chr代表字符串。将收到的字符串存入字符数组中,按字符的方式输出。

显示汉字函数
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void OLED_ShowCHinese(u8 x,u8 y,u8 no) { u8 t,adder=0; OLED_Set_Pos(x,y); for(t=0;t<16;t++) { OLED_WR_Byte(Hzk[2*no][t],OLED_DATA); adder+=1; } OLED_Set_Pos(x,y+1); for(t=0;t<16;t++) { OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA); adder+=1; } }

例:OLED_ShowCHinese(16,0,1);
其中的x,y依然定义显示的位置,后面的no表示你存入字模的数组下标。

用OLED 显示AHT20 测试的温湿度,就需要将AHT20 的模块加入到工程中。详细步骤参见链接。
然后,将AHT20中的主函数也移植到工程的主函数中,注意重定义问题
由于显示温湿度是使用的数字显示,所以就需要使用到显示数字的函数。

代码分析2

显示数字函数
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size) { u8 t,temp; u8 enshow=0; for(t=0;t<len;t++) { temp=(num/oled_pow(10,len-t-1))%10; if(enshow==0&&t<(len-1)) { if(temp==0) { OLED_ShowChar(x+(size/2)*t,y,' '); continue; }else enshow=1; } OLED_ShowChar(x+(size/2)*t,y,temp+'0'); } }

例:OLED_ShowNum(48,2,c1,2,16);
其中x,y的含义和上面是相同的,num表示数字或者变量的值,len表示显示数字的位数,size表示显示数字的字体大小。
从函数中可以看出来,显示数字也是按照显示字符的方式来显示的。

添加所需要用到的字模到字模文件中去,依次调用其中的文字,然后利用编程进行循环显示即可。

主函数

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include "delay.h" #include "sys.h" #include "oled.h" #include "led.h" #include "AHT20.h" #include "myiic.h" #include "usart.h" int32_t main(void) { uint32_t CT_data[2]; volatile int c1,t1; int i,j; SensorDelay_us(40000);//刚上电,延时40ms才可以读取状态 delay_init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为115200 delay_ms(40);//刚上电,延时40ms才可以读取状态 if(!((AHT20_Read_Status()&0x08)==0x08))//首先发0x71读取状态字bit[3],如果=1,为校准输出,无须初始化!!! 正常情况下读回来的状态是0x1C或者是0x18,读回来是0x80表示忙状态; { AHT20_Init(); //初始化AHT20 } OLED_Init(); //初始化OLED OLED_Clear(); while(1) { OLED_ShowCHinese(0,0,0); OLED_ShowCHinese(16,0,1); OLED_ShowString(32,0,"********"); delay_ms(5000); AHT20_Read_CTdata(CT_data); //不经过CRC校验,直接读取AHT20的温度和湿度数据 推荐每隔大于1S读一次 c1 = CT_data[0]*100*10/1024/1024; //计算得到湿度值(放大了10倍) t1 = CT_data[1]*200*10/1024/1024-500;//计算得到温度值(放大了10倍) c1=c1/10; t1=t1/10; printf("湿度:%d",c1); printf("温度:%dn",t1); delay_ms(5000); OLED_ShowCHinese(0,2,3);//湿 OLED_ShowCHinese(16,2,4);//度 OLED_ShowCHinese(32,2,5);//: OLED_ShowNum(48,2,c1,2,16);//温度显示 OLED_ShowChar(62,2,'%'); OLED_ShowCHinese(0,4,2);//温 OLED_ShowCHinese(16,4,4);//度 OLED_ShowCHinese(32,4,5);//: OLED_ShowNum(48,4,t1,2,16);//湿度显示 OLED_ShowChar(62,4,'C'); //你好,欢迎来到重庆交通大学物联网实验室 for(i=0;i<12;i++) { OLED_ShowCHinese(0,6,6+i);//你 OLED_ShowCHinese(16,6,7+i);//好 OLED_ShowCHinese(32,6,8+i);//, OLED_ShowCHinese(48,6,9+i);//欢 OLED_ShowCHinese(64,6,10+i);//迎 OLED_ShowCHinese(80,6,11+i);//来 OLED_ShowCHinese(96,6,12+i);//到 OLED_ShowCHinese(112,6,13+i);//重 if(i==11) { i=0; delay_ms(5000); for(j=0;j<8;j++) { OLED_ShowCHinese(112,6,6+j); OLED_ShowCHinese(112,6,7+j); OLED_ShowCHinese(112,6,8+j); OLED_ShowCHinese(112,6,9+j); OLED_ShowCHinese(112,6,10+j); OLED_ShowCHinese(112,6,11+j); OLED_ShowCHinese(112,6,12+j); OLED_ShowCHinese(112,6,13+j); } } delay_ms(5000); } } }

实验结果

在这里插入图片描述

总结

OLED显示就是调用OLED里面的函数,然后在屏幕中进行显示的过程。一般用来显示字符、字符串、汉字以及一些小一点的图片也是能显示的。文字的显示都是有对应的点阵的,才能够进行显示。
了解OLED的使用就是对OLED调用函数的了解,请大佬指导纠错。

最后

以上就是受伤发夹最近收集整理的关于STM32基于SPI的显示(OLED)前言OLED 屏幕实验目标主函数实验结果总结的全部内容,更多相关STM32基于SPI的显示(OLED)前言OLED内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(94)

评论列表共有 0 条评论

立即
投稿
返回
顶部