目录
一、题目要求
理解OLED屏显和汉字点阵编码原理,使用STM32F103的SPI或IIC接口实现以下功能:
-
显示自己的学号和姓名;
-
显示AHT20的温度和湿度;
-
上下或左右的滑动显示长字符,比如“Hello,欢迎来到重庆交通大学物联网205实训室!”或者一段歌词或诗词(最好使用硬件刷屏模式)。
二、SPI介绍
2.1 SPI简介
SPI 规定了两个 SPI 设备之间通信必须由主设备 (Master) 来控制次设备 (Slave). 一个 Master 设备可以通过提供 Clock 以及对 Slave 设备进行片选 (Slave Select) 来控制多个 Slave 设备, SPI 协议还规定 Slave 设备的 Clock 由 Master 设备通过 SCK 管脚提供给 Slave 设备, Slave 设备本身不能产生或控制 Clock, 没有 Clock 则 Slave 设备不能正常工作。
2.2 SPI特点
- SPI控制方式
采用主-从模式(Master-Slave) 的控制方式。
SPI 规定了两个 SPI 设备之间通信必须由主设备 (Master) 来控制次设备 (Slave). 一个 Master 设备可以通过提供 Clock 以及对 Slave 设备进行片选 (Slave Select) 来控制多个 Slave 设备, SPI 协议还规定 Slave 设备的 Clock 由 Master 设备通过 SCK 管脚提供给 Slave 设备, Slave 设备本身不能产生或控制 Clock, 没有 Clock 则 Slave 设备不能正常工作。
- SPI传输方式
采用同步方式(Synchronous)传输数据Master 设备会根据将要交换的数据来产生相应的时钟脉冲(Clock Pulse), 时钟脉冲组成了时钟信号(Clock Signal) , 时钟信号通过时钟极性 (CPOL) 和 时钟相位 (CPHA) 控制着两个 SPI 设备间何时数据交换以及何时对接收到的数据进行采样, 来保证数据在两个设备之间是同步传输的。
- SPI数据交换:SPI 设备间的数据传输之所以又被称为数据交换, 是因为 SPI 协议规定一个 SPI 设备不能在数据通信过程中仅仅只充当一个 “发送者(Transmitter)” 或者 “接收者(Receiver)”. 在每个 Clock 周期内, SPI 设备都会发送并接收一个 bit 大小的数据, 相当于该设备有一个 bit 大小的数据被交换了. 一个 Slave 设备要想能够接收到 Master 发过来的控制信号, 必须在此之前能够被 Master 设备进行访问 (Access). 所以, Master 设备必须首先通过 SS/CS pin 对 Slave 设备进行片选, 把想要访问的 Slave 设备选上. 在数据传输的过程中, 每次接收到的数据必须在下一次数据传输之前被采样. 如果之前接收到的数据没有被读取, 那么这些已经接收完成的数据将有可能会被丢弃, 导致 SPI 物理模块最终失效. 因此, 在程序中一般都会在 SPI 传输完数据后, 去读取 SPI 设备里的数据, 即使这些数据(Dummy Data)在我们的程序里是无用的。总的来说是没有读和写的说法,因为实质上每次SPI是主从设备在交换数据。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。
- SPI传输模式
上升沿、下降沿、前沿、后沿触发。当然也有MSB和LSB传输方式.
三、OLED介绍
3.1 OLED概述
OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(OrganicElectroluminesence Display, OELD)。OLED 由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。
LCD 都需要背光,而 OLED 不需要,因为它是自发光的。这样同样的显示,OLED 效果要来得好一些。以目前的技术,OLED 的尺寸还难以大型化,但是分辨率确可以做到很高。
3.2 OLED模块描述
ATK-0.96’ OLED 模块是 ALIENTEK 推出的一款高性能 OLED 显示模块,尺寸小巧(27mm26mm),结构紧凑,模块通过 1 个 28P 的 2.54mm 间距排针与外部连接,模块外观如图所示:
该模块具有如下特点:
双色可选,提供纯蓝色或黄蓝双色两种模块
高分辨率,分辨率为:12864
超小尺寸,OLED 显示屏为 0.96 寸,模块尺寸仅为 27mm26mm
多种接口方式,提供 8086 并口、6800 并口、4 线 SPI 和 IIC 等五种接口方式
集成 DCDC,无需外部高压,仅需提供 3.3V 电源,即可正常工作
图 2.1.1 中,左侧的图片是模块的背面图,右侧的是正面图。
3.2 OLED模块原理图
该模块采用 8*2 的 2.54 排针与外部连接,总共有 16 个管脚,在 16 条线中,我们只用了 15条,有一个是悬空的。15 条线中,电源和地线占了 2 条,还剩下 13 条信号线。在不同模式下,我们需要的信号线数量是不同的,在 8080 模式下,需要全部 13 条,而在 IIC 模式下,仅需要2条线就够了!这其中有一条是共同的,那就是复位线 RST(RES),RST 上的低电平,将导致 OLED 复位,在每次初始化之前,都应该复位一下 OLED 模块。
在下面实验中,将会采用七线OLED
参考厂家给出的Demo程序:0.96寸SPI_OLED模块配套资料包
更多参考资料网址:【STM32】STM32系列教程汇总
四、STM32+OLED显示个人学号姓名
4.1 文字取模方法
网站上搜索字模提取器 V2.2即可下载文件包:
- 打开取字模软件应用程序:
- 字模器初始设置及点阵生成
点击参数设置,点击其它选项,选择横向取模:
- 在文字输入区输入姓名,并ctrl+enter,得到显示图:
选择取模方式,点击C51格式,即可生成点阵:
4.2 工程代码修改与编写
找到工程项目中oledfont.h文件下的cfont16数组:
在该数组中添加姓名以及字模提取器生成的点阵码:
在test.c文件中对函数Test_MainPage进行修改:
主函数->main.c文件
工程编译生成hex文件:
4.3 线路连接及代码烧录
线路连接规则
usb to ttl —> stm32f103c8t6:
3V3 —> 3V3
GND —> GND
RXD —> A9
TXD —> A10
stm32f103c8t6 —> OLED屏显:
屏效果图展示
五、实验二:STM32+OLED滑动显示长字符
5.1 代码撰写
添加文字字模到oledfont.h文件中:
在test.c中对函数Test_MainPage进行修改:
void TEST_MainPage(void)
{
GUI_ShowCHinese(10,20,16,"大风起兮云飞扬",1);
//GUI_ShowString(40,32,"64X128",16,1);
//GUI_ShowString(4,48,"www.lcdwiki.com",16,1);*/
delay_ms(500);
}
修改主函数,添加相应的OLED滚动代码:
删除while内的函数Test_MainPage:
int main(void)
{
delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
OLED_Init(); //初始化OLED
OLED_Clear(0); //清屏(全黑)
OLED_WR_Byte(0x2E,OLED_CMD); //关闭滚动
OLED_WR_Byte(0x27,OLED_CMD); //水平向左或者右滚动 26/27
OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节
OLED_WR_Byte(0x00,OLED_CMD); //起始页 0
OLED_WR_Byte(0x07,OLED_CMD); //滚动时间间隔
OLED_WR_Byte(0x07,OLED_CMD); //终止页 7
OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节
OLED_WR_Byte(0xFF,OLED_CMD); //虚拟字节
TEST_MainPage();
OLED_WR_Byte(0x2F,OLED_CMD); //开启滚动
while(1)
{
//TEST_MainPage(); //主界面显示测试
//TEST_MainPage();
/*OLED_Clear(0);
Test_Color(); //刷屏测试
OLED_Clear(0);
Test_Rectangular(); //矩形绘制测试
OLED_Clear(0);
Test_Circle(); //圆形绘制测试
OLED_Clear(0);
Test_Triangle(); //三角形绘制测试
OLED_Clear(0);
TEST_English(); //英文显示测试
OLED_Clear(0);
TEST_Number_Character(); //数字和符号显示测试
OLED_Clear(0);
TEST_Chinese(); //中文显示测试
OLED_Clear(0);
TEST_BMP(); //BMP单色图片显示测试
OLED_Clear(0);
TEST_Menu1(); //菜单1显示测试
OLED_Clear(0);
TEST_Menu2(); //菜单2显示测试
OLED_Clear(0); */
}
}
5.2 效果展示图
oled
六、实验三:STM32+OLED显示温湿度
6.1 代码撰写
找到项目中oledfont.h,增添所需文字点阵:
在bsp_i2c.c中重新写入函数read_AHT20:
void read_AHT20(void)
{
uint8_t i;
for(i=0; i<6; i++)
{
readByte[i]=0;
}
//-------------
I2C_Start();
I2C_WriteByte(0x71);
ack_status = Receive_ACK();
readByte[0]= I2C_ReadByte();
Send_ACK();
readByte[1]= I2C_ReadByte();
Send_ACK();
readByte[2]= I2C_ReadByte();
Send_ACK();
readByte[3]= I2C_ReadByte();
Send_ACK();
readByte[4]= I2C_ReadByte();
Send_ACK();
readByte[5]= I2C_ReadByte();
SendNot_Ack();
//Send_ACK();
I2C_Stop();
//--------------
if( (readByte[0] & 0x68) == 0x08 )
{
H1 = readByte[1];
H1 = (H1<<8) | readByte[2];
H1 = (H1<<8) | readByte[3];
H1 = H1>>4;
H1 = (H1*1000)/1024/1024;
T1 = readByte[3];
T1 = T1 & 0x0000000F;
T1 = (T1<<8) | readByte[4];
T1 = (T1<<8) | readByte[5];
T1 = (T1*2000)/1024/1024 - 500;
AHT20_OutData[0] = (H1>>8) & 0x000000FF;
AHT20_OutData[1] = H1 & 0x000000FF;
AHT20_OutData[2] = (T1>>8) & 0x000000FF;
AHT20_OutData[3] = T1 & 0x000000FF;
}
else
{
AHT20_OutData[0] = 0xFF;
AHT20_OutData[1] = 0xFF;
AHT20_OutData[2] = 0xFF;
AHT20_OutData[3] = 0xFF;
printf("lyy");
}
printf("\r\n");
printf("温度:%d%d.%d",T1/100,(T1/10)%10,T1%10);
printf("湿度:%d%d.%d",H1/100,(H1/10)%10,H1%10);
printf("\r\n");
t=T1/10;
t1=T1%10;
a=(float)(t+t1*0.1);
h=H1/10;
h1=H1%10;
b=(float)(h+h1*0.1);
sprintf(strTemp,"%.1f",a); //调用Sprintf函数把DHT11的温度数据格式化到字符串数组变量strTemp中
sprintf(strHumi,"%.1f",b); //调用Sprintf函数把DHT11的湿度数据格式化到字符串数组变量strHumi中
//printf(strTemp);
//printf("/r/n");
GUI_ShowCHinese(16,00,16,"温湿度显示",1);
GUI_ShowCHinese(16,20,16,"温度",1);
GUI_ShowString(53,20,strTemp,16,1);
GUI_ShowCHinese(16,38,16,"湿度",1);
GUI_ShowString(53,38,strHumi,16,1);
delay_ms(1500);
}
主函数main.c文件:
线路连接规则,烧录代码
usb to ttl —> stm32f103c8t6以及stm32f103c8t6 —> OLED屏显的连线在实验一已经介绍过了,这里不再赘述
STM32F103C8T6核心开发板 ----> 温湿度采集器的连接:
3V3 —> 引脚1
GND —> 引脚3
PB6 —> SCL
PB7 —> SDA
6.2 效果展示
温湿度显示
总代码:链接:https://pan.baidu.com/s/1Q3kphdUQOE_PkA-3TlBKfA
提取码:1902
总结
通过本次实验,加深了对OLED的知识理解,在实践上也获得了很多心得,学会了运用字模的提取以及在代码中运用,再到OLED的显示,以及温湿度采集器在OLED上的显示。这三个实验每一个都很有实践操作意义,增强了我们的动手能力,
参考链接:
https://blog.csdn.net/dengjin20104042056/article/details/108404650
https://blog.csdn.net/Firefly_cjd/article/details/51935079
https://blog.csdn.net/qq_46467126/article/details/121439142
https://blog.csdn.net/qq_53112972/article/details/127596367