文章目录
一、SPI简介
SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。
更多可参考SPI详解
二、0.96inch SPI OLED 介绍
- 图片展示
序号 | 模块引脚 | 引脚说明 |
---|---|---|
1 | GND | 电源地 |
2 | OLED | 电源正(3.3V~5V) |
3 | D0 | SPI和IIC总线时钟信号 |
4 | D1 | OLED SPI和IIC总线数据信号 |
5 | RES | OLED复位信号,低电平复位(选择IIC总线时,该引脚需要接高电平(可以接VCC)) |
6 | DC | OLED命令/数据输入选择信号,高电平:数据,低电平:命令选择(3线制SPI总线时,该引脚不需要使用(可以不接);选择IIC总线时,该引脚需要接电源地) |
7 | CS | OLED片选信号,低电平使能(选择IIC总线时,该引脚需要接电源地) |
三、实验内容及结果
1. 任务要求
-
显示自己的学号和姓名;
-
显示AHT20的温度和湿度;
-
上下或左右的滑动显示长字符,比如“Hello,欢迎来到重庆交通大学物联网205实训室!”或者一段歌词或诗词(最好使用硬件刷屏模式)。
2. 准备工作
- SPI_PLED模块demo程序下载
- 提取链接中文点阵字库及显示工具程序
提取码:0614
3. 演示如下
当下载上面的demo程序后用keil打开,即可在main.c中编写以下代码
- 先显示姓名及学号
显示汉字需要用上面的工具提取相应的字模,使用教程也在其中
添加到oledfont.h中,如下
void TEST_MainPage1()
{
GUI_ShowCHinese(30,0,16,"木子曦",1);//中文姓名
GUI_ShowString(5,15,"631907060517",16,1);//学号
Delay_1ms(1000);
}
int main(void)
{
delay_init(); //延时函数初始化
OLED_Init(); //初始化OLED
OLED_Clear(0); //清屏(全黑)
/***********************************************************************************/
/**///①刚上电,产品芯片内部就绪需要时间,延时100~500ms,建议500ms
/***********************************************************************************/
/***********************************************************************************/
/**///②上电第一次发0x71读取状态字,判断状态字是否为0x18,如果不是0x18,进行寄存器初始化
/***********************************************************************************/
OLED_WR_Byte(0x2E,OLED_CMD); //关闭滚动
OLED_WR_Byte(0x26,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(0x01,OLED_CMD); //终止页 2
OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节
OLED_WR_Byte(0xFF,OLED_CMD); //虚拟字节
while(1)
{
TEST_MainPage1(); //界面显示
OLED_WR_Byte(0x2F,OLED_CMD); //开启滚动
Delay_1ms(2000);
}
}
- 效果
- 将温湿度的数据显示在屏幕上
基于I2C协议的AHT20温湿度数据收集参考我之间写的基于I2C协议的AHT20温湿度传感器的数据采集
main.c代码:
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "test.h"
#include "AHT20-21_DEMO_V1_3.h"
void TEST_MainPage1(int c1,int t1)
{
GUI_ShowCHinese(30,0,16,"木子曦",1);//中文姓名
GUI_ShowString(5,15,"631907060517",16,1);//数字详细
GUI_ShowCHinese(5,30,16,"湿度",1);
GUI_ShowCHinese(5,45,16,"温度",1);
GUI_ShowNum(35,30,c1/10,4,16,1);
GUI_ShowCHinese(80,30,16,"%",1);
GUI_ShowNum(35,45,t1/10,4,16,1);
GUI_ShowCHinese(80,45,16,"℃",1);
Delay_1ms(1000);
}
volatile int c1,t1;
uint32_t CT_data[2]={0,0};
u8 temp[10];
u8 hum[10];
int main(void)
{
delay_init(); //延时函数初始化
OLED_Init(); //初始化OLED
OLED_Clear(0); //清屏(全黑)
/***********************************************************************************/
/**///①刚上电,产品芯片内部就绪需要时间,延时100~500ms,建议500ms
/***********************************************************************************/
AHT20_Init();
Delay_1ms(500);
/***********************************************************************************/
/**///②上电第一次发0x71读取状态字,判断状态字是否为0x18,如果不是0x18,进行寄存器初始化
/***********************************************************************************/
if((AHT20_Read_Status()&0x18)!=0x18)
{
AHT20_Start_Init(); //重新初始化寄存器
Delay_1ms(10);
}
//NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
OLED_WR_Byte(0x2E,OLED_CMD); //关闭滚动
OLED_WR_Byte(0x26,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(0x01,OLED_CMD); //终止页 2
OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节
OLED_WR_Byte(0xFF,OLED_CMD); //虚拟字节
while(1)
{
AHT20_Read_CTdata(CT_data); //不经过CRC校验,直接读取AHT20的温度和湿度数据 推荐每隔大于1S读一次
//AHT20_Read_CTdata_crc(CT_data); //crc校验后,读取AHT20的温度和湿度数据
c1 = CT_data[0]*100*10/1024/1024; //计算得到湿度值c1(放大了10倍)
t1 = CT_data[1]*200*10/1024/1024-500;//计算得到温度值t1(放大了10倍)
TEST_MainPage1(c1,t1); //界面显示
OLED_WR_Byte(0x2F,OLED_CMD); //开启滚动
Delay_1ms(2000);
}
}
四、参考
完整代码github
0.96inch SPI OLED Module