OLED的波形曲线、进度条、图片显示(STM32 HAL库 模拟SPI通信 5线OLED屏幕)详细篇

2023-05-16

少废话,先上效果图

屏幕显示效果

       

全家福

 

观看演示效果:

https://www.bilibili.com/video/BV13V411b78V

一、基础认识及引脚介绍

屏幕参数:

尺寸:0.96英寸

分辨率:128*64

驱动芯片:SSD1306

驱动接口协议:SPI

引脚说明:

二、 SSD1306芯片介绍

SSD1306是一款带控制器的用于OLED点阵图形显示系统的单片CMOS OLED/PLED驱动器。它由128个SEG(列输出)和64个COM(行输出)组成。

 

SSD1306嵌入了对比度控制器、显示RAM和振荡器,从而减少了外部组件的数量和功耗。它有256级亮度控制。数据/命令可以通用硬件选择3种通信方式:6800/8000串口、IIC接口和SPI接口。适用于手机子显示器、MP3播放器、计算器等多种便携应用。

 

模块有多种通信方式,包括串口、IIC、SPI,其选择通过硬件固化,如果使用IIC通信方式时可以选择两个IIC地址,其分别为0x78和0x7A。

三、 通信方式(4线SPI)

所谓的4线SPI并非是收发一体的标准4线SPI协议,标准的4线SPI为SCLK、CS、MOSI、MISO,模块所述大的4线SPI是单向的,即MISO(主入从出)变成了D/C(数据命令选择脚)。

该4线串行接口由串行时钟SCLK、串行数据SDIN、数据命令选择线D/C#、片选信号CS#组成.在四线SPI模式下,D0为SCLK,D1为SDIN。

其真实使用的是标准的3线SPI,也就是省略了MISO(主入从出)数据线。

 

数据命令选择:DC为高时表示数据,DC为低时表示写命令

片选:CS脚为低电平是选中,如果不通信时将脚输出高电平

数据通信:在SCLK的每一个上升边上,SDIN按D7,D6,…D0,高位先写出

 

通信时序图

四、编程(CubeMX部分)

(一)   CubeMX基础配置

选择芯片(STM32F103C8T6)

打开外部的高速和低速晶振

所占用的引脚

开启SWD调试

所占用的引脚

时钟树设置

设置系统时钟为最高速度,72MHZ

(二)  GPIO初始化

初始化电平分析

D0:SCLK,时钟线,上升沿有效,所以默认输出高电平

D1:SDIN,数据线,默认输出电平随意

RST:复位脚,低电平复位,默认电平为低

DC:数据/命令选择脚,默认输出电平随意

CS:片选引脚,默认输出高电平

引脚选择

使用单片机是STM32F103C8T6

考虑到已经使用的IO和硬件上的布局,最好是将一个模块的相关线放在一起,所以选择如下接线方式:

D0   ---->  B5

D1   ---->  B6

RST  ---->  B7

DC   ---->  B8

CS   ---->  B9

(三)  CubeMX GPIO配置

所使用的IO

(四) 整体配置图

五、 编程(程序部分)

(一)    分析原理

有IIC通信方式为什么要有SPI,我看可以简单对比一下:

 

IIC通信方式:两条数据线,通信数据较慢

SPI通信方式:四条数据线,通信数据脚快

 

这就看项目需要,如果需要刷屏速度的话当然选用SPI方式优秀

在此之前要知道,OLED SPI通信中不需要单片机读取OLED模块的任何数据,所以单片机按照一定的规则向SPI线上写数据就可以了。在通信中单片机充当SPI的主机,OLED模块为SPI的从机。因为主机不需要接收从机数据,所以标准的四线SPI中MISO线就没必要存在了。通信使用的是标准的三线SPI,即CS、CLK、MOSI。

 

根据这个时序图就可以了解如何变成,在CS为低电平时就是芯片通信启动;D/C是数据或者命令的选择,也就是主机拉高拉低可以控制写的数据是指令还是数据;SCLK(D0)是时钟引脚,MOSI (D1 SDIN)为数据已经。当SCLK上升沿的瞬间,从机将会读取MOSI上的电平。发送一个字节时,是高位在前低位在后的。

所以发送一个字节大的函数,这实现了单向的数据传输SPI

实现步骤:

l  先保证时钟线默认为低电平

l  循环发送8位数据,发送最高位数据:

|  设置时钟线为低电平

|   判断发送的数据是1还是0,1则发送高电平,0则低低电平

|   设置时钟线为高电平(此时有上升沿)

l  数据左移一位,让次高位在最高位上

l  循环发送8位数据,发送次高位数据:

|   设置时钟线为低电平

|   判断发送的数据是1还是0,1则发送高电平,0则低低电平

|   设置时钟线为高电平(此时有上升沿)

l  数据左移一位,……

l  ……

l  保证时钟线最终为高电平

代码,需要交流可加本人微信,见文章结尾

数据和命令分发:

OLED SPI方式为了更快的数据交互,有一个专门的引脚作为数据和命令选择脚,而IIC还要靠发送数据去做判断,可想而知他们的速率会有相差。

D/C引脚就是数据/命令选择,低电平写命令,高电平写数据

设计思路:

l  如果是命令,则拉高DC引脚

l  如果不是命令,则拉低DC引脚

l  CS引脚拉低表示选中从机,开启通信

l  发送一个数据,则调用了前面的标准3线SPI通信函数

l  拉高DC引脚

l  拉高CS引脚,关闭通信

代码,需要交流可加本人微信,见文章结尾

六、OLED进阶版及曲线显示

(一)驱动分析

想要了解OLED显示曲线就必须了解其显示本质,更加底层细致的分析寄存器及显示原理。

0.96寸的12864 OLED屏幕由128*64个发光二极管组成。

这是数据手册的截图

注意图总的黑色和绿色,它只是告诉你可以反向,也就是0编号的位置可以换成127编号而已。

由此可见屏幕总共分为8页(page),每页占用Y轴的8行发光二极管和X轴的128个发光二极管,所以一页总共占用8*128=1024个发光二极管。

所以在真实的图中表示:

这是数据手册中其中一页的表示

这是基于没有做反转时的介绍,如果反转了就不是这样了。反转是在程序初始化是调用的,后面分析的初始化函数有介绍

其中“Each lattice represents one bit of image data”的翻译是“每个格子代表一个图像数据位”,因为一页刚好8个Y方向的各种,对应的刚好是U8类型,所以我们通常用一个U8表示一页里的一个列的显示,一页中共有128个列,所以一页总共需要1*128=128个U8类型数据。并且从图中可以看出,最下面的是最高位。

举个栗子:

假如我们拿第二页的第一列来说,其值的二进制为11110000,其实点亮的是如下图的红色部分。

这也就说明高位点亮的是下面的位置。

(二)初始化函数及逐条分析

void my_oled_init(){
  my_oled_rst();
    my_oled_write_byte(0xAE,OLED_CMD);//关闭显示

    my_oled_write_byte(0x00,OLED_CMD);//X轴低位,起始X轴为0
    my_oled_write_byte(0x10,OLED_CMD);//X轴高位
    my_oled_write_byte(0x40,OLED_CMD);//Y轴,可设区间[0x40,0x7F],设置为0了


    my_oled_write_byte(0xA1,OLED_CMD);//设置X轴扫描方向,0xa0左右反置 ,0xa1正常(左边为0列)
    my_oled_write_byte(0xC8,OLED_CMD);//设置Y轴扫描方向,0xc0上下反置 ,0xc8正常(上边为0行)
    my_oled_write_byte(0xA6,OLED_CMD);//位值表示的意义,0xa6表示正常,1为点亮,0为关闭,0xa7显示效果相反


    my_oled_write_byte(0x81,OLED_CMD);//命令头,调节亮度,对比度,变化很小,但是仔细可以观察出来
    my_oled_write_byte(0xFF,OLED_CMD);//可设置区间[0x00,0xFF]

    my_oled_write_byte(0xA8,OLED_CMD);//命令头,设置多路复用率(1 to 64)
    my_oled_write_byte(0x3f,OLED_CMD);//--1/64 duty

    my_oled_write_byte(0xD3,OLED_CMD);//命令头,设置显示偏移移位映射RAM计数器(0x00~0x3F)
    my_oled_write_byte(0x00,OLED_CMD);//不偏移

    my_oled_write_byte(0xd5,OLED_CMD);//命令头,设置显示时钟分频比/振荡器频率
    my_oled_write_byte(0x80,OLED_CMD);//设置分割比率,设置时钟为100帧/秒

    my_oled_write_byte(0xD9,OLED_CMD);//命令头,--set pre-charge period
    my_oled_write_byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock

    my_oled_write_byte(0xDA,OLED_CMD);//命令头,--set com pins hardware configuration
    my_oled_write_byte(0x12,OLED_CMD);

    my_oled_write_byte(0xDB,OLED_CMD);//命令头,--set vcomh
    my_oled_write_byte(0x40,OLED_CMD);//Set VCOM Deselect Level

    my_oled_write_byte(0x20,OLED_CMD);//命令头,设置寻址模式
    my_oled_write_byte(0x10,OLED_CMD);//页面寻址模式(重置) (0x00/0x01/0x02)

    my_oled_write_byte(0x8D,OLED_CMD);//命令头,--set Charge Pump enable/disable
    my_oled_write_byte(0x14,OLED_CMD);//--set(0x10) disable

    my_oled_write_byte(0xA4,OLED_CMD);//恢复到RAM内容显示(重置)

    my_oled_clear();//清屏

    my_oled_write_byte(0xAF,OLED_CMD); //开启显示

}

局部分析:

设置寻址模式

A[1:0] = 00b,水平寻址模式

A[1:0] = 01b,垂直寻址模式

A[1:0] = 10b,页面寻址模式(重置)

A[1:0] = 11b,无效

00b,水平寻址模式

01b,垂直寻址模式

10b,页面寻址模式

寻址模式对应着我们的取模:

我们取模软件设置的刷新方式:

从左到右从上到下:对应了页面寻址模式

纵向8点下高位:纵向右8个点,最下面的点为最高位

其它相关逐条分析内容,可加本人微信获取,见文末

  (三)  寄存器配置补充(详细)

需要资料可加本人微信,见文末


观看演示效果:https://www.bilibili.com/video/BV13V411b78V

原文链接:https://www.cnblogs.com/dongxiaodong/p/14321569.html

如需资料可加本人微信

 

微信号:dongxiaodongwx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OLED的波形曲线、进度条、图片显示(STM32 HAL库 模拟SPI通信 5线OLED屏幕)详细篇 的相关文章

  • 北斗定位与GPS定位的区别

    欢迎来到东用小知识课堂 xff0c 每天学习一分钟 xff0c 让你紧跟时代 xff0c 扩充自己 xff0c 成为大佬不是梦 xff01 1 覆盖范围 xff1a 北斗定位系统是覆盖中国本土的区域导航系统 覆盖范围东经约70 一140 x
  • 污水处理远程监控系统解决方案

    一 行业背景 随着我国科技和经济的发展 xff0c 近年来工厂数量日益增多 xff0c 而生产所带来的工业垃圾及污水就是一个重要的环境污染问题 xff0c 部分工厂甚至会在监管部门的监控死角下偷偷进行污水排放 xff0c 对周围水质造成严重
  • 5G工业路由器安全性怎么样?工业路由器的特点

    路由器 xff0c 本身就是一个具有相当大潜力的网络通信设备 xff0c 即使再是网络小白的用户 xff0c 可能也知道路由器是家中用于发布无线网络的设备 xff0c 如果深入了解的话 xff0c 其作用和发展会让人大为感慨 相信很多用户也
  • 路由器有防火墙?工业路由器的那些安全防护

    想要网络安全光是电脑装了杀毒软件可不行 xff0c 如果一个企业或者大型工厂一旦因为网络防护疏忽 xff0c 那么丢失数据信息所造成的损失是无法估量的 xff0c 所以企业及工厂网络通信及数据传输所使用的路由器一般都是工业级的 xff0c
  • Cat.1和Cat.4有哪些区别

    Cat 1的全称为LTE UE Category 1 xff0c 它是4G LTE网络的一个类 xff0c 也可以理解为低配的4G终端 xff0c 属于广域网 xff0c 蜂窝联网 xff0c 上行峰值为5Mbit s xff0c 下行峰值
  • RS485接口连接设备数量总共有多少?

    RS485总线可以连接256个设备 xff0c 但测试后发现这个数字有比较大的差异 有一种说法认为专门开发串行嵌入式的RS485总线只能连接32个节点 xff0c 这由自身的驱动能力决定的 有人说网上的各种485总线产品可以支持128个 x
  • 预防山体滑坡,泥石流监测智能预警系统

    一 行业背景 我国是一个山区面积较大的国家 xff0c 山地 丘陵约占国土总面积的2 3 xff0c 在众多的山区中 xff0c 都具备泥石流形成的基本条件 xff0c 这也让我国成为受泥石流灾害影响最大的国家 在我国境内 xff0c 泥石
  • 如何扩大无线网络信号强度?

    欢迎来到东用小知识课堂 xff0c 每天学习一分钟 xff0c 让你紧跟时代 xff0c 扩充自己 xff0c 成为大佬不是梦 xff01 无线网络通信设备存在一个问题 xff0c 那就是他的信号发射都是直线型 xff0c 因此一旦家中或者
  • OpenWrt 添加cpu温度显示监控

    opkg update opkg install lm sensors lm sensors detect 然后修改一下 usr lib lua luci view admin status index htm 增加一个温度的显示 lt C
  • RS485接线方式小科普

    欢迎来到东用知识小课堂 xff01 RS 485采用平衡发送和差分接收方式实现通信 xff1a 发送端将串行口的ttl电平信号转换成差分信号a xff0c b两路输出 xff0c 经过线缆传输之后在接收端将差分信号还原成ttl电平信号 RS
  • 传输数据稳如老狗,还支持多种接口,这款DTU让智能化更简单

    如果你的项目正在向着智慧化转变或发展 xff0c 那么你一定会深刻意识到数据传输的稳定性对于整个系统的稳定运行的重要性 毕竟 xff0c 项目的智能化发展需要时刻保持数据的可靠性和稳定传输 xff0c 如果一旦传输因设备或者网络等因素导致中
  • 什么是光耦隔离?光耦隔离的主要作用

    欢迎来到东用知识小课堂 xff01 光耦合器的结构相当于把发光二极管和光敏三极管封装在一起 光耦隔离电路使被隔离的两部分电路之间没有电的直接连接 xff0c 主要是防止因有电的连接而引起的干扰 xff0c 特别是低压的控制电路与外部高压电路
  • ORB305与CISCO路由器构建L2TP over IPSec VPN操作手册

    1 网络拓扑 在思科路由器与ORB305之间建立一个安全隧道 xff0c 对客户路由器端设备子网 xff0c 与思科路由器端服务器子网之间的数据流进行安全保护 xff0c 组网拓扑图如图所示 2 思科路由器端配置指导 此处以多数客户使用专线
  • linux下使用UDP发送接收数据

    接收 static int sock fd struct sockaddr in recv addr 读取参数 struct sockaddr in send addr 发送参数 sock fd 61 socket AF INET SOCK
  • 0长度数组的使用,重点掌握的知识

    0长度的数组在ISO C和C 43 43 的规格说明书中是不允许的 xff0c 但是GCC的C99支持的这种用法 GCC对0长度数组的文档参考 xff1a Arrays of Length Zero 如下代码片段 xff0c 哪个更简洁更灵
  • Freertos中检测内存的剩余函数

    static uint16 t prvTaskCheckFreeStackSpace const uint8 t pucStackByte
  • 重定位

    一 必须知道的几个概念 1 链接地址和运行地址 运行地址 xff0c 顾名思义就是程序运行的时候的地址 xff0c 也就是你用工具将代码下载到RAM的那个地址 xff0c 也叫加载地址 链接地址 xff0c 由链接脚本指定的地址 为什么需要
  • CC2541低功耗的实现方法

    转自 xff1a http blog csdn net mzy202 article details 42091537 CC2541 CC2540 实现超低功耗是非常重要的 xff1a 我们来总结一下实现方法 xff1a 1 xff0c 有
  • Macbook pro/air 2013 late -2014 使用转接卡更换NVME SSD休眠不醒问题的解决办法

    2021年1月更新 xff0c 发现升级 big sur 11 1之后 xff0c 固件版本变成了429 0 0 0 睡眠问题又回来了 xff0c 每次都睡死 xff0c 不醒 于是我按老办法 xff0c 把mbp114的nvme驱动刷到m
  • stm32使用stlink v2.0下载的sw接线方式

    stm32的sw下载需要用到4根线 GND VCC SWCLK SWDIO xff0c 对应好即可 xff0c 相比较3根线的方式 xff0c 优先推荐4根线下载方式

随机推荐

  • stm32芯片的焊接

    stm32的焊接 xff0c 使用到东西 xff1a 松香 xff0c 维修佬 xff0c 烙铁 1 首先将stm32的一个角的脚上涂上维修佬 xff0c 要特别特别少 xff0c 太多了 xff0c 容易粘连到其他脚上面 xff0c 不好
  • Modbus-RTU通讯协议中CRC校验码的计算步骤

    在CRC计算时只用8个数据位 xff0c 起始位及停止位 xff0c 如有奇偶校验位也包括奇偶校验位 xff0c 都不参与CRC计算 CRC计算方法是 xff1a 1 预置1个16位的寄存器为十六进制FFFF xff08 全1 xff09
  • 一个很好的makefile例子(经典)

    转自http www cnblogs com sld666666 archive 2010 04 08 1707789 html 相信在unix下编程的没有不知道makefile的 xff0c 刚开始学习unix平台 下的东西 xff0c
  • 无线传输距离计算公式

    转自一篇文档 无线传输距离计算 Pr dBm 61 Pt dBm Ct dB 43 Gt dB FL dB 43 Gr dB Cr dB Pr xff1a 接受端灵敏度 Pt 发送端功率 Cr 接收端接头和电缆损耗 Ct 发送端接头和电缆损
  • hex文件解析

    Keil开发环境编程时对源程序进行编译链接后都 可以 成一个可执行文件即 hex文件 xff0c 但是有不完全是一个可执行文件 然后 可以 通过烧录工具烧写到对应的单片机的 flash中 xff0c 当然也还有其他方法可以进行烧录 大家在编
  • Ubuntu下如何挂载以及卸载U盘?

    l 在挂载U盘前 xff0c 首先运行命令cat proc partitions xff0c 看看现在系统中有哪些分区 插上u盘以后 xff0c 再次运行上述命令 xff0c 看看多出来什么分区 xff08 通常是sda1 xff0c 由于
  • 链接脚本文件的写法

    对于 lds文件 xff0c 它定义了整个程序编译之后的连接过程 xff0c 决定了一个可执行程序的各个段的存储位置 虽然现在我还没怎么用它 xff0c 但感觉还是挺重要的 xff0c 有必要了解一下 先看一下GNU官方网站上对 lds文件
  • Ubuntu18.04+思岚激光雷达A2M7+ROS测试

    Ubuntu18 04 43 思岚激光雷达A2M7 43 ROS测试 1 测试环境搭建 测试环境 xff1a Ubuntu18 04 43 ROS Melodic测试工具 xff1a 思岚科技激光雷达A2M7 43 USB转接工具 2 下载
  • ROS系统的串口数据读取和解析

    原帖地址 xff1a https blog csdn net Tansir94 article details 81357612 一 Ubuntu下的串口助手cutecom 下载 xff1a sudo apt get install cut
  • tcp buffer设置

    本文基于CENTOS DEBIAN UBUNTU 编写 我有两台位于不同数据中心的服务器 xff0c 都用来处理很多并行的大文件传输 但是处理大文件 xff0c 网络性能非常差 并且涉及到一个大文件 xff0c 会导致性能降级 我怎样通过调
  • URL模块之parse方法

    url parse urlString boolean boolean parse这个方法可以将一个url的字符串解析并返回一个url的对象 参数 xff1a urlString指传入一个url地址的字符串 第二个参数 xff08 可省 x
  • Makefile 知识点记录

    Makefile 知识点记录 1 依赖类型 xff1a normal Prerequisites xff0c order only prerequisites normal Prerequisites xff1a 标准依赖具有两层含义的声明
  • 视频矩阵系统中三代OSD字符叠加技术全面解析

    视频矩阵系统中三代OSD字符叠加技术全面解析 屏显信息更丰富 中文效果更出色 使用设置更灵活 视频矩阵系统中三代OSD字符叠加技术全面解析 前言 xff1a 在以矩阵为控制中枢的视频监控系统中 xff0c 大量的视频信号需要在数目有限的监视
  • CV_...报错

    在出错的程序里面添加相应的头文件即可 1 CV LOAD IMAGE COLOR was not declared in this scope include 34 opencv2 imgcodecs legacy constants c
  • 优化IMU数据避免突变的建议

    影响IMU数据变化的主要因素是应力 温度和电气干扰 xff1b xff11 温度的的骤升 xff0c 比如芯片的位置附件有相关器件几秒钟工作一次 xff0c 此时温度骤升 xff0c 可能会引起数据也发生突变 xff0c 周围有变化的热源和
  • JAVA HtmlParser Filter解析网页和表格(半个教程)

    package sometry import java io BufferedReader import java io InputStreamReader import java io FileInputStream import jav
  • 物联网系统网关开发与实现

    项目是大学时期的课程设计 摘要 粤嵌GEC 6818开发板作为系统的网关板 xff0c 其为系统数据的中枢 启动串口收发 xff0c 可以接收到ZigBee网络的协调器通过串口发送的数据 xff1b lCD屏幕编程 xff0c 实现传感网的
  • python 人脸识别和手势识别应用(face++)开发

    一 基础认识 本项目使用的是face 43 43 平台 xff0c 人脸识别 43 手势识别双确认显示 python编程 xff0c 代码简介 xff0c 方便扩展 该项目适用于Windows系统和Linux系统 xff0c 但必须安装相应
  • 产品开发阶段 EVT DVT PVT MP

    PLM xff08 Product Lifecycle Management xff09 System xff1a PLM是协助产品能够顺利完成在新产品开发 xff08 NPI xff1a New Product Introduction
  • OLED的波形曲线、进度条、图片显示(STM32 HAL库 模拟SPI通信 5线OLED屏幕)详细篇

    少废话 xff0c 先上效果图 屏幕显示效果 全家福 观看演示效果 xff1a https www bilibili com video BV13V411b78V 一 基础认识及引脚介绍 屏幕参数 xff1a 尺寸 xff1a 0 96英寸