资讯详情

STM32—4线SPI驱动SSD1306 OLED

文章目录

  • 一.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 

标签: 72种1206电阻包

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台