文章目录

  • 一、题目要求
  • 二、SPI通信协议相关介绍
    • 1. SPI 协议简介
    • 2.STM32 的 SPI 特性及架构
    • 3.STM32 的 SPI 外设简介
    • 4. STM32 的 SPI 架构剖析
    • 5. 通讯过程
  • 三、OLED显示屏相关介绍
    • 1.简介及特点
    • 2.更多了解
  • 四、显示自己的学号和姓名
    • 1.文字取模
    • 2.代码编写
    • 3.烧录
  • 五、显示AHT20的温度和湿度
    • 1.温湿度显示
    • 2.点阵显示文字
    • 3.打开main.c文件
    • 4.烧录
  • 六、 上下或左右的滑动显示长字符,显示一句诗词
    • 1.OLED屏滚动显示命令
    • 2.对将要显示的汉字进行取模
    • 3.代码编写
    • 4.烧录
  • 七、总结
  • 八、参考链接

一、题目要求

  1. 显示自己的学号和姓名;

  2. 显示AHT20的温度和湿度;

  3. 上下或左右的滑动显示长字符,显示一句诗词(最好使用硬件刷屏模式)。

二、SPI通信协议相关介绍

1. SPI 协议简介

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

2.STM32 的 SPI 特性及架构

STM32 芯片也集成了专门用于 SPI 协议通讯的外设

3.STM32 的 SPI 外设简介

STM32 的 SPI 外设可用作通讯的主机及从机,支持最高的 SCK 时钟频率为 fpclk/2 (STM32F103 型号的芯片默认 fpclk1为 72MHz,fpclk2为 36MHz),完全支持 SPI 协议的 4 种模式,数据帧长度可设置为 8 位或 16 位,可设置数据 MSB 先行或 LSB 先行。它还支持双线全双工、双线单向以及单线模式。其中双线单向模式可以同时使用 MOSI 及 MISO 数据线向一个方向传输数据,可以加快一倍的传输速度。而单线模式则可以减少硬件接线,当然这样速率会受到影响。

4. STM32 的 SPI 架构剖析

5. 通讯过程

STM32 使用 SPI 外设通讯时,在通讯的不同阶段它会对“状态寄存器 SR”的不同数据位写入参数,我们通过读取这些寄存器标志来了解通讯状态。

主模式收发流程及事件说明如下:
(1) 控制 NSS 信号线,产生起始信号(图中没有画出);
(2) 把要发送的数据写入到“数据寄存器 DR”中,该数据会被存储到发送缓冲区;
(3) 通讯开始,SCK 时钟开始运行。MOSI 把发送缓冲区中的数据一位一位地传输出去;MISO 则把数据一位一位地存储进接收缓冲区中;
(4) 当发送完一帧数据的时候,“状态寄存器 SR”中的“TXE 标志位”会被置 1,表示传输完一帧,发送缓冲区已空;类似地,当接收完一帧数据的时候,“RXNE标志位”会被置 1,表示传输完一帧,接收缓冲区非空;
(5) 等待到“TXE标志位”为 1时,若还要继续发送数据,则再次往“数据寄存器 DR”写入数据即可;等待到“RXNE 标志位”为 1 时,通过读取“数据寄存器 DR”可以获取接收缓冲区中的内容。
假如我们使能了 TXE 或 RXNE 中断,TXE 或 RXNE 置 1 时会产生 SPI 中断信号,进入同一个中断服务函数,到 SPI 中断服务程序后,可通过检查寄存器位来了解是哪一个事件,再分别进行处理。也可以使用 DMA 方式来收发“数据寄存器 DR”中的数据。

三、OLED显示屏相关介绍

1.简介及特点

OLED即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display,OELD)。OLED 由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。
我们使用的是 ALINETEK 的 OLED 显示模块,该模块有以下特点:
1)模块有单色和双色两种可选,单色为纯蓝色,而双色则为黄蓝双色。
2)尺寸小,显示尺寸为 0.96 寸,而模块的尺寸仅为 27mmx26mm 大小。
3)高分辨率,该模块的分辨率为128x64。
4)多种接口方式,该模块提供了总共 5 种接口包括:6800、8080 两种并行接口方式、3线或 4 线的穿行 SPI 接口方式、IIC 接口方式(只需要 2 根线就可以控制 OLED 了)。
5)不需要高压,直接接 3.3V 就可以工作了。
注意该模块不和 5.0V 接口兼容,所以在使用的时候一定要小心,勿直接接到 5V 的系统上去,否则可能烧坏模块。

2.更多了解

0.96寸OLED显示屏相关介绍可参考链接:
http://www.lcdwiki.com/zh/0.96inch_SPI_OLED_Module

四、显示自己的学号和姓名

1.文字取模

1.1.下载文字取模软件,打开,按以下步骤设置参数:

1.2.在文字输入区输入想要的汉字:
注意:输入完成后,记得按ctrl+enter键即会出现如下形式:

1.3.取模方式选择C51格式即可:

2.代码编写

2.1.内容显示 :
打开test.c文件,找到TEST_MainPage函数:

void TEST_MainPage(void)
{
//  GUI_ShowString(28,0,"abc",16,1);//英文姓名GUI_ShowCHinese(28,20,16,"刘xx",1);//中文姓名GUI_ShowString(4,48,"777292938",16,1);//学号delay_ms(1500);       delay_ms(1500);
}

2.2.文字存储(举例):
打开文字存储文件oledfont.h,输入刚取的模:

2.3.找到main.c文件中的主函数:
输入以下代码:

int main(void)
{   delay_init();                  //延时函数初始化      OLED_Init();                   //初始化OLED  OLED_Clear(0);             //清屏(全黑)while(1) { TEST_MainPage();         //界面显示}
}

3.烧录

3.1.电路连接:
STM32和传感器的连接参考:
https://blog.csdn.net/qq_52099780/article/details/127693644?spm=1001.2014.3001.5502
OLED与STM32芯片的连接如下:
GND——GND
3v3——3v3
D0——PB13
D1——PB15
RES——PB12
DC——PB10
CS——PB11
3.2.打开mcuisp,开始烧录,烧录结果如下:

五、显示AHT20的温度和湿度

1.温湿度显示

打开bsp_i2c.c文件,找到read_AHT20函数,替换以下代码:

void read_AHT20(void)
{uint8_t   i;for(i=0; i<6; i++){readByte[i]=0;}//-------------I2C_Start();I2C_WriteByte(0x71);ack_status = Receive_ACK();readByte[0]= I2C_ReadByte();Send_ACK();readByte[1]= I2C_ReadByte();Send_ACK();readByte[2]= I2C_ReadByte();Send_ACK();readByte[3]= I2C_ReadByte();Send_ACK();readByte[4]= I2C_ReadByte();Send_ACK();readByte[5]= I2C_ReadByte();SendNot_Ack();//Send_ACK();I2C_Stop();//--------------if( (readByte[0] & 0x68) == 0x08 ){H1 = readByte[1];H1 = (H1<<8) | readByte[2];H1 = (H1<<8) | readByte[3];H1 = H1>>4;H1 = (H1*1000)/1024/1024;T1 = readByte[3];T1 = T1 & 0x0000000F;T1 = (T1<<8) | readByte[4];T1 = (T1<<8) | readByte[5];T1 = (T1*2000)/1024/1024 - 500;AHT20_OutData[0] = (H1>>8) & 0x000000FF;AHT20_OutData[1] = H1 & 0x000000FF;AHT20_OutData[2] = (T1>>8) & 0x000000FF;AHT20_OutData[3] = T1 & 0x000000FF;}else{AHT20_OutData[0] = 0xFF;AHT20_OutData[1] = 0xFF;AHT20_OutData[2] = 0xFF;AHT20_OutData[3] = 0xFF;printf("lyy");}/*通过串口显示采集得到的温湿度printf("\r\n");printf("温度:%d%d.%d",T1/100,(T1/10)%10,T1%10);printf("湿度:%d%d.%d",H1/100,(H1/10)%10,H1%10);printf("\r\n");*/t=T1/10;t1=T1%10;a=(float)(t+t1*0.1);h=H1/10;h1=H1%10;b=(float)(h+h1*0.1);sprintf(strTemp,"%.1f",a);   //调用Sprintf函数把DHT11的温度数据格式化到字符串数组变量strTemp中  sprintf(strHumi,"%.1f",b);    //调用Sprintf函数把DHT11的湿度数据格式化到字符串数组变量strHumi中  GUI_ShowCHinese(16,00,16,"温湿度显示",1);GUI_ShowCHinese(16,20,16,"温度",1);GUI_ShowString(53,20,strTemp,16,1);GUI_ShowCHinese(16,38,16,"湿度",1);GUI_ShowString(53,38,strHumi,16,1);delay_ms(1500);      delay_ms(1500);
}

2.点阵显示文字

    "温",0x00,0x00,0x23,0xF8,0x12,0x08,0x12,0x08,0x83,0xF8,0x42,0x08,0x42,0x08,0x13,0xF8,0x10,0x00,0x27,0xFC,0xE4,0xA4,0x24,0xA4,0x24,0xA4,0x24,0xA4,0x2F,0xFE,0x00,0x00,/*"温",0*/"度",0x01,0x00,0x00,0x80,0x3F,0xFE,0x22,0x20,0x22,0x20,0x3F,0xFC,0x22,0x20,0x22,0x20,0x23,0xE0,0x20,0x00,0x2F,0xF0,0x24,0x10,0x42,0x20,0x41,0xC0,0x86,0x30,0x38,0x0E,/*"度",0*/"湿",0x00,0x00,0x27,0xF8,0x14,0x08,0x14,0x08,0x87,0xF8,0x44,0x08,0x44,0x08,0x17,0xF8,0x11,0x20,0x21,0x20,0xE9,0x24,0x25,0x28,0x23,0x30,0x21,0x20,0x2F,0xFE,0x00,0x00,/*"湿",0*/"显",0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x04,0x40,0x44,0x44,0x24,0x44,0x14,0x48,0x14,0x50,0x04,0x40,0xFF,0xFE,0x00,0x00,/*"显",0*/"示",0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x01,0x00,0x01,0x00,0x11,0x10,0x11,0x08,0x21,0x04,0x41,0x02,0x81,0x02,0x05,0x00,0x02,0x00,/*"示",0*/

3.打开main.c文件

打开main函数,将以下代码填入:

#include "delay.h"
#include "usart.h"
#include "bsp_i2c.h"
#include "sys.h"#include "oled.h"
#include "gui.h"
#include "test.h"int main(void)
{   delay_init();                  //延时函数初始化          uart_init(115200);     IIC_Init();NVIC_Configuration();      //设置NVIC中断分组2:2位抢占优先级,2位响应优先级     OLED_Init();                     //初始化OLED  OLED_Clear(0); while(1){//printf("温度湿度显示");read_AHT20_once();OLED_Clear(0); delay_ms(1500);}
}

4.烧录

4.1.电路连接
参考前文
4.2.实验结果展示:

六、 上下或左右的滑动显示长字符,显示一句诗词

1.OLED屏滚动显示命令

水平左右滚动:

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(0x07,OLED_CMD);        //终止页 7
OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
OLED_WR_Byte(0xFF,OLED_CMD);        //虚拟字节
OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动

垂直滚动:

OLED_WR_Byte(0x2e,OLED_CMD);        //关闭滚动
OLED_WR_Byte(0x29,OLED_CMD);        //水平垂直和水平滚动左右 29/2a
OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
OLED_WR_Byte(0x00,OLED_CMD);        //起始页 0
OLED_WR_Byte(0x07,OLED_CMD);        //滚动时间间隔
OLED_WR_Byte(0x07,OLED_CMD);        //终止页 1
OLED_WR_Byte(0x01,OLED_CMD);        //垂直滚动偏移量
OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动

2.对将要显示的汉字进行取模

3.代码编写

3.1.在oledfont.h文件中添加字模代码:

3.2.打开test.c文件,OLED显示函数:

void TEST_MainPage(void)
{   GUI_ShowCHinese(10,20,16,"你是年少的欢喜",1);delay_ms(1500);     delay_ms(1500);
}

3.3.打开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);             //清屏(全黑)OLED_WR_Byte(0x2E,OLED_CMD);        //关闭滚动OLED_WR_Byte(0x27,OLED_CMD);        //水平向左或者右滚动 26/27OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节OLED_WR_Byte(0x00,OLED_CMD);        //起始页 0OLED_WR_Byte(0x07,OLED_CMD);        //滚动时间间隔OLED_WR_Byte(0x07,OLED_CMD);        //终止页 7OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节OLED_WR_Byte(0xFF,OLED_CMD);        //虚拟字节TEST_MainPage();OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动
}

4.烧录

4.1.电路连接:
参考前文
4.2.实验结果展示:

七、总结

通过本次实验,我加深了对于SPI通信协议原理的一些印象和进一步理解;在实验过程中,温湿度采集的OLED显示屏上显示的温湿度一直是0.0,换了一块STM32芯片后才正常显示,还有就是需要注意接线的问题,接线不稳和接错都可能使实验失败。

八、参考链接

https://blog.csdn.net/qq_46467126/article/details/121439142?spm=1001.2014.3001.5501
https://blog.csdn.net/qq_53112972/article/details/127596367

关于STM32+OLED显示屏的简单应用相关推荐

  1. STM32—OLED显示屏

    3. OLED显示屏 本文来自于<STM32--江科大>的笔记整理. 文章目录 3. OLED显示屏 3.1 OLED简介 3.2 OLED驱动函数 代码: OLED.h OLED.c O ...

  2. STM32 OLED显示屏--SPI通信知识汇总

    备注:在OLED显示屏部分,单片机是通过SPI和OLED进行通信的. 文章目录 目录 文章目录 一.SPI时序通信 二.SPI通信的分类 1.硬件SPI 2.软件SPI 三.硬件SPI SPI特性 硬 ...

  3. STM32 OLED显示屏

    OLED概念 一:屏幕的分类 OLED屏 -- 有机发光二极管 当通上电的时候,管道内的有机材料就会发光 投射出红蓝绿三种颜色的光,并且每个单元都是独立工作,所以显示出来得画面,是的屏幕会更加得饱满: ...

  4. STM32:OLED显示屏代码

    main.c主函数部分代码: #include "stm32f10x.h"                  // Device header #include "Del ...

  5. STM32-使用IIC接线的OLED显示屏

    一.IIC协议的简单介绍 在物理层上:IIC协议就是通过一根数据线(SDA)与一根时钟线(SCL)将一个主机与一个或多个从机相连接,并且为了不同设备之间进行访问,每一个设备都有不同的地址. 在协议层上 ...

  6. 基于stm32的OLED显示屏显示

    文章目录 一.内容 二.关于SPI 三.关于OLED 四.功能实现 1)实验准备 2)代码准备 1.显示学号和姓名 2.显示AHT20的温度和湿度 3.滑动显示长字符 3)结果展示 五.参考内容 六. ...

  7. 机智云STM32平台移植oled显示屏

    机智云gokitSTM32平台移植oled显示屏 首先非常感谢机智云官方提供的免费开发板,需要的同学可以上机智云的官方网站申请. oled简介 OLED,即有机发光二极管( Organic Light ...

  8. 关于基于stm32的0.96寸oled显示屏的学习理解心得。

    关于基于stm32的0.96寸oled显示屏的学习理解心得. oled粗了解 如何理解OLED分辨率? 这里0.96寸OLED分辨率是12864;即OLED显示是128行64列; 但是由于OLED不能 ...

  9. 基于STM32的0.96寸OLED显示屏显示固定数据、滑动数据、温湿度数据

    目录 OLED显示原理 一.实验工具 二.OLED显示固定数据 1.显示数据相关函数 2.main函数 3.总显示函数 4.取字模 5.实现效果如下: 三.OLED实现滑动显示数据 1.添加滑动命令 ...

最新文章

  1. java 流程控制_《Java基础知识》Java流程控制
  2. arduino并口屏_Arduino 驱动串口屏(入门级)
  3. Django实战教程 分页列表
  4. hive的新分区和旧分区的概念问题
  5. 《当程序员的那些狗日日子》(三十六)无名的配角
  6. plsql存过声明游标_plsql编程学习之游标一
  7. 采用GDI生成Code39条形码
  8. 关于MySQL存储过程异常处理的一点心得
  9. paip.自适应网页设计 跟 响应式 设计的区别跟原理and实践总结
  10. linux安装weblogic界面,Weblogic11g 安装Linux下无Weblogic安装图形界面
  11. soul群聊显示服务器异常,soul被限制群聊什么意思
  12. [AndroidO] [RK3399] -- 支持 CH341 驱动 -- 驱动模块的标准添加流程
  13. 神经网络-神经元模型、Hebb学习
  14. 面试:Spring Boot的优缺点
  15. 咸鱼K210体验笔记—颜色识别
  16. unreal engine各个版本网盘离线下载
  17. 3.2 电话号码对应英语单词
  18. 总结Android屏幕适配(源自简书:李俊的博客)
  19. 一般计算机电源都在什么服务,1u工控服务器电源与普通电脑电源能互用吗
  20. [MIX] 吉他独奏学习

热门文章

  1. Kibana的安装与使用
  2. 全国OSTA计算机高新技术SQLSever数据库四级证书--考证复习知识点集合(附下载地址)
  3. 一个小程序入门matlab
  4. 终于明白了,为什么会有经济危机
  5. VUI-百度语音之Rest接口python学习笔记0
  6. 大数据时代 商品的数据的价值在哪
  7. 【ubuntu】htop命令详解
  8. 了解MOS管开通和关断过程原理特性分析
  9. 360更新补丁之后把Outlook弄坏了
  10. 【转载】NeurIPS 2018 | 腾讯AI Lab详解3大热点:模型压缩、机器学习及最优化算法...