基于 SPI 协议在 0.96 寸 OLED上【平滑显示汉字】及【温湿度数据采集显示】

目录

  • 一、SPI 协议简介
  • 二、实验过程
  • 三、修改代码(显示自己的汉字)
  • 四、总结
  • 五、参考资料

本文内容:stm32 基于 SPI 协议连接外设 7 针的 0.96 寸 OLED 显示屏显示一些文字或者图画
说明:虽然我是以 stm32 为例,但是文章中的代码有 Arduino、C51、MSP430、RaspberryPI、STM32 这五种例子,可以到文章中下载。
基于 SPI 协议在 0.96 寸 OLED上【平滑显示汉字】及【温湿度数据采集显示】_第1张图片

一、SPI 协议简介

  • SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在 ADC、LCD 等设备与 MCU 间,要求通讯速率较高的场合。

SPI 物理层

  • SPI 通讯设备之间的常用连接方式,如下图:
    基于 SPI 协议在 0.96 寸 OLED上【平滑显示汉字】及【温湿度数据采集显示】_第2张图片
  • SPI 通讯使用 3 条总线及片选线,3 条总线分别为 SCK、MOSI、MISO,片选线为 SS 。

SPI 协议层

  • SPI 通讯的通讯时序,如下图所示:
    基于 SPI 协议在 0.96 寸 OLED上【平滑显示汉字】及【温湿度数据采集显示】_第3张图片
  • 这是一个主机的通讯时序。NSS、SCK、MOSI 信号都由主机控制产生,而 MISO 的信号由从机产生,主机通过该信号线读取从机的数据。MOSI 与 MISO 的信号只在 NSS 为低电平的时候才有效,在 SCK 的每个时钟周期 MOSI 和 MISO 传输一位数据。

更多 SPI 协议讲解请参考 B 站野火视频:https://www.bilibili.com/video/BV1ps411M7Dr?p=33

二、实验过程

1)实验前的准备

硬件——

  • 野火 stm32 指南者开发板
  • ST-LINK V2 STM8/STM32仿真器编程器
  • 0.96寸OLED显示屏模块0.91 1.3寸液晶屏供原理图12864屏 IIC/SPI

软件——

  • Keil5 MDK
  • 野火串口调试助手——提取码:yf99
  • 这里说明一下,如果你的电脑上没有安装 USB 转串口的驱动,需要安装一下,步骤如下:
    1. 提取安装包的链接:https://pan.baidu.com/s/1gLE0pYw_YvismeQz7jCKOw
      提取码:4tj5
    2. 点击 “ 安装 ” ,安装完后弹窗。
      基于 SPI 协议在 0.96 寸 OLED上【平滑显示汉字】及【温湿度数据采集显示】_第4张图片

2)硬件连接

  • 根据注释连接管脚。
    基于 SPI 协议在 0.96 寸 OLED上【平滑显示汉字】及【温湿度数据采集显示】_第5张图片
    基于 SPI 协议在 0.96 寸 OLED上【平滑显示汉字】及【温湿度数据采集显示】_第6张图片
  • OLED 接入完毕,下面接串口。
  • 使用 USB 线连上 USB 转串口,使用杜邦线连接 SWD ,SWD 怎么连呢?继续往下看。
    基于 SPI 协议在 0.96 寸 OLED上【平滑显示汉字】及【温湿度数据采集显示】_第7张图片
  • 看板子的背面,这里我们只需要用杜邦线依次连接 SWCLK、GND、SWDIO、3V3 就行了。

说明:
NRST:异步复位脚,重置除了 RTC 的寄存器以及后备存储器的寄存器;
SWCLK:时钟开关;
GND:接地;
SWDIO:输入/输出控制。
3V3:电源。

基于 SPI 协议在 0.96 寸 OLED上【平滑显示汉字】及【温湿度数据采集显示】_第8张图片

  • 杜邦线的另一端接 ST_LINK ,根据正面提示的引脚来进行接入,如下图:
    基于 SPI 协议在 0.96 寸 OLED上【平滑显示汉字】及【温湿度数据采集显示】_第9张图片
    基于 SPI 协议在 0.96 寸 OLED上【平滑显示汉字】及【温湿度数据采集显示】_第10张图片
  • 然后将两个 USB 接口插到电脑上,并打开开关(这样,板子就连通了电脑),之后可以进行程序的烧录。

3)程序烧录

①下载源码

  • 这里使用到的程序是运行厂家给出的 Demo 程序,请下载:
    链接:https://pan.baidu.com/s/1HS33ftk3Pb7nWJRhBTLqUw
    提取码:57x8
  • 解压缩后,在 1-Demo 下选择相应的项目,这里我选择的是 Demo_STM32 下的 0.96inch_OLED_Demo_STM32F103ZET6_Hardware_4-wire_SPI ,stm32 指南者是 STM32F103VE ,但是没有 VE ,只有 ZE(stm32 霸道的就是 ZE,指南者跟霸道的差不多,所以就选 ZE 就行了)。
  • 双击打开 PROJECT 下的工程 OLED.uvprojx 即可。

②Keil 设置

  • 由于 Demo 程序是用 J-Link 烧录的,而我是用 ST-Link 烧录,所以需要设置下,其它的烧录方式自行设置。
  • 设置烧录方式。
    基于 SPI 协议在 0.96 寸 OLED上【平滑显示汉字】及【温湿度数据采集显示】_第11张图片
  • 然后点击 ST-Link 右边的 Settings 设置,将端口设为 SW 。
    基于 SPI 协议在 0.96 寸 OLED上【平滑显示汉字】及【温湿度数据采集显示】_第12张图片
  • 按照下图流程操作。
    基于 SPI 协议在 0.96 寸 OLED上【平滑显示汉字】及【温湿度数据采集显示】_第13张图片

③程序编译、烧录结果

  • 这是运行厂家的 Demo 例子,显示效果图如下:
    基于 SPI 协议在 0.96 寸 OLED上【平滑显示汉字】及【温湿度数据采集显示】_第14张图片
  • 下面我们需要对代码进行更改,显示出自己想要的样子。

三、修改代码(显示自己的汉字)

  • 下面简单描述下修改代码的过程,最后面有修改完成后的工程提取链接。

1)移植 AHT20 温湿度采集的代码

  • AHT20 温湿度采集的博客请参考:基于 I2C 协议使用 AHT20 温湿度传感器采集数据
  • 然后我们从这篇博客中移植部分代码(以下四个文件)。
    • bsp_i2c.h
    • bsp_i2c.c
    • sys.h(移植后更改了名称为 AHT20_sys.h,不然会重名)
    • sys.c(移植后更改了名称为 AHT20_sys.c,不然会重名)
  • 然后将 bsp_i2c.c 中串口输出改为了输出到 OLED 显示,自己写了个函数(我添加了头文件 gui.h ,不然无法调用显示函数)。
    基于 SPI 协议在 0.96 寸 OLED上【平滑显示汉字】及【温湿度数据采集显示】_第15张图片
  • 移植的过程中,我遇到了不少的问题,根据提示来更改代码或者注释掉一些函数就行了,一步一步更改。
  • 将 AHT20 温度模块连接到 STM32 上,如何连接?根据那篇 AHT20 的博客连接即可,AHT20 基于 I2C 协议,OLED 基于 SPI 协议,都连在同一个 STM32 上互不干扰。

2)获取汉字字模

  • 要想在 OLED 上显示英文、数字,可以直接输出显示,但要是想显示中文,就必须要对中文进行编码成点阵。
  • 字模软件下载链接:https://pan.baidu.com/s/1GRe2X3p2ETJJEFwXsnV1sw
    提取码:fn8i
  • 打开应用程序后,输入自己想要的汉字,即可。
    基于 SPI 协议在 0.96 寸 OLED上【平滑显示汉字】及【温湿度数据采集显示】_第16张图片
  • 这里说明一下,为什么我的文字是这样的?这里需要将正向的文字左旋 90 °,然后再山下翻转,这样,OLED 上显示的文字才是正向的,至于为什么,可能和数据传输有关。
  • 其它汉字可以再继续生成字模即可(注意翻转下)。

3)代码编辑

  • gui.c 下有个 oledfont.h 头文件,打开后,将 cfont16[] 数组内的内容修改成自己的中文文字点阵即可。
    基于 SPI 协议在 0.96 寸 OLED上【平滑显示汉字】及【温湿度数据采集显示】_第17张图片
  • 这里我添加的汉字字模有:张、某、人、欢、迎、来、到、重、庆、交、通、大、学、物、联、网、实、训、室、温、度、湿、:、℃、%

说明:为什么不自己新声明一个点阵数组,而是修改呢?
这是因为如果新加一个数组的话,是没有任何用的,因为显示汉字的那个函数,只会从 cfont16 数组中读取数据,新添加一个数组也可以,只不过自己要改的代码就会很多了,还会涉及到计算等等,这个方法是最简便的了。

  • 然后在 test.h 头文件中,声明一个自己新加的函数 void TEST_ShowMyName(void);
    基于 SPI 协议在 0.96 寸 OLED上【平滑显示汉字】及【温湿度数据采集显示】_第18张图片
  • 然后在 test.c 文件最后,实现这个函数。
    基于 SPI 协议在 0.96 寸 OLED上【平滑显示汉字】及【温湿度数据采集显示】_第19张图片

函数说明——

  • GUI_ShowString() 的参数
    参数一:X 坐标
    参数二:Y 坐标
    参数三:字符串(ASCLL码中的)
    参数四:bit (表示字符显示格式,这里我用的 16 ,和汉字一样高)
    参数五:显示样式(1:白字黑底;0:黑字白底)
  • GUI_ShowChinese() 的参数
    参数一:X 坐标
    参数二:Y 坐标
    参数三:汉字点阵大小(这里使用的是 16×16 的,参数应该是 16)
    参数四:要显示的汉字
    参数五:显示样式(1:白字黑底;0:黑字白底)
  • 然后编辑 main.c 文件中的代码。
  • 调用刚刚新添加的函数,然后注释掉 white 循环中的所有函数即可。
    基于 SPI 协议在 0.96 寸 OLED上【平滑显示汉字】及【温湿度数据采集显示】_第20张图片

4)显示结果

  • 将修改后的程序重新编译一下,无错,然后烧录进 stm32 中,显示结果如下:
  • 最终修改完成后的工程文件提取链接:https://pan.baidu.com/s/1fWBFrqD7pWfxJk8GtWdVnA
    提取码:tzrh

四、总结

  • 其实说实话,这个实验从头到尾,对于这个 SPI 协议并没有了解多少,入门小白,出门还是小白,整个文章的过程就是调用函数,修改变量而已,就好比学会了怎么吃饭,却不知道怎么做饭,对于嵌入式开发的同志们,这是极大的弊端,要深入分析,由于我还是大学生,时间不太多,就不花费时间写文章分析代码了,注释都很全,慢慢学,只要头发没掉光,你就还没学到头!
  • 如果想真正了解 SPI 协议如何通讯的,还是要深入分析一下这个代码,并看看相关的 SPI 协议的视频,在第一部分有链接,一起学,淦!

五、参考资料

1、基于STM32的0.96寸OLED显示屏显示数据
2、0.96寸OLED在STM32f103上实现滚动显示长字符

你可能感兴趣的:(嵌入式,stm32,嵌入式,单片机)