文章目录
- 一.OLED简介
- 二.驱动SSD1306所需知识
-
- 1.引脚介绍
- 2.通信时序
- 3.显存GRAM
- 4.字库
- 5.SSD1306基本命令
- 三.代码讲解
-
- 1.相关引脚配置
- 2.模拟SPI通信
- 3.OLED初始化函数
- 4.图像刷新和清屏函数
- 5.画点函数
- 6.显示字符函数
- 7.显示字符串函数
- 8.显示特殊图像
一.OLED简介
OLED,即有机发光二极管(Organic Light-Emitting Diode),也叫有机电激光显示(OrganicElectroluminesence Display, OELD)。 OLED 由于具有自发光、无背光源、对比度高、厚度薄、视角广、反应速度快、柔性面板、使用温度范围广、结构简单、工艺简单等优良特点,被认为是下一代平面显示器的新兴应用技术。 模块特点:
- 没有背光,需要通过写入指令来打开显示
- 尺寸小:0.96寸,分辨率高:128*64
- 6800、8080、3线/4线提供多种通信接口SPI、IIC
- 供电3.3V
只需更改模块背后的电阻位置即可,如下: 我是使用4线SPI驱动OLED的。
二.驱动SSD1306所需知识
1.引脚介绍
如图所示,各引脚的介绍如下:
- GND:接地引脚
- VCC:接电源引脚,接3.3V直流电源
- D0:SPI的时钟线SCLK
- D1:SPI的数据线SDIN
- RES:复位接口,低电平初始化(复位),正常时高电平
- DC:选择命令or数据、低电平命令、高电平数据
- CS:片选线
注意:4线SPI只能写,不能读! 对应的接口如下:
SCLK:PC0 D0 SDIN:PC1 D1 RES :PG15 初始化(复位)在拉低时拉高 DC :PD3 (0:命令 1:数据) CS :PD6
2.通信时序
单片机与OLED通信是4线SPI,每个数据长度为8位,在SCLK上升沿数据有效,上升沿数据从SDIN移入SSD1306,高位先行,D/C用明是传输命令还是数据。其通信时序图如下: 由图知,SSD1306与单片机通信可分为以下步骤: 1.拉低片选CS,作为正常通信的前提 2.根据需要操作D/C,低电平代表传输命令,高电平代表传输数据 3.时钟线SCLK不断产生时钟信号,沿数据线有效上升 4.数据线SDIN根据SCLK一帧数据(8位)从高位传输,高位代表1,低代表0
3.显存GRAM
在OLED图像显示在上面,图像数据存储在显示中GRAM中,由于SSD1306的分辨率是128*64代表屏幕共有128x64个像素点,其显存大小为128x64bit,可以存储一帧图像的信息。 SSD逻辑上,1306GRAM每页包含128个字节(1个字节8位),即8页x128x8=128x64,所以屏幕上的每个像素点都对应着GRAM每个人,要点亮屏幕上的像素点,只要打开显示,就会GRAM中间的相应位置可以一个。 SSD1306的GRAM屏幕上像素点的对应关系表如下: 以屏幕的左上角为原点,可以想象一对坐标系,屏幕的大小范围是x:0~ 127,y:0~事实上,我们后续的画点也是基于此! 我们用二维数组抽象地映射屏幕上的每个像素点:
/* OLED的显存 */ uint8_t OLED_GRAM[128][8]; /* OLED_GRAM[128][8]8位二进制为单位 其逻辑排序如下:(高位第一) 7 7 6 6 5 5 4 4 ... 3 3 2 2 1 1 0 0 */
在这一点上,我们只需要写下要显示图像的信息OLED_GRAM[128][8]
在数组中,通过画点函数操作OLED_GRAM[128][8]
每个相应的像素点都可以在OLED图像显示在屏幕上。
4.字库
为了在屏幕上显示图像,最常见的是显示一些字符。此时,这些字符的图像信息需要,这涉及到字库。据我所知,包含一些字符图像的数组可以称为字库。其优点是可以根据要显示的字符直接从字库中提取图像信息GRAM,这样显示字符就方便多了。 本项目使用的字库大小为(高x宽):12x6、16x8、24x12 而且字库的取模方式:阴码 逐列式 顺向 C51格式(PC2LCD2002) 每个字符占用的字节数为:(size/8 ((size1:0)%8)*(size/2),其中size:字库生成时的点阵大小 比如12x6字库信息如下:
//12*6 ASCII字符集点阵 const unsigned char asc2_1206[95][12]={ { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/ { 0x00,0x00,0x00,0x00,0x3F,0x40,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/ { 0x00,0x00,0x30,0x00,0x40,0x00,0x30,0x00,0x40,0x00,0x00,0x00},/*""",2*/ { 0x09,0x00,0x0B,0xC0,0x3D,0x00,0x0B,0xC0,0x3D,0x00,0x09,0x00},/*"#",3*/ { 0x18,0xC0,0x24,0x40,0x7F,0xE0,0x22,0x40,0x31,0x80,0x00,0x00},/*"$",4*/ { 0x18,0x00,0x24,0xC0,0x1B,0x00,0x0D,0x80,0x32,0x40,0x01,0x80},/*"%",5*/ { 0x03,0x80,0x1C,0x40,0x27,0x40,0x1C,0x80,0x07,0x40,0x00,0x40},/*"&",6*/ { 0x10,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/ { 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x20,0x40,0x40,0x20},/*"(",8*/ { 0x00,0x00,0x40,0x20,0x20,0x40,0x1F,0x80,0x00,0x00,0x00,0x00},/*")",9*/ { 0x09,0x00,0x06,0x00,0x1F,0x80,0x06,0x00,0x09,0x00,0x00,0x00},/*"*",10*/ { 0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0x00,0x00},/*"+",11*/ { 0x00,0x10,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*",",12*/ { 0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00},/*"-",13*/ { 0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*".",14*/ { 0x00,0x20,0x01,0xC0,0x06,0x00,0x38,0x00,0x40,0x00,0x00,0x00},/*"/",15*/ { 0x1F,0x80,0x20,0x40,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00},/*"0",16*/ { 0x00,0x00,0x10,0x40,0x3F,0xC0,0x00,0x40,0x00,0x00,0x00,0x00},/*"1",17*/ { 0x18,0xC0,0x21,0x40,0x22,0x40,0x24,0x40,0x18,0x40,0x00,0x00},/*"2",18*/ { 0x10,0x80,0x20,0x40,0x24,0x40,0x24,0x40,0x1B,0x80,0x00,0x00},/*"3",19*/ { 0x02,0x00,0x0D,0x00,0x11,0x00,0x3F,0xC0,0x01,0x40,0x00,0x00},/*"4",20*/ { 0x3C,0x80,0x24,0x40,0x24,0x40,0x24,0x40,0x23,0x80,0x00,0x00},/*"5",21*/ { 0x1F,0x80,0x24,0x40,0x24,0x40,0x34,0x40,0x03,0x80,0x00,0x00},/*"6",22*/ { 0x30,0x00,0x20,0x00,0x27,0xC0,0x38,0x00,0x20,0x00,0x00,0x00},/*"7",23*/ { 0x1B,0x80,0x24,0x40,0x24,0x40,0x24,0x40,0x1B,0x80,0x00,0x00},/*"8",24*/ { 0x1C,0x00,0x22,0xC0,0x22,0x40,0x22,0x40,0x1F,0x80,0x00,0x00},/*"9",25*/ { 0x00,0x00,0x00,0x00,0x08,0x40,0x00,0x00,0x00,0x00,0x00,0x00},/*":",26*/ { 0x00,0x00,0x00,0x00,0x04,0x60,0x00,0x00,0x00,0x00,0x00,0x00},/*";",27*/ { 0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0x40,0x40},/*"<",28*/ { 0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x00,0x00},/*"=",29*/ { 0x00,0x00,0x40,0x40,0x20,0x80,0x11,0x00,0x0A,0x00,0x04,0x00},/*">",30*/ { 0x18,0x00,0x20,0x00,0x23,0x40,0x24,0x00,0x18,0x00,0x00,0x00},/*"?",31*/ { 0x1F,0x80,0x20,0x40,0x27,0x40,0x29,0x40,0x1F,0x40,0x00,0x00},/*"@",32*/ { 0x00,0x40,0x07,0xC0,0x39,0x00,0x0F,0x00,0x01,0xC0,0x00,0x40},/*"A",33*/ { 0x20,0x40,0x3F,0xC0,0x24,0x40,0x24,0x40,0x1B,0x80,0x00,0x00},/*"B",34*/ { 0x1F,0x80,0x20,0x40,0x20,0x40,0x20,0x40,0x30,0x80,0x00,0x00},/*"C",35*/ { 0x20,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00},/*"D",36*/ { 0x20,0x40,0x3F,0xC0,0x24,0x40,0x2E,0x40,0x30,0xC0,0x00,0x00},/*"E",37*/ { 0x20,0x40,0x3F,0xC0,0x24,0x40,0x2E,0x00,0x30,0x00,0x00,0x00},/*"F",38*/ { 0x0F,0x00,0x10,0x80,0x20,0x40,0x22,0x40,0x33,0x80,0x02,0x00},/*"G",39*/ { 0x20,0x40,0x3F,0xC0,0x04,0x00,0x04,0x00,0x3F,0xC0,0x20,0x40},/*"H",40*/ { 0x20,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x00,0x00},/*"I",41*/ { 0x00,0x60,0x20,0x20,0x20,0x20,0x3F,0xC0,0x20,0x00,0x20,0x00},/*"J",42*/ { 0x20,0x40,0x3F,0xC0,0x24,0x40,0x0B,0x00,0x30,0xC0,0x20,0x40},/*"K",43*/ { 0x20,0x40,0x3F,0xC0,0x20,0x40,0x00,0x40,0x00,0x40,0x00,0xC0},/*"L",44*/ { 0x3F,0xC0,0x3C,0x00,0x03,0xC0,0x3C,0x00,0x3F,0xC0,0x00,0x00},/*"M",45*/ { 0x20,0x40,0x3F,0xC0,0x0C,0x40,0x23,0x00,0x3F,0xC0,0x20,0x00},/*"N",46*/ { 0x1F,0x80,0x20,0x40,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00},/*"O",47*/ { 0x20,0x40,0x3F,0xC0,0x24,0x40,0x24,0x00,0x18,0x00,0x00,0x00},/*"P",48*/ { 0x1F,0x80,0x21,0x40,0x21,0x40,0x20,0xE0,0x1F,0xA0,0x00,0x00},/*"Q",49*/ { 0x20,0x40,0x3F,0xC0,0x24,0x40,0x26,0x00,0x19,0xC0,0x00,0x40},/*"R",50*/ { 0x18,0xC0,0x24,0x40,0x24,0x40,0x22,0x40,0x31,0x80,0x00,0x00},/*"S",51*/ { 0x30,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x30,0x00,0x00,0x00},/*"T",52*/ { 0x20,0x00,0x3F,0x80,0x00,0x40,0x00,0x40,0x3F,0x80,0x20,0x00},/*"U",53*/ { 0x20,0x00,0x3E,0x00,0x01