基于STM32的0.96寸OLED显示屏显示数据

1.SPI模块的通用知识
    SPI是 Serial Peripheral Interface 的缩写,即串行外围设备接口,这是一种高速同步串行通信接口。SCI是一种低速异步串行通信接口,它与SPI不同,一个是同步通信,一个是异步通信。同步通信时,通信双方的设备必须拥有相同的时钟脉冲,以相同步调进行数据传输。异步通信时,通信双方的设备可以拥有各自独立的时钟脉冲,可以独自进行数据传输。
    SPI接口一般使用四条线,它以主从方式进行工作,这种模式的通信系统中有一个主设备和多个从设备。

线路名称    线路作用
SCK    串行时钟线
MISO    主机输入/从机输出
MOSI    主机输出/从机输入
CS    低电平有效的从机选择线
    SPI接口的通信原理很简单,CS信号用来控制从机的芯片是否被选中。

1.2 SPI优点

1):支持全双工通信

2):通信简单

3):数据传输速率快

1.3 缺点
没有指定的流控制,没有应答机制确认是否接收到数据,所以跟IIC总线协议比较在数据
可靠性上有一定的缺陷。

2、 特点

2.1 采用主-从模式(Master-Slave) 的控制方式

SPI 规定了两个 SPI 设备之间通信必须由主设备 (Master) 来控制次设备 (Slave)。 一个 Master 设备可以通过提供 Clock 以及对 Slave 设备进行片选 (Slave Select) 来控制多个 Slave 设备,SPI 协议还规定 Slave 设备的 Clock 由 Master 设备通过 SCK 管脚提供给 Slave 设备, Slave 设备本身不能产生或控制 Clock,没有 Clock 则 Slave 设备不能正常工作。

2.2 采用同步方式(Synchronous)传输数据

Master 设备会根据将要交换的数据来产生相应的时钟脉冲(Clock Pulse),时钟脉冲组成了时钟信号(Clock Signal) ,时钟信号通过时钟极性 (CPOL) 和 时钟相位 (CPHA) 控制着两个 SPI 设备间何时数据交换以及何时对接收到的数据进行采样,来保证数据在两个设备之间是同步传输的

2.3 数据交换(Data Exchanges)

SPI 设备间的数据传输之所以又被称为数据交换是因为 SPI 协议规定一个 SPI 设备不能在数据通信过程中仅仅只充当一个 “发送者(Transmitter)” 或者 “接收者(Receiver)”。在每个 Clock 周期内,SPI 设备都会发送并接收一个 bit 大小的数据(不管主设备好还是从设备),相当于该设备有一个 bit 大小的数据被交换了。一个 Slave 设备要想能够接收到 Master 发过来的控制信号,必须在此之前能够被 Master 设备进行访问 (Access)。所以,Master 设备必须首先通过 SS/CS pin 对 Slave 设备进行片选, 把想要访问的 Slave 设备选上。 在数据传输的过程中,每次接收到的数据必须在下一次数据传输之前被采样。如果之前接收到的数据没有被读取,那么这些已经接收完成的数据将有可能会被丢弃,导致 SPI 物理模块最终失效。因此,在程序中一般都会在 SPI 传输完数据后,去读取 SPI 设备里的数据, 即使这些数据(Dummy Data)在我们的程序里是无用的(虽然发送后紧接着的读取是无意义的,但仍然需要从寄存器中读出来)

2.5 SPI只有主模式和从模式之分

**SPI没有读和写的说法,**因为实质上每次SPI是主从设备在交换数据。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。

3、 工作机制

3.1 概述

上图只是对 SPI 设备间通信的一个简单的描述, 下面就来解释一下图中所示的几个组件:

  • SSPBUF:泛指 SPI 设备里面的内部缓冲区,一般在物理上是以 FIFO 的形式,保存传输过程中的临时数据;
  • SSPSR:泛指 SPI 设备里面的移位寄存器,它的作用是根据设置好的数据位宽(bit-width) 把数据移入或者移出 SSPBUF;
  • Controller:泛指 SPI 设备里面的控制寄存器,可以通过配置它们来设置 SPI 总线的传输模式。

通常情况下,我们只需要对上图所描述的四个管脚(pin) 进行编程即可控制整个 SPI 设备之间的数据通信:

  • SCK:主要的作用是 Master(主)设备往 Slave(从)设备传输时钟信号, 控制数据交换的时机以及速率;
  • SS/CS:用于 Master(主)设备片选 Slave (从)设备,使被选中的 Slave(从)设备能够被 Master(主)设备所访问;
  • SDO/MOSI:在 Master(主)上面也被称为 Tx-Channel,作为数据的出口,主要用于 SPI 设备发送数据;
  • SDI/MISO:在 Master(主)上面也被称为 Rx-Channel,作为数据的入口,主要用于SPI 设备接收数据;

SPI 设备在进行通信的过程中,Master 设备和 Slave 设备之间会产生一个数据链路回环(Data Loop),就像上图所画的那样, 通过 SDO 和 SDI 管脚, SSPSR 控制数据移入移出 SSPBUF,Controller 确定 SPI 总线的通信模式,SCK 传输时钟信号。

SDI(数据输入)、SDO(数据输出)、SCK(时钟)、CS(片选)

(1)、SDO/MOSI – 主设备数据输出,从设备数据输入;

(2)、SDI/MISO – 主设备数据输入,从设备数据输出;

(3)、SCK – 时钟信号,由主设备产生;

(4)、CS/SS – 从设备使能信号,由主设备控制。当有多个从设备的时候,因为每个从设备上都有一个片选引脚接入到主设备机中,当我们的主设备和某个从设备通信时将需要将从设备对应的片选引脚电平拉低或者是拉高。

3.2 SPI相关的缩写或说法

SPI的极性Polarity和相位Phase,最常见的写法是CPOLCPHA,不过也有一些其他写法,简单总结如下:

  • CKPOL (Clock Polarity) = CPOL = POL = Polarity = (时钟)极性
  • CKPHA (Clock Phase) = CPHA = PHA = Phase = (时钟)相位
  • SCK=SCLK=SPI的时钟
  • Edge=边沿,即时钟电平变化的时刻,即上升沿(rising edge)或者下降沿(falling edge)对于一个时钟周期内,有两个edge,分别称为:
  • Leading edge=前一个边沿=第一个边沿,对于开始电压是1,那么就是1变成0的时候,对于开始电压是0,那么就是0变成1的时候;
  • Trailing edge=后一个边沿=第二个边沿,对于开始电压是1,那么就是0变成1的时候(即在第一次1变成0之后,才可能有后面的0变成1),对于开始电压是0,那么就是1变成0的时候;

3.3 SPI总线的极性和相位

CPOL配置SPI总线的极性,CPHA配置SPI总线的相位。

3.3.1 SPI总线的极性

极性,会直接影响SPI总线空闲时的时钟信号是高电平还是低电平

CPOL = 1:表示空闲时是高电平;

CPOL = 0:表示空闲时是低电平。

由于数据传输往往是从跳变沿开始的,也就表示开始传输数据的时候,是下降沿还是上升沿。

至于跳变沿究竟是上升沿还是下降沿,这取决于 CPOL。记住, CPHA 只决定是哪个跳变沿采样。

3.4 SPI总线传输的四种模式

CPOL 和 CPHA 的不同组合,形成了SPI总线的不同模式。

时钟极性CPOL是用来配置SCLK的电平出于哪种状态时是空闲态或者有效态,时钟相位CPHA
是用来配置数据采样是在第几个边沿:
CPOL=0,表示当SCLK=0时处于空闲态,所以有效状态就是SCLK处于高电平时。
CPOL=1,表示当SCLK=1时处于空闲态,所以有效状态就是SCLK处于低电平时。
CPHA=0,表示数据采样是在第1个边沿,数据发送在第2个边沿。
CPHA=1,表示数据采样是在第2个边沿,数据发送在第1个边沿。

例如:
CPOL=0,CPHA=0:此时空闲态时,SCLK处于低电平,数据采样是在第1个边沿,也就是
SCLK由低电平到高电平的跳变,所以数据采样是在上升沿,数据发送是在下降沿。

CPOL=0,CPHA=1:此时空闲态时,SCLK处于低电平,数据发送是在第1个边沿,也就是
SCLK由低电平到高电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿。

CPOL=1,CPHA=0:此时空闲态时,SCLK处于高电平,数据采集是在第1个边沿,也就是
SCLK由高电平到低电平的跳变,所以数据采集是在下降沿,数据发送是在上升沿。

CPOL=1,CPHA=1:此时空闲态时,SCLK处于高电平,数据发送是在第1个边沿,也就是
SCLK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。

二)OLED简介
1.OLED原理
OLED(OrganicLight-Emitting Diode),又称为有机电激光显示、有机发光半导体(OrganicElectroluminesence Display,OLED)。OLED属于一种电流型的有机发光器件,是通过载流子的注入和复合而致发光的现象,发光强度与注入的电流成正比。OLED在电场的作用下,阳极产生的空穴和阴极产生的电子就会发生移动,分别向空穴传输层和电子传输层注入,迁移到发光层。当二者在发光层相遇时,产生能量激子,从而激发发光分子最终产生可见光。

下面是7针SPI通信OLED和4针I2C通信OLED的图片。

2.点阵编码原理与显示
汉字点阵编码
在汉字的点阵字库中,每个字节的每个位都代表一个汉字的一个点,每个汉字都是由一个矩形的点阵组成,0 代表没有点,1 代表有点,将 0 和 1 分别用不同颜色画出,就形成了一个汉字,常用的点阵矩阵有 1212, 1414, 16*16 三 种字库。
字库根据字节所表示点的不同有分为横向矩阵和纵向矩阵,目前多数的字库都是横向矩阵的存储方式(用得最多的应该是早期 UCDOS 字库),纵向矩阵一 般是因为有某些液晶是采用纵向扫描显示法,为了提高显示速度,于是便把字库 矩阵做成纵向,省得在显示时还要做矩阵转换。
OLED点阵显示
点阵屏像素按128列X64行组织,每一行128个像素单元的阴极是连接在一起,作为公共极(COM),每一列64个像素单元的阳极也连接在一起,作为一段(SEG)。行列交叉点上的LED就是一个显示单元,即一个像素。要点亮一个像素,只要在该像素所在列电极上加上正电压、行电极接地。同样,要驱动一整行图像,就需要同时把128列信号加载到列电极上,把该行行电极接地。该行显示时,其他63行均不能显示,其行电极应为高电平或悬空。
可见,整屏的显示,只能分时扫描进行,一行一行的显示,每次显示一行。行驱依次产生低电平扫描各行,列驱动读取显示数据依次加载到列电极上。扫描一行的时间称为行周期,完成一次全屏扫描,就叫做一帧。一般帧频大于60,人眼观察不到逐行显示。每行扫描显示用时叫占空比,占空比小,为达到相同的显示亮度,驱动电流就大。SSD1306段驱动最大电流为100uA,当整行128个像素全部点亮时,行电极就要流过12.8mA的电流。
 

2.1、使用0.96寸OLED显示屏显示数据
实验工具与材料
软件:keil
硬件:PC机,STM32开发板(本过程采用的是野火stm32mini开发板),0.96寸OLED显示屏,下载器(本过程采用ST_Link)
0.96寸OLED显示屏相关介绍
参考下面链接:
http://www.lcdwiki.com/zh/0.96inch_SPI_OLED_Module
运行厂家给出的Demo程序
①下载程序
程序下载链接:
0.96寸SPI_OLED模块配套资料包
②打开资料包,选择与自己平台相同的实例,打开Demo的工程,使用keil编译
③将程序烧录到开发板
④连接显示屏和开发板

STM32F103RCT6单片机测试程序接线说明

 

三、OLED显示

(一)显示姓名和学号

1.工程代码

工程链接:百度网盘
提取码:1234
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();         //主界面显示测试
        OLED_Clear(0); 
    }
}

2.修改代码

打开test.c修改TEST_MainPage函数中GUI_ShowString,GUI_ShowCHinese的参数

将下面输入的对应的字模点阵加入到oledfont.h里

"哈",0x00,0x40,0x00,0x40,0x00,0xA0,0x78,0xA0,0x49,0x10,0x49,0x08,0x4A,0x0E,0x4D,0xF4,
0x48,0x00,0x48,0x00,0x7B,0xF8,0x4A,0x08,0x02,0x08,0x02,0x08,0x03,0xF8,0x02,0x08,
"莉",0x04,0x40,0x04,0x44,0xFF,0xFE,0x04,0x40,0x06,0x08,0x78,0x08,0x08,0x48,0x08,0x48,
0xFF,0x48,0x08,0x48,0x1C,0x48,0x1A,0x48,0x2A,0x48,0x48,0x08,0x88,0x28,0x08,0x10,
"特",0x10,0x40,0x10,0x40,0x50,0x48,0x53,0xFC,0x7C,0x40,0x50,0x44,0x97,0xFE,0x18,0x10,
0x30,0x10,0xD7,0xFE,0x11,0x10,0x10,0x90,0x10,0x90,0x10,0x10,0x10,0x50,0x10,0x20,
 

(二)显示AHT20的温度和湿度

1.工程代码

完整代码
链接:百度网盘 输入提取码
提取码:1234
主函数
main.c

#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);
  }
}

2.连接硬件

这里要加入AHT20,在上面连接基础上
AHT20的SCL,GND,SDA,VCC分别对应接stm32f103指南者i2c模块的B6,GND,B7,3.3V。

 

(三)左右的滑动显示长字符

1.工程代码

完整代码
链接:左右滑动显示字符
提取码:1234
主函数
main.c

#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/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);        //虚拟字节
    TEST_MainPage();
    OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动
    while(1) 
    {    
 
    }
}

2.修改代码

打开test.c修改TEST_MainPage函数中GUI_ShowCHinese参数

参考文献

基于STM32的0.96寸OLED显示屏显示数据_HarrietLH的博客-CSDN博客

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值