OLED学习笔记1

看了同学对OLED的讲解,感觉还是蛮有意思呢,在我自己进一步搞之前(往esp32和python转),先对同学所讲知识作以汇总,一下内容大多取于同学的笔记,感谢详细讲解。

OLED的基础介绍

OLED的定义

OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。

OLED的优势

(1)OLED显示技术具有自发光的特性,采用非常薄的有机材料涂层和玻璃基板,当有电流通过时,这些有机材料就会发光,而且OLED显示屏幕可视角度大,并且能够节省电能,从2003年开始这种显示设备在MP3播放器上得到了应用。

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

OLED 采用的二极管会自行发光,因此不需要背面光源,发光转化效率高,能耗比液晶低,OLED 能够在不同材质的基板上制造,厂家甚至可以将电路印刷在弹性材料上——做成能弯曲的柔软显示器。

主动发光的特性使 OLED 几乎没有视角限制,视角一般可达到 170 度,具有较宽的视角,从侧面也不会失真。

OLED 采用有机发光原理,所需材料很少,制作上比采用液体发光的液晶工序少,液晶显示屏少 3 道工序,成本大幅降低。

(2)OLED 器件为全固态机构,无真空,液体物质,抗震性好,可以适应巨大的加速度,振动等恶劣环境。

(3)OLED 显示屏的响应时间超过 TFT—LCD 液晶屏。TFT—LCD 的响应时间大约使几十毫秒,现在做得最好的 TFT—LCD 响应时间也只有 12 毫秒。而 OLED 显示屏的响应时间大约是几微秒到几十微秒。

(4)OLED 低温特性好,在零下 40 摄氏度都能正常显示,目前航天服上也使用OLED 作为显示屏。而 TFT—LCD 的响应速度随温度发生变化,低温下,其响应速度变慢,因此,液晶在低温下显示效果不好。

(5)OLED 器件的核心层厚度很薄,厚度可以小于 1mm,为液晶的 1/3。

ALINETEK的0.96寸OLED模块

(1)模块有单色和双色两种可选,单色为纯蓝色,而双色则为黄蓝双色。单色模块每个像素点只有亮与不亮两种情况,没有颜色区分;

(2)尺寸小,显示尺寸为0.96寸,而模块的尺寸仅为27mm乘26mm大小;
高分辨率,该模块的分辨率为128*64,即OLED显示是128行64列;

(3)多种接口方式,该模块提供了总共4种接口包括:6800、8080两种并行接口方式、 4线的穿行SPI接口方式、IIC接口方式;

(4)不需要高压,直接接3.3V就可以工作了。

I2C

I2C通信

它是由数据线 SDA 和时钟 SCL 构成的串行总线, 可发送和接收数据。在 CPU 与被控 I2C 之间、I2C 与 I2C 之间进行双向传送。
IIC总线进行数据传送时,时钟信号为高电平期间,数据线的数据必须保持稳定,只有在时钟信号为低电平期间,数据线上的高电平或低电平状态才允许变化。

开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。

结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。

应答信号: 接收数据的I2C 在接收到 8bit 数据后, 向发送数据的 I2C 发出特定的低电平脉冲,表示已收到数据。CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。

I2C接口:

GND: 电源地
VCC: 2.2V~5.5V
D/C:数据/命令,在 IIC 通信中 DC的高低电平是用来选择IIC通信地址的(0,读写命令;1,读写数据)
RES(RST):复位(高电平 2.2V~5.5V)
SCL: CLK 时钟 (高电平 2.2V~5.5V)
SDA: MOSI 数据 (高电平 2.2V~5.5V)
CS:OLED片选信号
WR:向OLED写入数据
RD:从OLED读取数据
D[7:0]:8位双向数据线

OLED模块显存

OLED本身是没有显存的,它的显存是依赖于SSD1306提供的(有一个TFTLCD是本身自带显存,利用FSMC来进行控制)。而SSD1306提供一块显存,芯片具体的讲解见下文。

SSD1306的显存总共为12864bit大小,SSD1306将这些显存分为了8页。每页包含了128个字节,总共8页,这样刚好是12864的点阵大小。
在这里插入图片描述
水平方向分布了128个像素点,垂直方向分布了64个像素点,而驱动芯片在点亮像素点的时候,是以8个像素点为单位的。推荐的是垂直扫描的方式,也就是先画垂直方向的8个像素点,所以我们在画点的时候Y的取值为0-7,X的取值为0-127。所以在设置取模方式是选择列行式,垂直扫描,页设置为0-7。

OLED的显存存放格式如下.

   Y
 X  [0]0 1 2 3 ... 127 
    [1]0 1 2 3 ... 127 
    [2]0 1 2 3 ... 127 
    [3]0 1 2 3 ... 127 
    [4]0 1 2 3 ... 127 
    [5]0 1 2 3 ... 127 
    [6]0 1 2 3 ... 127 
    [7]0 1 2 3 ... 127 

OLED点阵与常规的LCD点阵的显示方式相同(列行式,先列后行),从第一列开始向下取8个点作为一个字节,然后从第二列开始向下取,8个点作为第二个字节…依此类推。取模顺序是从低高,即第一个点作为最低位。如图显示一行数据的图解。
在这里插入图片描述

程序显示原理

在单片机的内部建立一个缓存(共128*8个字节),在每次修改的时候,只是修改单片机上的缓存(实际上就是SRAM),在修改完了之后,一次性把单片机上的缓存数据写入到OLED的GRAM。当然这个方法也有坏处,就是对于那些SRAM很小的单片机(比如51系列)就比较麻烦了。

SSD1306芯片

SSD1306芯片简介

SSD1306是一个单片CMOS、OLED/PLED驱动芯片可以驱动有机/聚合发光二极管点阵图形显示系统。由128 segments 和64 Commons组成。该芯片专为共阴极OLED面板设计。

SSD1306中嵌入了对比度控制器、显示RAM和晶振,并因此减少了外部器件和功耗。有256级亮度控制。数据/命令的发送有三种接口可选择:6800/8000串口,I2C接口或SPI接口。适用于多数简介的应用,注入移动电话的屏显,MP3播放器和计算器等。

SSD1306芯片特性

(1)分辨率:128 * 64 点阵面板

(2)电源
VDD = 1.65V to 3.3V,用于I2C逻辑;
VCC = 7V to 15V,用于面板驱动;

(3)点阵显示

OLED驱动输出电压,最大15V;
Segment最大电流:100uA;
常见最大反向电流:15mA;
256级对比亮度电流控制;

(4)嵌入式128 * 64位SRAM显示缓存

(5)引脚选择MCU接口

8位6800/8000串口;
3/4线SPI接口;
I2C接口。

SSD1306芯片命令

在这里插入图片描述

命令0X81:设置对比度。包含两个字节,第一个0X81为命令,随后发送的一个字节为要设置的对比度的值。这个值设置得越大屏幕就越亮。

命令0XAE/0XAF:0XAE为关闭显示命令;0XAF为开启显示命令。

命令0X8D:包含2个字节,第一个为命令字,第二个为设置值,第二个字节的BIT2表示电荷泵的开关状态,该位为1,则开启电荷泵,为0则关闭。在模块初始化的时候,这个必须要开启,否则是看不到屏幕显示的。

命令0XB0~B7:用于设置页地址,其低三位的值对应着GRAM的页地址。

命令0X00~0X0F:用于设置显示时的起始列地址低四位。

命令0X10~0X1F:用于设置显示时的起始列地址高四位。

例程

显示0~9 ,A ~Z, a ~z
对于OLED 的显示用字模软件取值

#include<reg51.h>
#include<intrins.h>
sbit _CS=P3^4;
sbit RES=P3^3;
sbit DC=P3^2;
sbit SCL=P2^1;
sbit SDA=P2^0;
unsigned char code initial_tab[23]={
0xae,0x40,0x20,0x02,0x81,0xff,0xa1,0xa4,
0xA6,0xc8,0xa8,0x3F,0xd5,0x80,0xd3,0x00,
0x8d,0x14,0xdb,0x40,0xd9,0xf1,0xAF,
         };
unsigned char code picture_tab[]={
0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,// 0
0x00, 0x00, 0x42, 0x7F, 0x40, 0x00,// 1
0x00, 0x42, 0x61, 0x51, 0x49, 0x46,// 2
0x00, 0x21, 0x41, 0x45, 0x4B, 0x31,// 3
0x00, 0x18, 0x14, 0x12, 0x7F, 0x10,// 4
0x00, 0x27, 0x45, 0x45, 0x45, 0x39,// 5
0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,// 6
0x00, 0x01, 0x71, 0x09, 0x05, 0x03,// 7
0x00, 0x36, 0x49, 0x49, 0x49, 0x36,// 8
0x00, 0x06, 0x49, 0x49, 0x29, 0x1E,// 9
0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,// A
0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,// B
0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,// C
0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,// D
0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,// E
0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,// F
0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,// G
0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,// H
0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,// I
0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,// J
0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,// K
0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,// L
0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,// M
0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,// N
0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,// O
0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,// P
0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q
0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,// R
0x00, 0x46, 0x49, 0x49, 0x49, 0x31,// S
0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,// T
0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,// U
0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,// V
0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,// W
0x00, 0x63, 0x14, 0x08, 0x14, 0x63,// X
0x00, 0x07, 0x08, 0x70, 0x08, 0x07,// Y
0x00, 0x61, 0x51, 0x49, 0x45, 0x43,// Z
0x00, 0x20, 0x54, 0x54, 0x54, 0x78,// a
0x00, 0x7F, 0x48, 0x44, 0x44, 0x38,// b
0x00, 0x38, 0x44, 0x44, 0x44, 0x20,// c
0x00, 0x38, 0x44, 0x44, 0x48, 0x7F,// d
0x00, 0x38, 0x54, 0x54, 0x54, 0x18,// e
0x00, 0x08, 0x7E, 0x09, 0x01, 0x02,// f
0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,// g
0x00, 0x7F, 0x08, 0x04, 0x04, 0x78,// h
0x00, 0x00, 0x44, 0x7D, 0x40, 0x00,// i
0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,// j
0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,// k
0x00, 0x00, 0x41, 0x7F, 0x40, 0x00,// l
0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,// m
0x00, 0x7C, 0x08, 0x04, 0x04, 0x78,// n
0x00, 0x38, 0x44, 0x44, 0x44, 0x38,// o
0x00, 0xFC, 0x24, 0x24, 0x24, 0x18,// p
0x00, 0x18, 0x24, 0x24, 0x18, 0xFC,// q
0x00, 0x7C, 0x08, 0x04, 0x04, 0x08,// r
0x00, 0x48, 0x54, 0x54, 0x54, 0x20,// s
0x00, 0x04, 0x3F, 0x44, 0x40, 0x20,// t
0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C,// u
0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,// v
0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C,// w
0x00, 0x44, 0x28, 0x10, 0x28, 0x44,// x
0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,// y
0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,// z
0x14, 0x14, 0x14, 0x14, 0x14, 0x14,// horiz lines
};         
void Ins_trans(unsigned char command)      //写命令
  { 
    unsigned char counter;
   _CS=0;
   DC=0;
    for(counter=0;counter<8;counter++)   //发送八位数据
       { 
      SCL=0;
         SDA=(command&0x80)>>7;
         command=command<<1;
        _nop_();
       SCL=1;
      //  _nop_();
       _nop_();
       SCL=0;
        }
 DC=1;
   _CS=1;
  }
  
  void Data_trans(unsigned char command)  //写数据
  { 
    unsigned char counter;
   _CS=0;
   DC=1;
    for(counter=0;counter<8;counter++)//发送八位数据
       {
         SCL=0;
      SDA=(command&0x80)>>7;
   command=command<<1;   
        _nop_();
       SCL=1;
       // _nop_();
       _nop_();
       SCL=0;
       }
DC=1;
   _CS=1;
   }
   void Column_set(unsigned char column)//设置列
          {
       Ins_trans(0x10|(column>>4));
       Ins_trans(0x00|(column&0x0f));  
    }
void Page_set(unsigned char page)/设置行
             {
      Ins_trans(0xb0+page);
       }
void Screen_clear()//oled复位
          {
      unsigned char page,column;
     for(page=0;page<8;page++)             //行循环
       { 
      Page_set(page);
      Column_set(0);   
      for(column=0;column<128;column++) //列循环
         {
         Data_trans(0x00);
        }
      }
      }
void Screen_check() //oled全屏
       {
      unsigned char page,column;
     for(page=0;page<8;page++)             //行循环
       { 
      Page_set(page);
      Column_set(0);   
      for(column=0;column<128;column++) //列循环
         {
         Data_trans(0xff);
        }
      }
      }
void Initial()
		 {
      unsigned char i;
   for(i=0;i<23;i++)
      {
        Ins_trans(initial_tab[i]);
      } 
		     }
     void Picture_display(unsigned char *ptr_pic)
        {
    unsigned char page,column;
    //Ins_trans(0x81);
    //Ins_trans(0x1F);
     for(page=0;page<(64/8);page++)       //行循环
       { 
      Page_set(page);
      Column_set(0);   
      for(column=0;column<128;column++) //列循环
         {
         Data_trans(*ptr_pic++);
      }
    }
    Delay(15);
  }
  void main()
  { 
    RES=0;
    Delay(10);
    RES=1;
    Initial();
    while(1)
       {
                Screen_clear();
    Screen_check();
                Delay(10);
       Picture_display(picture_tab);
    }
  }  
  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值