基于SPI通信方式的OLED显示
文章目录
- 基于SPI通信方式的OLED显示
- 1、SPI简介
- 2、OLED屏幕介绍
- 3、OLED显示屏显示数据
- 4、总结
- 5、参考文献
1、SPI简介
SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设 备接口,是一种高速全双工的通信总线。它被广泛地使用在 ADC、LCD 等设备与 MCU 间, 要求通讯速率较高的场合。
SPI 通讯设备之间的常用连接方式
SPI 通讯使用 3 条总线及片选线,3 条总线分别为 SCK、MOSI、MISO,片选线为 S S ,它们的作用介绍如下
SPI 基本通讯过程
这是一个主机的通讯时序。NSS、SCK、MOSI 信号都由主机控制产生,而 MISO 的信 号由从机产生,主机通过该信号线读取从机的数据。MOSI 与 MISO 的信号只在 NSS 为低 电平的时候才有效,在 SCK 的每个时钟周期 MOSI 和 MISO 传输一位数据
CPOL/CPHA 及通讯模式
SPI 一共有四种通讯模 式,它们的主要区别是总线空闲时 SCK 的时钟状态以及数据采样时刻
“时钟极性 CPOL”和“时钟相位 CPHA”
时钟极性 CPOL 是指 SPI 通讯设备处于空闲状态时,SCK 信号线的电平信号(即 SPI 通 讯开始前、 NSS 线为高电平时 SCK 的状态)。CPOL=0 时, SCK 在空闲状态时为低电平, CPOL=1 时,则相反。
时钟相位 CPHA 是指数据的采样的时刻,当 CPHA=0 时,MOSI 或 MISO 数据线上的 信号将会在 SCK 时钟线的“奇数边沿”被采样。当 CPHA=1 时,数据线在 SCK 的“偶数 边沿”采样。
当 CPHA=0 的时序图。首先,根据 SCK 在空闲状态时的电平,分为两种 情况。SCK 信号线在空闲状态为低电平时,CPOL=0;空闲状态为高电平时,CPOL=1。 无论 CPOL=0 还是=1,因为我们配置的时钟相位 CPHA=0,在图中可以看到,采样时 刻都是在 SCK 的奇数边沿。注意当 CPOL=0 的时候,时钟的奇数边沿是上升沿,而 CPOL=1 的时候,时钟的奇数边沿是下降沿。所以 SPI 的采样时刻不是由上升/下降沿决定 的。MOSI 和 MISO 数据线的有效信号在 SCK 的奇数边沿保持不变,数据信号将在 SCK 奇 数边沿时被采样,在非采样时刻,MOSI 和 MISO 的有效信号才发生切换。
当 CPHA=1 时,不受 CPOL 的影响,数据信号在 SCK 的偶数边沿被采样
由 CPOL 及 CPHA 的不同状态,SPI 分成了四种模式,主机与从机需要工作在相同的模式下才可以正常通讯,实际中采用较多的是“模式 0”与“模式 3”。
2、OLED屏幕介绍
OLED即有机发光管(Organic Light-Emitting Diode,OLED)。OLED显示技术具有自发光、广视角、几乎无穷高的对比度、较低功耗、极高反应速度、可用于绕曲性面板、使用温度范围广、构造及制程简单等有点,被认为是下一代的平面显示屏新兴应用技术。
OLED显示和传统的LCD显示不同,其可以自发光,所以不需要背光灯,这使得OLED显示屏相对于LCD显示屏尺寸更薄,同时显示效果更优。
常用的OLED屏幕有蓝色、黄色、白色等几种。屏的大小为0.96寸,像素点为
128*64,所以我们称为0.96oled屏或者12864屏。
OLED模块显存
OLED本身是没有显存的,它的显存是依赖于SSD1306提供的
SSD1306的显存总共为12864bit大小,SSD1306将这些显存分为了8页。每页包含了128个字节,总共8页,这样刚好是12864的点阵大小。
SSD1306芯片
SSD1306是一个单片CMOS、OLED/PLED驱动芯片可以驱动有机/聚合发光二极管点阵图形显示系统。由128 segments 和64 Commons组成。该芯片专为共阴极OLED面板设计。
SSD1306中嵌入了对比度控制器、显示RAM和晶振,并因此减少了外部器件和功耗。有256级亮度控制。数据/命令的发送有三种接口可选择:6800/8000串口,I2C接口或SPI接口。适用于多数简介的应用,注入移动电话的屏显,MP3播放器和计算器等。
SSD1306芯片特性
分辨率:128 * 64 点阵面板;
电源:
VDD = 1.65V to 3.3V,用于IC逻辑;
VCC = 7V to 15V,用于面板驱动;
点阵显示:
OLED驱动输出电压,最大15V;
Segment最大电流:100uA;
常见最大反向电流:15mA;
256级对比亮度电流控制;
嵌入式128 * 64位SRAM显示缓存;
引脚选择MCU接口:
8位6800/8000串口
3/4线SPI接口
I2C接口
SSD1306芯片命令
命令0X81:设置对比度。包含两个字节,第一个0X81为命令,随后发送的一个字节为要设置的对比度的值。这个值设置得越大屏幕就越亮。
命令0XAE/0XAF:0XAE为关闭显示命令;0XAF为开启显示命令。
命令0X8D:包含2个字节,第一个为命令字,第二个为设置值,第二个字节的BIT2表示电荷泵的开关状态,该位为1,则开启电荷泵,为0则关闭。在模块初始化的时候,这个必须要开启,否则是看不到屏幕显示的。
命令0XB0~B7:用于设置页地址,其低三位的值对应着GRAM的页地址。
命令0X00~0X0F:用于设置显示时的起始列地址低四位。
命令0X10~0X1F:用于设置显示时的起始列地址高四位。
3、OLED显示屏显示数据
①下载程序
程序下载链接:
0.96寸SPI_OLED模块配套资料包
②打开资料包,选择与自己平台相同的实例,打开Demo的工程,使用keil编译
③将程序烧录到开发板
④连接显示屏和开发板
修改程序
添加自己的字模文件
修改显示函数
修改主函数并添加滚动代码,放在while外
//从左到右滑动( OLED 屏的滚屏命令)OLED_WR_Byte(0x2E,OLED_CMD); //关闭滚动OLED_WR_Byte(0x27,OLED_CMD); //水平向左或者右滚动 26/27OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节OLED_WR_Byte(0x00,OLED_CMD); //起始页 0OLED_WR_Byte(0x07,OLED_CMD); //滚动时间间隔OLED_WR_Byte(0x07,OLED_CMD); //终止页 7OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节OLED_WR_Byte(0xFF,OLED_CMD); //虚拟字节TEST_MainPage(); //显示内容OLED_WR_Byte(0x2F,OLED_CMD); //开启滚动
编译烧录,效果展示
显示温度湿度
在指定位置重新修改显示函数
GUI_ShowCHinese(20,32,16,"温度:",1);GUI_ShowString(60,32,strTemp1,16,1);GUI_ShowString(68,32,strTemp2,16,1);GUI_ShowString(84,32,strTemp3,16,1);GUI_ShowCHinese(92,32,16,"℃",1);GUI_ShowCHinese(20,48,16,"湿度:",1);GUI_ShowString(60,48,strHumi1,16,1);GUI_ShowString(68,48,strHumi2,16,1);GUI_ShowString(76,48,".",16,1);GUI_ShowString(84,48,strHumi3,16,1);GUI_ShowCHinese(92,48,16,"%",1);
重新修改主函数,把之前的注释掉
int main(void)
{ delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级OLED_Init(); //初始化OLEDIIC_Init(); //初始化IICOLED_Clear(0); //清屏(全黑)while(1) {read_AHT20_once(); //读取温度并显示 delay_ms(1500);}
编译烧录,效果展示
4、总结
本次实验主要对SPI协议进行了粗略的理解和对OLED屏幕的简单理解和使用,还不够深入,还有进一步的研究空间。
5、参考文献
https://blog.csdn.net/qq_43279579/article/details/111414037
https://blog.csdn.net/qq_45237293/article/details/111712565