基于SPI协议下的OLED显示
文章目录
- 一、SPI简介
- 二、OLED显示
- 1、任务要求
- 2、实验器材
- 3、实验过程
- (1)显示自己的学号和姓名
- (2) 显示AHT20的温度和湿度
- (3)上下或左右的滑动显示长字符(SSD1306驱动)
- 三、总结
- 四、参考资料
一、SPI简介
SPI 是英语 Serial Peripheral interface 的缩写,顾名思义就是串行外围设备接口。是 Motorola 首先在其 MC68HCXX 系列处理器上定义的。SPI 接口主要应用在 EEPROM,FLASH,实时时钟,AD 转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工, 同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为 PCB 的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。
- 看 SPI 的内部简明图(图 24.1.1)
SPI接口一般使用4条线通信: - MISO 主设备数据输入,从设备数据输出。
- MOSI 主设备数据输出,从设备数据输入。
- SCLK 时钟信号,由主设备产生。
- CS 从设备片选信号,由主设备控制。
SPI 总线有四种工作方式 ,SPI 模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响,不同时钟相位下的总线数据传输时序如图所示:
二、OLED显示
1、任务要求
- 显示自己的学号和姓名;
- 显示AHT20的温度和湿度;
- 上下或左右的滑动显示长字符;
2、实验器材
① STM32最小核心板(STM32F103C8T6)
②0.96寸7针基于SPI的OLED屏幕(SSD1306驱动)
③奥松AHT21B温湿度传感器
④USB转TTL(ch340芯片)
⑤ IDE:keil5
3、实验过程
(1)显示自己的学号和姓名
- 首先我们下载店铺所给的OLED显示例程,下载地址:http://www.lcdwiki.com/zh/0.96inch_SPI_OLED_Module
- 打开硬件4线SPI的工程文件,按照图中的提示将OLED与与stm32相连
- 然后我们将例程烧录进单片机就能看到OLED屏幕正常显示
- 接下来修改成我们所想要显示的文字,要想显示特定的汉字字,我们首先需要进行汉字取模
1、打开下载的资料包里的汉字取模软件PCtoLCD2002,模式选为字符模式,进行相关设置
- 然后在主界面输入想要显示的文字,点击生成字模(注意不能有空格)
- 接下来打开例程,进入到oledfont.h文件,找到16×16的字模库,将生成的字模粘贴进去,并改成图中格式
- 然后我们直接修改例程里显示汉字的函数TEST_Chinese
void TEST_Chinese(void)
{ u8 i;for(i=0;i<5;i++){GUI_ShowString(35,5,"631807030212",8,1);GUI_ShowCHinese(20,15,16,"通信二班",1); GUI_ShowCHinese(32,41,16,"XXX(改成自己的名字)",1); delay_ms(500);}OLED_Clear(0);
}
代码解析:
GUI_ShowCHinese(X坐标,Y坐标,字体大小,显示内容,显示样式)
GUI_ShowString(X坐标,Y坐标,显示内容,字体大小,显示样式) OLED_Clear(0):清屏
PS:由于例程里已经有了ASCII字符集,我们不需要再次对字母或数字进行取模,直接用即可。
这里我加了一个循环延时,主要是为了让这些信息显示得更久一些。
- 在main函数里调用TEST_Chinese即可显示
(2) 显示AHT20的温度和湿度
- AHT20的使用博客:https://blog.csdn.net/qq_42762607/article/details/111186398
AHT20的温湿度的读取工程:https://github.com/Thee24LYJ/STM32_AHT20
我们主要用到里面的I2C函数与温湿度读取函数 - 将这两个文件添加到例程工程中(文件名可能不一样,但效果一样)
- 直接修改例程里显示菜单的函数TEST_Menu2,这里我将其改名成了AHT20
void AHT20(void)
{u32 CT_data[2];volatile int c1=0,t1=0; srand(123456);delay_ms(40);AHT20_Read_CTdata(CT_data); //不经过CRC校验,直接读取AHT20的温度和湿度数据 推荐每隔大于1S读一次c1 = CT_data[0]*100*10/1024/1024; //湿度t1 = CT_data[1]*200*10/1024/1024-500; //温度GUI_DrawLine(0, 10, WIDTH-1, 10,1);GUI_DrawLine(WIDTH/2-1,11,WIDTH/2-1,HEIGHT-1,1);GUI_DrawLine(WIDTH/2-1,10+(HEIGHT-10)/2-1,WIDTH-1,10+(HEIGHT-10)/2-1,1);GUI_ShowString(0,1,"2020-12-26",8,1);GUI_ShowString(70,1,"Staurday",8,1);GUI_ShowString(14,HEIGHT-1-10,"Cloudy",8,1);GUI_ShowString(WIDTH/2+1,13,"TEMP",8,1);GUI_DrawCircle(WIDTH-20, 25, 1,2);GUI_ShowString(WIDTH-15,20,"C",16,1);GUI_ShowNum(WIDTH/2+8,20,t1/10,2,16,1);GUI_ShowString(WIDTH-41,26,".",8,1);GUI_ShowNum(WIDTH-35,20,t1%10,1,16,1);GUI_ShowString(WIDTH/2+1,39,"HUM",8,1);GUI_ShowNum(WIDTH/2+8,46,c1/10,2,16,1);GUI_ShowString(WIDTH-41,52,".",8,1);GUI_ShowNum(WIDTH-35,46,c1%10,1,16,1);GUI_ShowString(WIDTH-21,46,"%",16,1);GUI_DrawBMP(6,16,51,32, BMP5, 1);delay_ms(1000);
}
代码解析:
GUI_DrawLine(起点X坐标,起点Y坐标,终点X坐标,终点Y坐标,显示颜色),作用是画一条直线
GUI_DrawCircle(圆心X坐标,圆心Y坐标,颜色,半径),作用是画一个圆
GUI_ShowNum(X坐标,Y坐标,要显示的数字,长度,大小,显示模式) ,作用是显示数字(变量)
- 在main函数里调用TEST_Menu2即可显示AHT20读取的温湿度
(3)上下或左右的滑动显示长字符(SSD1306驱动)
- 在test.c里新建一个函数Movestring(),在test.h里声明该函数
void Movestring(void)
{OLED_WR_Byte(0x2e,OLED_CMD);//关滚动OLED_WR_Byte(0x2A,OLED_CMD);//29向右,2a向左OLED_WR_Byte(0x00,OLED_CMD);//A:空字节OLED_WR_Byte(0x00,OLED_CMD);//B:水平起始页OLED_WR_Byte(0x00,OLED_CMD);//C:水平滚动速度OLED_WR_Byte(0x00,OLED_CMD);//D:水平结束页OLED_WR_Byte(0x01,OLED_CMD);//E:每次垂直滚动位移OLED_WR_Byte(0x2f,OLED_CMD);//开滚动
}
- 在main函数里调用该函数
注意:该函数不能放在While循环里,在开始滚动前先显示要滚动的内容
- main.c
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "test.h"
#include "AHT20tem.h"int main(void)
{ u8 i;delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);AHT20tem_init(); OLED_Init(); //初始化OLED OLED_Clear(0); //清屏(全黑) GUI_ShowCHinese(10,20,16,"欢迎来到",1);GUI_ShowString(74,20,"XX",16,1); GUI_ShowCHinese(90,20,16,"大学",1); Movestring(); //开启滚动for(i=0;i<18;i++){delay_ms(500);}OLED_WR_Byte(0x2e,OLED_CMD); //关闭滚动OLED_Clear(0); while(1) { TEST_Chinese(); //学号、姓名班级显示OLED_Clear(0); for(i=0;i<8;i++){AHT20(); //AHT20温湿度显示delay_ms(500);}OLED_Clear(0); }
}
三、总结
虽然是基于SPI协议的OLED显示,但实际上SPI的初始化以及相关函数的调用别人已经写好了,我们在修改函数的过程中并没有直接触及到SPI相关函数,这其实是违背了做这个实验的初衷。对于SPI的代码解析在下载的资源里有,想要真正的了解SPI通信协议,还是需要花费时间去看一下。
四、参考资料
1、0.96寸OLED屏驱动ssd1306 一些不常用的命令用法和效果
2、STM32F103最小系统板开发指南-库函数版本_V1.1
3、0.96寸SPI_OLED模块配套资料包
基于SPI协议下的OLED显示相关推荐
- SPI接口下的OLED显示
SPI接口下的OLED显示 一.SPI简介: 1.spi: 2.IIC与SPI的区别: 二.程序实现 1.下载文件 2.查看文件以及文件解析 3.显示自己想要的字符 3.1 看看别人如何实现的 3.2 ...
- 基于 SPI 协议的0.96 寸OLED显示
目录 一. SPI 协议 1.简介 2.SPI的连接方式 3.通信过程 二.OLED 1.OLED原理 2.点阵编码原理与显示 三.OLED显示实验 Demo 程序 1.要求 2. OLED 显示汉 ...
- 基于STM32和ATH20实现OLED显示温湿度
基于STM32和ATH20实现OLED显示温湿度 什么是OLED 一.主要代码 二. 硬件连接及结果 1.硬件连接 2.烧录显示 总结 参考文献 什么是OLED 有机电致发光器件(OLED)属于低电压 ...
- 基于SPI协议的Flash全擦除
基于SPI协议的Flash全擦除 `timescale 1ns / 1ps module flash_be_ctrl(input wire sys_clk,//系统时钟频率50MHZ input wi ...
- swing jtable显示html,Java Swing:基于鼠标指针下的文本显示JTable中的工具提示
我有一个JTable,其中显示一些使用html格式化的字符串数据.我需要显示鼠标指针Java Swing:基于鼠标指针下的文本显示JTable中的工具提示 在鼠标移到"线路1"和& ...
- 基于SPI协议OLED屏显实例
目录 一.SPI协议 1.1 SPI简介 1.2 SPI四线 1.3 SPI四种工作模式 1.4 SPI时序图 二.项目实现 2.1 实验准备 2.2 字模提取 2.3 程序代码 2.4 硬件连接 2 ...
- 基于STM32移植U8g2图形库——OLED显示(HAL库)
前言:本文主要内容为将优秀的图形库U8g2移植到STM32单片机上,用于OLED显示精美UI.其实,目前GitHub上有需要优秀的开源GUI库,但是大部分的GUI解决方案并不适合0.96 OLED(1 ...
- 基于stm32硬件IIC的oled显示
一 stm32硬件IIC 硬件IIC特性架构 ①通讯引脚 查看对应开发板芯片的原理图可以查看对应IIC外设引脚的位置 这里代码采用的是stm32f103c8t6,硬件IIC的外设引脚为PB6 PB7, ...
- 【嵌入式08.1 - 实验】基于STM32F103C8T6开发板和OLED显示学号姓名+滑频显示
目录 一.题目要求 二.OLED简介 (一)通信方式 (二)接线方式 (三)应用简介 三.OLED显示姓名学号 (一)环境准备 (二)配套资料包下载 (三)取字模 (四)代码撰写 (五)编译烧录 (六 ...
最新文章
- 强势推荐一位 Python 原创自动化大佬!
- AC日记——字符串最大跨距 openjudge 1.7 26
- Debian普通用户添加sudo权限
- 笔记-项目配置管理-配置项
- vue中将md转成html,Vue/Vue中Html和Markdown互相转换/README.md · 倚栏听风/LearningNotes - Gitee.com...
- 深度学习(六)——CNN进化史
- Spring声明式事物DataSourceTransactionManager的使用与jdbcTemplate的使用
- k8s prometheus/grafana 监控系统建设
- 有哪些好用的在线条形码生成器?
- http://cerc.tcs.uj.edu.pl/links/
- ArcGis软件出图时修改色带上的刻度并导出色带
- [手机分享]黑莓手机7系列分享之——黑莓7290
- beego golang bootstrap-table做月度考勤(打卡、签到)统计表
- 关于“为什么delete以后指针还能被赋值”一种描述
- 【详细教程·本人亲测】解决win10家庭版系统C:\Users用户名中有中文,更改为英文的问题
- 算法时间复杂度分析——大O、大Ω、大θ、小o,小ω
- 如何使投资收益最大化?
- MySQL主从——GTID主从
- STARK/SNARK加速小技巧
- 文本识别 OCR 浅析:特征篇