【STM32系列文章】
STM32-01-认识单片机
STM32-02-基础知识
STM32-03-HAL库
STM32-04-时钟树
STM32-05-SYSTEM文件夹
STM32-06-GPIO
STM32-07-外部中断
STM32-08-串口
STM32-09-IWDG和WWDG
STM32-10-定时器
STM32-11-电容触摸按键
STM32-12-OLED模块
STM32-13-MPU
STM32-14-FSMC_LCD
STM32-15-DMA
STM32-16-ADC
STM32-17-DAC
1. OLED显示屏介绍
-
OLED的简介
OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display,OLED)。OLED可按发光材料分为两种:小分子OLED和高分子 OLED(也可称为PLED)。OLED是一种利用多层有机薄膜结构产生电致发光的器件,它很容易制作,而且只需要低的驱动电压,OLED由于同时具备自发光(不需背光源)、对比度高、厚度薄、视角广、反应速度快、功耗低、柔性好等优异特性,目前主要用于显示领域,OLED在节能照明领域的开发也成为全球趋势。
-
优点:
- 自发光:OLED每个像素点都是自发光的,不需要额外的背光源,因此具有更高的发光效率。
- 低功耗: 因为OLED只在需要的像素点发光,而不需要像LCD那样通过背光光源进行筛选,所以在显示暗色画面时可以大幅降低功耗,节能环保。
- 高对比度: OLED屏幕具有极高的对比度,因为黑色像素可以完全关闭,而白色像素可以发出非常亮的光,这使得OLED屏幕在显示深色和亮色之间的差异更加清晰,色彩更加鲜艳。
-
缺点:
- 烧屏:长时间显示相同的图像会导致该图像在屏幕上留下痕迹,即所谓的“烧屏”现象。这在某些情况下可能会降低显示屏的寿命 。
- 价格昂贵:由于制造成本较高,OLED显示屏通常比LCD屏幕更昂贵,这使得它在某些应用领域的普及受到一定限制。
- 低频频闪:一些OLED显示屏在低亮度下可能存在频闪问题,可能会引起一些用户的不适 。
-
应用场景:
- 手机/平板电脑:由于OLED显示屏的薄、轻、灵活等特点,它被广泛应用于高端智能手机和平板电脑的显示屏上。
- 电视:OLED电视具有出色的画质表现,逐渐成为高端电视市场的主流产品之一。
- 手表/手环:OLED显示屏由于其小尺寸、低功耗等特点,被广泛应用于智能手表、智能手环等可穿戴设备上。
-
ATK_OLED模块的简介
-
特点:
-
尺寸和分辨率:该模块尺寸较小,为0.96英寸,分辨率为128×64像素,适合于一些对显示尺寸要求较小的场景。
-
高亮度:模块具有高亮度的特点,能够在不同环境下清晰显示内容。
-
集成升压电路:内部集成了DCDC升压电路,只需3.3V的供电就可以正常工作,简化了外部电路设计。
-
驱动IC:采用了SSD1306驱动IC,该驱动IC具有稳定性好、兼容性强的特点,可以保证模块的稳定性和可靠性。
-
通信接口:支持多种通信接口,包括8位6800并口、8位8080并口、4线SPI以及IIC等四种方式,可以根据实际需求选择合适的接口进行通信。
-
接口配置:通过BS1和BS2引脚的配置,可以选择不同的通信接口方式,具体配置如下:
-
-
-
引脚说明
拥有
8
个数据引脚和5
个控制引脚。
- CS(Chip Select):OLED片选信号,用于选择OLED模块,低电平有效。
- WR(Write):向OLED写入数据的控制信号。
- RD(Read):向OLED读取数据的控制信号。
- RST(Reset):硬复位OLED模块的控制信号,低电平有效,用于将OLED模块复位到初始状态。
- DC(Data/Command):数据/命令标志线,用于区分发送的是数据还是命令。当DC为低电平时,表示发送的是命令;当DC为高电平时,表示发送的是数据。
- D[7:0]:8位双向数据线,用于传输数据。
-
OLED模块硬件连接图
分类 CS RD WR D[7:0] RST DC MINI板 PC9 PC6 PC7 PB0~PB7 NRST PC8 精英板 PD6 PG13 PG14 PC0~7 PG15 PD3 战舰板 PD6 PG13 PG14 PC0~7 PG15 PD3
2. OLED驱动原理
- 驱动芯片选择:选择适合的OLED驱动芯片是驱动OLED屏的第一步。常用的OLED驱动芯片包括SSD1306、SSD1351、SH1106等,根据需要选择合适的驱动芯片。
- 时序控制:根据所选的驱动芯片的通信接口(如8080时序、6800时序、SPI、I2C等),实现相应的时序控制。这包括控制数据/命令信号、写入数据、读取数据等操作的时序要求。
- 初始化序列:每款OLED屏都有自己的初始化序列,用于初始化屏幕的各种参数和设置。这个序列一般由OLED屏厂家提供,需要在驱动程序中正确执行,以确保屏幕正常工作。
- 绘图功能实现:通过画点函数和读点函数来实现对屏幕上的像素点进行操作。画点函数用于向屏幕指定位置写入像素点的颜色,而读点函数则用于读取屏幕上指定位置的像素点的颜色信息。基于这两个函数,可以实现各种图形绘制、文字显示等功能。
-
SSD1306工作时序
具体代码实现:
oled_wr_byte()
用于向SSD1306写入一个字节的数据或命令。根据传入的cmd
参数决定是写入数据还是写入命令。void oled_wr_byte(uint8_t data, uint8_t cmd) { OLED_RS (cmd); /* 数据类型,由传参决定,此处设置为1,表示写数据 */ OLED_CS ( 0 ); /* 拉低片选线,选中SSD1306 */ OLED_WR ( 0 ); /* 拉低WR线,准备数据 */ oled_data_out(data); /* WR低电平期间,准备数据 */ OLED_WR ( 1 ); /* 在WR上升沿,数据发出 */ OLED_CS ( 1 ); /* 取消片选 */ OLED_RS ( 1 ); /* 释放RS线,恢复默认 */ }
oled_data_out()
用于将数据写入到数据端口(D[7:0])。在这个函数中,首先读取GPIOC的输出数据寄存器(ODR),然后根据掩码操作将低8位清零,再将传入的数据(data)的低8位与之前的高8位进行或运算,最终将结果写入到GPIOC的输出数据寄存器中,即完成了数据的输出操作。void oled_data_out(uint8_t data) { GPIOC->ODR = (GPIOC->ODR & 0XFF00) | (data & 0X00FF); }
读时序的过程:
- 设置 DC 为高(数据)/低(命令);
- 拉低片选 CS 信号,选中 SSD1306;
- 设置 RD 起始电平为低;
- 设置 RD 为高电平,读取数据;
- CS设置为1,释放CS;
- DC设置为1,释放DC引脚,恢复默认。
3. OLED驱动芯片简介
-
OLED驱动芯片用于控制OLED的显示功能和效果。SSD1306指令比较多,这里介绍常用的命令。
指令(HEX) 各位描述 名称 说明 D7 D6 D5 D4 D3 D2 D1 D0 0xAE/0xAF 1 0 1 0 1 1 1 X0 设置显示开关 X0 = 0,关闭显示 X0 = 1,开启显示 0xB0~0xB7 1 0 1 1 0 X2 X1 X0 设置页地址 X[2:0]:0-7对应页0-7 0x00~0x0F 0 0 0 0 X3 X2 X1 X0 设置列地址(L4) 设置8位列地址的低四位 0x10~0x1F 0 0 0 1 X3 X2 X1 X0 设置列地址(H4) 设置8位列地址的高四位 OLED驱动芯片(如SSD1306)是用于控制OLED显示屏的关键组件,它负责管理显示的内容、亮度、对比度等参数,并将数据传输到OLED屏幕上以实现图像或文本的显示。
-
常用命令:
- 0xAE / 0xAF - 设置显示开关:
D7
:控制GRAM的写入位置,通常为1。D6
:控制显示开关。X0
:0为关闭显示,1为开启显示。- 0xB0 ~ 0xB7 - 设置页地址:
X2
,X1
,X0
:设置页地址,范围通常为07,对应页07。- 0x00 ~ 0x0F - 设置列地址(L4):
X3
,X2
,X1
,X0
:设置8位列地址的高四位。- 0x10 ~ 0x1F - 设置列地址(L4):
X3
,X2
,X1
,X0
:设置8位列地址的高四位。
-
-
什么是GRAM:
GRAM是图形显示数据RAM(Graphic Display Data RAM)的缩写,用于存储要在显示屏上显示的图像或文本的位模式数据。它是一块位映射的静态RAM,大小为128×64位,可以分为8页,每页对应显示屏的一行像素。GRAM保存的数据决定了OLED显示屏上每个像素点的状态,从而实现图像或文本的显示。
-
什么是页地址模式:
- 发送内存地址模式命令(0x20):这个命令用于设置内存地址模式,以便指定将要发送的地址模式类型。
- 发送页地址模式命令(0x02):这个命令用于选择页地址模式。一旦设置了页地址模式,后续的操作将按照页地址模式进行。
-
解决显示覆盖:
实现代码:
static uint8_t g_oled_gram[128][8]; /* OLED的显存 */ void oled_refresh_gram(void) { uint8_t i,n; for (i = 0; i < 8; i++) { oled_wr_byte(0xb0 + i, OLED_CMD) ; /* 设置页地址(0~7)*/ oled_wr_byte(0x00, OLED_CMD) ; /* 设置显示位置-列低地址 */ oled_wr_byte(0x10, OLED_CMD) ;