SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在 ADC、LCD 等设备与 MCU 间,要求通讯速率较高的场合。
物理层通讯设备连接方式
2、SPI协议层
与 I2C 的类似,SPI 协议定义了通讯的起始和停止信号、数据有效性、时钟同步等环节。
OLED(OrganicLight-Emitting Diode),又称为有机电激光显示、有机发光半导体(OrganicElectroluminesence Display,OLED)。OLED属于一种电流型的有机发光器件,是通过载流子的注入和复合而致发光的现象,发光强度与注入的电流成正比。OLED在电场的作用下,阳极产生的空穴和阴极产生的电子就会发生移动,分别向空穴传输层和电子传输层注入,迁移到发光层。当二者在发光层相遇时,产生能量激子,从而激发发光分子最终产生可见光。
OLED接线说明
对于0.96寸OLED显示屏的介绍可参考以下连接:
http://www.lcdwiki.com/zh/0.96inch_SPI_OLED_Module这是0.96寸OLED显示屏最为详细的介绍,其中包括产品介绍、接口介绍、厂家的样本程序模块及各种参考资料。
1、汉字点阵原理
可以参考我在上一篇汉字点阵练习博客中详细的说明了汉字点阵的原理。
2、点阵字库取模
①字库生成工具
可以在上述OLED显示屏的官网中下载。
也可以在字库官网中下载,官网连接:
http://www.ddooo.com/softdown/86895.htm
②汉字取模演示
点解设置修改取模参数
修改为如图所示。
配置号字模选项后,输入想要取模的汉字,再点击生成字模即可。
本次实验采用的都是7针的OLED显屏
先介绍一下OLED主要使用的函数
//OLED控制用函数
void OLED_WR_Byte(unsigned dat,unsigned cmd);
void OLED_Display_On(void);
void OLED_Display_Off(void);
void OLED_Set_Pos(unsigned char x, unsigned char y);
void OLED_Reset(void);
void OLED_Init_GPIO(void);
void OLED_Init(void);
void OLED_Set_Pixel(unsigned char x, unsigned char y,unsigned char color);
void OLED_Display(void);
void OLED_Clear(unsigned dat);
OLED显示屏介绍中有说明各个函数的作用。
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "test.h"
int main(void)
{
delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
OLED_Init(); //初始化OLED
OLED_Clear(0); //清屏(全黑)
while(1)
{
TEST_MainPage(); //主界面显示测试
}
}
主界面函数void TEST_MainPage(void)
void TEST_MainPage(void)
{
GUI_ShowCHinese(28,20,16,"通信工程啊桐",1);
GUI_ShowString(4,48,"631907030627",16,1);
delay_ms(1500);
delay_ms(1500);
}
GUI_ShowCHinese(28,20,16,"通信工程啊桐",1)
;含义:
28:表示字符在LCD显示的横轴x的起始坐标
20:表示字符在LCD显示的纵轴y的起始坐标
16:表示显示字符串字体的大小,可设置为12/16/24
通信工程啊桐:显示的汉字
1:显示样式(1:白字黑底;0:黑字白底)
GUI_ShowString(4,48,"631907030627",16,1);
参数含义:
4:表示字符在LCD显示的横轴x的起始坐标
48:表示字符在LCD显示的纵轴y的起始坐标
参数三:字符串(ASCLL码中的)
16:bit (表示字符显示格式,这里我用的 16 ,和汉字一样高)
1:显示样式(1:白字黑底;0:黑字白底)
将生成的点阵数据复制到gui.c
文件中的oledfont.h
的16*16格式的函数中:
3、结果显示
1、OLED显示接线、烧录.hex文件
2、结果显示
1、代码编写
主函数main.c
#include "delay.h"
#include "usart.h"
#include "bsp_i2c.h"
#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "test.h"
int main(void)
{
delay_init(); //延时函数初始化
uart_init(115200);
IIC_Init();
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
OLED_Init(); //初始化OLED
OLED_Clear(0);
while(1)
{
//printf("温度湿度显示");
read_AHT20_once();
OLED_Clear(0);
delay_ms(500);
}
}
温湿度读取控制函数read_AHT20_once(void);
void read_AHT20_once(void)
{
delay_ms(10);
reset_AHT20();
delay_ms(10);
init_AHT20();
delay_ms(10);
startMeasure_AHT20();
delay_ms(80);
read_AHT20();
delay_ms(5);
}
可以直接在之前的串口显示的工程中加入OLED显示的代码文件
也可重新创建一个工程
在oledfont.h
文件中添加温湿度显示字模数据
"温",0x00,0x00,0x23,0xF8,0x12,0x08,0x12,0x08,0x83,0xF8,0x42,0x08,0x42,0x08,0x13,0xF8,
0x10,0x00,0x27,0xFC,0xE4,0xA4,0x24,0xA4,0x24,0xA4,0x24,0xA4,0x2F,0xFE,0x00,0x00,/*"温",0*/
"度",0x01,0x00,0x00,0x80,0x3F,0xFE,0x22,0x20,0x22,0x20,0x3F,0xFC,0x22,0x20,0x22,0x20,
0x23,0xE0,0x20,0x00,0x2F,0xF0,0x24,0x10,0x42,0x20,0x41,0xC0,0x86,0x30,0x38,0x0E,/*"度",0*/
"湿",0x00,0x00,0x27,0xF8,0x14,0x08,0x14,0x08,0x87,0xF8,0x44,0x08,0x44,0x08,0x17,0xF8,
0x11,0x20,0x21,0x20,0xE9,0x24,0x25,0x28,0x23,0x30,0x21,0x20,0x2F,0xFE,0x00,0x00,/*"湿",0*/
"显",0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,
0x04,0x40,0x44,0x44,0x24,0x44,0x14,0x48,0x14,0x50,0x04,0x40,0xFF,0xFE,0x00,0x00,/*"显",0*/
"示",0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x01,0x00,
0x01,0x00,0x11,0x10,0x11,0x08,0x21,0x04,0x41,0x02,0x81,0x02,0x05,0x00,0x02,0x00,/*"示",
2、结果显示
①、OLED及STM32硬件连线、烧录
②、结果显示
1、代码编写
主函数main.c
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "test.h"
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)
{
}
}
主函数中包括了OLED的滚动函数,其中27为向左滚动,26为向右滚动。
显示函数void TEST_MainPage(void)
void TEST_MainPage(void)
{
GUI_ShowCHinese(16,28,16,"谢谢观看",1);
delay_ms(1000);
delay_ms(1000);
}
在oledfont.h
文件中添加谢谢观看显示字模数据
2、结果显示
①、OLED及STM32硬件连线、烧录
②、结果显示
本次实验主要为完成基于STM32及ISP协议的OLED显屏。本次实验学习了一遍ISP协议,和之前的I2C协议对比发现SPI的速度要比I2C的传输速度更快,更适合用作高速传输通信。还学习了OLED显屏,它的学习资料比较全,但也有很多不太了解的地方,虽然此次实验的代码是借鉴的学长学姐的,但也认真分析了代码,OLED的代码在介绍中有可直接下载使用。在实验过程中我也遇到了一些问题有很多代码都看不懂需要在网上搜索。总而言之,学习是个漫长的过程,还得加油。如有错误,请指正。
【1】零死角玩转STM32
【2】0.96存OLED显示屏介绍
【3】https://blog.csdn.net/qq_45237293/article/details/111712565
【4】OLED显屏滚动显示