实验要求
理解OLED屏显和汉字点阵编码原理,使用STM32F103的SPI或IIC接口实现以下功能:
-
显示自己的学号和姓名; -
显示AHT20的温度和湿度; -
上下或左右的滑动显示长字符,比如“Hello,欢迎来到重庆交通大学物联网205实训室!”或者一段歌词或诗词(最好使用硬件刷屏模式)。
一、了解SPI(串行外设接口)
SPI(Serial Peripheral Interface)就是串行外围设备接口。 SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚。SPI 是一个环形总线结构,由 ss(cs)、sck、sdi、sdo 构成,时序主要是在 sck 的控制下,两个双向移位寄存器进行数据交换。 上升沿发送、下降沿接收、高位先发送。 上升沿到来的时候,sdo 上的电平将被发送到从设备的寄存器中。 下降沿到来的时候,sdi 上的电平将被接收到主设备的寄存器中。
- SPI的连接方式
SS( Slave Select):从设备选择信号线,常称为片选信号线。 SCK (Serial Clock):时钟信号线,用于通讯数据同步。 MOSI (Master Output, Slave Input):主设备输出/从设备输入引脚。 MISO(Master Input,,Slave Output):主设备输入/从设备输出引脚。 - SPI的通讯过程
MOSI 与 MISO 的信号只在 NSS 为低电平的时候才有效,在 SCK 的每个时钟周期 MOSI 和 MISO 传输一位数据。
二、使用0.96寸OLED显示屏显示数据
-
实验工具与材料 软件:keil 硬件:PC机,STM32开发板(本过程采用的是野火stm32mini开发板),0.96寸OLED显示屏,下载器(本过程采用ST_Link) -
0.96寸OLED显示屏相关介绍 参考下面链接: http://www.lcdwiki.com/zh/``0.96inch_SPI_OLED_Module -
运行厂家给出的Demo程序 ①下载程序 程序下载链接 http://www.lcdwiki.com/res/Program/OLED/0.96inch/SPI_SSD1306_MSP096X_V1.0/0.96inch_SPI_OLED_Module_SSD1306_MSP096X_V1.0.zip
②打开资料包,选择与自己平台相同的实例,打开Demo的工程,使用keil编译 ③将程序烧录到开发板 ④连接显示屏和开发板 ⑤运行结果
三、自行修改程序实现显示
显示要求: 显示姓名 显示一串数字
1.姓名中文的点阵(16*16) 由于程序并不需要显示所有的中文,所以将对应需要的文字添加到程序就可以了。 使用PCtoLCD2002生成要用到的字的字模 记得在选项里更改部分参数 字模软件下载链接
下载链接
实现显示代码
void TEST_MainPage(void)
{
GUI_ShowCHinese(28,20,16,"***",1);
GUI_ShowString(4,48,"***",16,1);
delay_ms(1500);
delay_ms(1500);
}
main函数
int main(void)
{
delay_init();
OLED_Init();
OLED_Clear(0);
while(1)
{
TEST_MainPage();
}
}
烧录显示结果
上下或左右的滑动显示长字符
1.水平左右移
OLED_WR_Byte(0x2E,OLED_CMD);
OLED_WR_Byte(0x26,OLED_CMD);
OLED_WR_Byte(0x00,OLED_CMD);
OLED_WR_Byte(0x00,OLED_CMD);
OLED_WR_Byte(0x07,OLED_CMD);
OLED_WR_Byte(0x07,OLED_CMD);
OLED_WR_Byte(0x00,OLED_CMD);
OLED_WR_Byte(0xFF,OLED_CMD);
OLED_WR_Byte(0x2F,OLED_CMD);
2、对显示文字进行取模 获取相应文字的点阵十六进制表示
"通",0x00,0x00,0x47,0xF8,0x20,0x10,0x21,0xA0,0x00,0x40,0x07,0xFC,0xE4,0x44,0x24,0x44,
0x27,0xFC,0x24,0x44,0x24,0x44,0x27,0xFC,0x24,0x44,0x24,0x54,0x54,0x08,0x8F,0xFE,
"信",0x08,0x40,0x08,0x20,0x0B,0xFE,0x10,0x00,0x10,0x00,0x31,0xFC,0x30,0x00,0x50,0x00,
0x91,0xFC,0x10,0x00,0x10,0x00,0x11,0xFC,0x11,0x04,0x11,0x04,0x11,0xFC,0x11,0x04,
"一",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
"九",0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x7F,0xE0,0x04,0x20,0x04,0x20,0x04,0x20,
0x08,0x20,0x08,0x20,0x08,0x20,0x10,0x22,0x10,0x22,0x20,0x22,0x40,0x1E,0x80,0x00,
"零",0x3F,0xF8,0x01,0x00,0x7F,0xFE,0x41,0x02,0x9D,0x74,0x01,0x00,0x1D,0x70,0x02,0x80,
0x0C,0x60,0x32,0x18,0xC1,0x06,0x1F,0xE0,0x00,0x20,0x06,0x40,0x01,0x80,0x00,0x40,
"二",0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,
mian函数
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "test.h"
int main(void)
{
delay_init();
NVIC_Configuration();
OLED_Init();
OLED_Clear(0);
OLED_WR_Byte(0x2E,OLED_CMD);
OLED_WR_Byte(0x27,OLED_CMD);
OLED_WR_Byte(0x00,OLED_CMD);
OLED_WR_Byte(0x00,OLED_CMD);
OLED_WR_Byte(0x07,OLED_CMD);
OLED_WR_Byte(0x07,OLED_CMD);
OLED_WR_Byte(0x00,OLED_CMD);
OLED_WR_Byte(0xFF,OLED_CMD);
TEST_MainPage();
OLED_WR_Byte(0x2F,OLED_CMD);
}
显示数据函数
void TEST_MainPage(void)
{
GUI_ShowCHinese(28,20,16,"通信一九零二",1);
GUI_ShowString(4,48,"",16,1);
delay_ms(1500);
delay_ms(1500);
}
效果如下
总结
通过使用SPI通信方式进行OLED的显示,接触到了许多新鲜的事物,比如说中文字库点阵、OLED屏幕滑动显示等,同时与I2C通信方式进行OLED显示进行了对比,发现SPI的速度确实要比I2C的传输速度更快,更适合用作高速传输通信。由于我也是初学SPI,如有错误希望大家批评指正。
参考的哈莉特博客 参考博客2
|