STM32F405RG开发板控制OLED显示屏
Posted JIACHUN123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32F405RG开发板控制OLED显示屏相关的知识,希望对你有一定的参考价值。
1.1 实验目的
如何使用OLED模块。
如何在STM32CubeMX中配置IIC。
1.2 实验设备
STM32F4控制板,OLED模块
1.3 相关知识点
用于实验的设备原理图如下:
OLED:OLED是有机发光二极管的简称,OLED 由于同时具有自发光、不需要背光源、对比度高、厚度薄、视角广、反应速度快、构造及制作过程较简单等优点,得到了广泛应用。本节课我们使用的OLED 模块为0.96寸的,分辨率为12864,使用IIC接口方式,只需要两根线就可以控制OLED。通俗的来说,分辨率12864可以看成整个屏幕由12864个LED组成,整个屏幕通过每个LED的亮灭组合形成指定的图案。
IIC: IIC(Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线 SDA 和时钟线 SCL 构成的串行总线,可发送和接收数据。在 CPU 与被控 IC 之间、IC 与 IC 之间进行双向传送,高速 IIC 总线一般可达 400kbps 以上。I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。
结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据。CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,判断为受控单元出现故障。IIC 总线时序图如下图所示。
IIC使用时又分为硬件IIC和软件IIC,硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的;软件I2C一般是用GPIO管脚,用软件控制管脚状态以模拟I2C通信波形。硬件I2C的效率要远高于软件的,而软件I2C由于不受管脚限制,接口比较灵活。软件I2C 是通过GPIO,软件模拟寄存器的工作方式,而硬件(固件)I2C是直接调用内部寄存器进行配置。
SSD1306:SSD1306是OLED模块上采用的驱动IC芯片。SSD1306 的每页包含了128个字节,总共8页,这样刚好是12864的点阵大小。SSD1306的命令很多,下面简单介绍几个命令。(更多指令可以查看SSD1306的指令表)
0XAE/0XAF命令,0XAE 为关闭显示命令;0XAF 为开启显示命令。
0X8D命令,该指令包含 2 个字节,第一个为命令字,第二个为设置值,第二个字节的 BIT2 表示电荷泵的开关状态,该位为 1,则开启电荷泵,为 0 则关闭。在模块初始化的时候,这个必须要开启,否则是看不到屏幕显示的。 0X81,用于设置对比度的,这个命令包含了两个字节,第一个 0X81 为命令,随后发送的一个字节为要设置的对比度的值。这个值设置得越大屏幕就越亮。 当我们向其中写入这些命令时,就可以控制OLED的状态。ASCII码:在计算机中,所有的数据在存储和运算时都要使用二进制数表示,例如,像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号,例如*、#、@等在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,每个人都可以约定自己的一套(编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。标准ASCII码也叫基础ASCII码,大致可以分作两部分組成。第一部分是:ASCII非打印控制字符,0~31及127(共33个)是控制字符或通信专用字符。 第二部分是:ASCII打印字符;32–126 为可显示字符,总共有 95 个,从空格符开始,
分别为!"#$%&’()+,-0123456789:;<= >?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~
因为我们要将字符在屏幕上显示出来,所以0-31由于无法打印,我们只能选择打印32-126的打印字符来显示。32代表的是空格键,这也是为什么我们在下方显示字符的程序中第一句就是c=chr-’ '。
有了字符,我们还需要这些字符集的点阵数据,这需要一些取模工具来完成。字符文件里采用的取模方式是阴码、列行式、逆向、C51格式。从第一列开始向下每取 8 个点作为一个字节。取模顺序是从低到高,即第一个点作为最低位。从上往下,从左往右,然后再从上往下从左往右。然后把 ASCII 字符集按 816大小、8*6大小取模出来,保存在 oledfont.h 里面。取完模之后,我们就可以根据取模的方式来编写显示字符的代码了。
1.4 实验内容
将OLED 模块连接在PB6与PB7所在的端口上。打开STM32CubeMx,配置好SYS和RCC,然后将PB6配置为I2C1_SCL,PB7配置为I2C1_SDA,然后在左侧I2C1选项中使能I2C,配置如下。
完成这些后生成工程文件,在keil5中打开。并向工程中添加oled.c、oled.h、oledfont.h文件。这几个文件用来存放OLED相关的驱动函数以及字库等。
在oled.c文件的开头我们可以看见WriteCmd()函数WriteDat()函数,可以看到其中都调用了HAL_I2C_Mem_Write()函数,这就是在STM32CubeMx配置I2C的用处,不用通过自己研究时序图,也可以直接用I2C协议向IC芯片中写入数据。
由于代码较多,只讲几个比较重要的函数。
OLED_Init()
主要是一些初始化序列,我们按照厂家提供的资料来做就可以。因为 OLED 是无背光的,在初始化之后,显存都已经被清空了,所以在屏幕上是看不到任何内容的,跟没通电一个样,并不代表初始化失败,要写入数据模块才会显示的。
OLED_ShowChar()
该函数是字符显示函数,也是字符串显示函数的基础。
第一句c=chr-’ ’
已经在ASCII介绍部分中讲解过了,在oledfont.h文件我们可以发现字符数组是从空格字符开始的。if(x>128-1){x=0;y=y+2;}判断要显示的位置是否越界,如果越界,自动重新定义一个位置进行显示。if(Char_Size ==16)判断字符显示的大小,是按照 816还是86的大小来显示。如果是816大小,则首先调用OLED_SetPos(x,y)函数设置起点坐标,然后用for循环,将前八个字节开始从左往右将字节写入。因为取模方式采用的是列行式,所以再调用OLED_SetPos(x,y+1)函数重新开始将剩下八个字节从左往右依次写入。如果是86大小,则直接将六个字节从左往右写入即可。
回到main.c文件,首先引用oled.h头文件,然后在主函数main()中添加如下代码:
OLED_ShowCN()函数用来显示汉字,第一个参数是x坐标,第二个参数是y坐标,第三个参数是所要显示的汉字在oledfont.h文件中的F16x16[]数组中是第几个元素。
1.5实验结果
通过烧录器将程序下载进去以后,可以看到OLED屏幕上显示出你好世界四个字。
1.6总结
本节实验学习了如何控制OLED使之显示想要显示的字符汉字等,不仅如此,OLED屏幕还可以显示图片。实验中用到的I2C总线也是一个重点,相对于SPI总线,I2C只需要两根信号线就可以完成通讯,但在通信速度上要比SPI慢很多。两者都是比较常用的总线。
以上是关于STM32F405RG开发板控制OLED显示屏的主要内容,如果未能解决你的问题,请参考以下文章
基于STM32F103C8T6最小系统板HAL库CubeMX SPI驱动7针 OLED显示屏(0.96寸 1.3寸通用)
基于STM32F103C8T6最小系统板HAL库CubeMX SPI驱动7针 OLED显示屏(0.96寸 1.3寸通用)