打印
[其他ST产品]

STM32驱动0.96寸OLED液晶屏

[复制链接]
795|35
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lxs0026|  楼主 | 2023-8-25 15:59 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
一、OLED简述
1.OLED模块简介
OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。

LCD都需要背光,而OLED不需要,因为它是自发光的。这样同样的显示,OLED效果要来得好一些。OLED的尺寸难以大型化,但是分辨率确可以做到很高。

使用特权

评论回复
评论
lxs0026 2023-8-25 15:59 回复TA
———————————————— 版权声明:本文为CSDN博主「山妖的阶梯」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_51086303/article/details/121554642 
沙发
lxs0026|  楼主 | 2023-8-25 16:10 | 只看该作者

使用特权

评论回复
板凳
lxs0026|  楼主 | 2023-8-25 16:10 | 只看该作者

使用特权

评论回复
地板
lxs0026|  楼主 | 2023-8-25 16:11 | 只看该作者
2.SSD1306控制芯片驱动
我们以STM32单片机为例,使用5个GPIO模拟SPI总线与SSD1306总线进行通讯。因为STM32与OLED屏的通讯只是单向数据传输,即只存在STM32向OLED屏发送数据,不涉及到读取返回数据,所以我们要实现显示功能之前,需要根据SPI写操作时序图,先实现一个向SSD1306写入一个字节的函数实现。

使用特权

评论回复
5
lxs0026|  楼主 | 2023-8-25 16:12 | 只看该作者

使用特权

评论回复
6
lxs0026|  楼主 | 2023-8-25 16:13 | 只看该作者
封装一个向SSD1306写入一个字节的函数,
函数原型为:
void OLED_WR_Byte(uint8_t dat,uint8_t cmd);

使用特权

评论回复
7
lxs0026|  楼主 | 2023-8-25 16:13 | 只看该作者
其中:
dat为待写入的数据或者命令;
cmd为数据或命令标志,0表示命令;1表示数据。

由上面SPI操作的时序图可知,IO引脚的时序如下所示:
①首选看发送的字节是命令还是数据,如果是命令,OLED_DC(D/C)引脚置0,即低电平;如果是数据,OLED_DC(D/C)引脚置1,即高电平。

使用特权

评论回复
8
lxs0026|  楼主 | 2023-8-25 16:13 | 只看该作者
其中:
dat为待写入的数据或者命令;
cmd为数据或命令标志,0表示命令;1表示数据。

由上面SPI操作的时序图可知,IO引脚的时序如下所示:
①首选看发送的字节是命令还是数据,如果是命令,OLED_DC(D/C)引脚置0,即低电平;如果是数据,OLED_DC(D/C)引脚置1,即高电平。

使用特权

评论回复
9
lxs0026|  楼主 | 2023-8-25 16:14 | 只看该作者
if(cmd)    
OLED_DC_Set();
else   
OLED_DC_Clr();   

使用特权

评论回复
10
lxs0026|  楼主 | 2023-8-25 16:14 | 只看该作者
②片选OLED_CS(CS)引脚置0,即拉低(硬件电路中CS引脚也可以直接与GND相连,这样就不用操作CS引脚了)。

使用特权

评论回复
11
lxs0026|  楼主 | 2023-8-25 16:14 | 只看该作者
OLED_CS_Clr();

使用特权

评论回复
12
lxs0026|  楼主 | 2023-8-25 16:14 | 只看该作者
③1个字节的数据有8位,将8位数据由高到低的顺序发出,数据要在OLED_SCLK(D0)引脚的上升沿之前设置好,所以要先将OLED_SCLK(D0)置低,然后将一位数据送至OLED_SDIN(D1)引脚,然后将OLED_SCLK(D0)置高,这样一位数据就发送出去了,如此循环8次,一个字节的数据就发送出去了。

使用特权

评论回复
13
lxs0026|  楼主 | 2023-8-25 16:14 | 只看该作者
for(i=0;i<8;i++)
{                             
OLED_SCLK_Clr();   
if(dat&0x80)      
    OLED_SDIN_Set();   
  else     
     OLED_SDIN_Clr();
     OLED_SCLK_Set();  
      dat<<=1;  
}

使用特权

评论回复
14
lxs0026|  楼主 | 2023-8-25 16:14 | 只看该作者
④8位数据发送完毕之后,将OLED_CS(CS)引脚拉高,即置1,恢复至初始状态。

使用特权

评论回复
15
lxs0026|  楼主 | 2023-8-25 16:14 | 只看该作者
OLED_CS_Set();
OLED_CS_Set();
OLED_DC_Set();

使用特权

评论回复
16
lxs0026|  楼主 | 2023-8-25 16:15 | 只看该作者
3.如何显示字符
在初始化OLED之后,如何在屏幕上显示字符呢?
在这之前,先了解一下SSD1306内部的RAM;SSD1306内部有个SRAM称为GDDRAM(Graphic Display Data RAM),大小是128 × 64 bits,被分为8个 PAGE,用于单色128×64点阵显示,当我们往这个RAM写入数据,就会显示特定内容,
如图:

使用特权

评论回复
17
lxs0026|  楼主 | 2023-8-25 16:15 | 只看该作者
上面’COL’的含义是GDDRAM列(column)

使用特权

评论回复
18
lxs0026|  楼主 | 2023-8-25 16:15 | 只看该作者
在页寻址模式下,每当对RAM进行读写操作之后,列地址指针会自动+1,直到列地址指针指向列结束地址后,会重新指向列开始地址;而且在该模式下,一定要设置新的页面和列地址才能访问下一个页面的内容,所以设置显示字符之前一般都会调用下面几句语句来确定显示位置:

使用特权

评论回复
19
lxs0026|  楼主 | 2023-8-25 16:15 | 只看该作者
OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址封装设置

使用特权

评论回复
20
lxs0026|  楼主 | 2023-8-25 16:16 | 只看该作者
显示位置的函数如下:
void OLED_Set_Pos(unsigned char x, unsigned char y) 
{        
OLED_WR_Byte(0xb0+y,OLED_CMD);        
OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);        OLED_WR_Byte((x&0x0f)|0x01,OLED_CMD);
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

88

主题

1049

帖子

1

粉丝