简介
- SPI
SPI是串行外设接口(Serial Peripheral Interface)的缩写。是 Motorola 公司推出的一种同步串行接口技术,是一种高速的,全双工,同步的通信总线。
SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。
(1)SDO/MOSI – 主设备数据输出,从设备数据输入;
(2)SDI/MISO – 主设备数据输入,从设备数据输出;
(3)SCLK – 时钟信号,由主设备产生;
(4)CS/SS – 从设备使能信号,由主设备控制。当有多个从设备的时候,因为每个从设备上都有一个片选引脚接入到主设备机中,当我们的主设备和某个从设备通信时将需
要将从设备对应的片选引脚电平拉低或者是拉高。 - OLED
OLED也被称之为第三代显示技术,其显示原理与LCD有着本质上的区别,主要是通过电场驱动,有机半导体材料和发光材料通过过载流子注入和复合后实现发光。
OLED屏显例子
一、准备工作
- 汉字点阵
在嵌入式设备OLED上显示的汉字大多数都属于点阵汉字。
本次使用的是16 点阵的字库,每个字型的点阵数据为 16×16(横行点数×纵列点数),共 256 个二进制位,32 个字节。汉字 16 点阵字型数据的 32 个字节排列次序是以 0 字节开始到 31 字节结束,均用十六进制表示 。
例如:陈
对应的数据为:
0x00,0x40,0x78,0x40,0x4B,0xFC,0x50,0x40,
0x53,0xFC,0x62,0x44,0x53,0xFC,0x4A,0x44,
0x4B,0xFC,0x48,0x40,0x69,0x50,0x52,0x48,
0x44,0x46,0x48,0x44,0x40,0x40,0x40,0x40
两个对应一行,其中黑点为1,空白为0,二进制转换为16进制。
- OLED
在厂家提供的链接中下载 0.96寸SPI 7针中文wiki 的工程文件。点击下载0.96寸OLED显示屏模块0.91
OLED 屏幕与野火开发板的连接
二、显示学号和姓名
- 显示名字
- 根据自己的开发板型号,打开对应的工程
- 在工程中增添点阵
根据需要显示的字添加
修改test.c中的显示函数
void TEST_MainPage(void)
{
GUI_ShowString(45,0,"631807060403",8,1);
GUI_ShowCHinese(16,20,16,"陈高玉",1);
delay_ms(1500);
delay_ms(1500);
}
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); //清屏(全黑)
while(1)
{
TEST_MainPage(); //主界面显示测试
}
}
- 结果显示
编译成功后调试keil,使用st-link烧录。将OLED 屏幕与开发板相连即可看见结果(忽略室友小手)
三、滑动显示
直接控制硬件刷新实现,源码基于上一个例子
- 滑动方式
0x2F:激活滚动
0x27:水平向左滚动
0x29:水平和垂直滚动右方向
0xA3:垂直滚动
- 添加代码
在test.c中定义滚动函数
void TEST_roll(void)
{
OLED_WR_Byte(0x2F,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(0x2E,OLED_CMD);
while(1);
}
main.c中添加滚动函数
while(1)
{
TEST_MainPage(); //主界面显示测试
TEST_roll(); //滚动
}
- 运行结果
(不太清晰…)
四、显示温湿度
-
向USER里添加之前温湿度博客中工程里的几个文件bsp_i2c.h,bsp_i2c.c,usart.h,usart.c(点击此工程获取)
-
向HARDWARE中添加已存在的stm32f10x_usart.c文件,位于工程里的 /STM32F10x_FWLib/src中
- 修改main.c函数
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "test.h"
#include "usart.h"
#include "bsp_i2c.h"
int main(void)
{
int *H,*T;
int a,b,c,d;
int H1=0;
int T1=0;
H=&H1;
T=&T1;
delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
OLED_Init(); //初始化OLED
OLED_Clear(0);
IIC_Init();
//清屏(全黑)
while(1)
{
read_AHT20_once(T,H);
GUI_ShowCHinese(16,00,16,"温湿度显示 ",1);
GUI_ShowCHinese(16,10,16,"温度 ",1);
a=*T/10;
b=*T%10;
GUI_ShowNum(60,10,a,2,16,1);
GUI_ShowString(80,10,".",16,1);
GUI_ShowNum(82,10,b,2,16,1);
GUI_ShowCHinese(16,30,16,"湿度 ",1);
c=*H/10;
d=*H%10;
GUI_ShowNum(60,30,c,2,16,1);
GUI_ShowString(80,30,".",16,1);
GUI_ShowNum(82,30,d,2,16,1);
}
}
- 运行结果
总结+参考
学习汉字点阵然后显示到OLED 屏幕上,感觉是很棒的。在把字形转换为计算机的语言二进制时花了不少时间,然后才发现有个程序可以直接转换。OLED 屏幕感觉前途无量啊,需要继续学习。