文章目录
- 前言
- OLED 屏幕
- 实验目标
- 代码分析1
- 代码分析2
- 主函数
- 实验结果
- 总结
前言
本文使用SPI 通信的OLED屏幕,芯片使用的是STM32F103ZET6。OLED模块整体来说比较简单,就是加字模,调函数的过程。初学者可以好好看看里面包含的函数,还是很有趣的。
OLED 屏幕
OLED,即有机发光二极管。OLED由于同时具备自发光,不需要光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示技术。
LCD都需要背光,而 OLED 不需要,因为它是自发光的。这样同样的显示, OLED 效果要
来得好一些。 以目前的技术, OLED 的尺寸 还难以大型化,但是分辨率确可以做 到很高。在本章中 ,我们使用的是 ALINETEK 的 OLED 显示模块;
该模块有以下特点:
- 模块有单色和双色两种可选,单色为 纯蓝色 ,而双色则为黄蓝双色。
- 尺寸小,显示尺寸为 0.96 寸,而模块的尺寸仅为 27mm*26mm 大小。
- 高分辨率,该模块的分辨率为 128*64 。
- 多种接口方式,该模块提供了总共 5 种接口包括: 6800 、 8080 两种并行接口方式、3
线或 4 线的穿行 SPI 接口方式, IIC 接口方式(只需要 2 根线就可以控制 OLED 了!)。 - 不需要高压,直接接 3.3V 就可以工作了。
- 本文使用的是7线0.96寸SPI的OLED模块。
- 芯片:STM32F103ZET6(正点原子)
图片来自网络(如果侵权,请联系删除)。
引脚连接:
OLED | STM32 |
---|---|
VCC | 3V3 或 5V |
D0 | PD6(SCL) |
D1 | PD7(SDA) |
RES | PD4 |
DC | PD5 |
CS | PD3 |
其中,CS 可以不用连接。
实验目标
- 显示自己的学号和姓名
- 显示AHT20的温度和湿度
- 上下或左右的滑动显示长字符,比如“Hello,欢迎来到重庆交通大学物联网205实训室!”
需要找一个OLED的例程,在例程里进行修改。(一般商家会提供例程)
学号显示可以使用显示字符串的函数,姓名则需要显示汉字的函数。
注意:显示汉字时,需要将汉字的点阵(利用软件生成点阵)放到存放点阵的文件中。
代码分析1
显示字符串函数 |
1
2
3
4
5
6
7
8
9
10
11void 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
17void 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
20void 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内容请搜索靠谱客的其他文章。
发表评论 取消回复