指导书

  1. 显示器初始化

  1.1. 显示器复位

  在初始化显示器之前,必须对显示器进行可靠、稳定的复位操作。为了确保显示器处于稳定的状态(不受用户系统状态影响),建议将显示器的复位引脚通过电阻下拉,如图 1-1 所示。

1

  采用此复位控制电路时,显示器默认处于复位状态。在需要对显示器操作时,MCU 需控制复位引脚保持低电平状态至少 20ms,然后切换为高电平状态并保持,以此完成一次复位操作。

  1.2. 显示器 IIC 通讯

  显示器的 IIC 接口为 1.8~3.3V COMS 标准,其通讯地址由 SelAddr0 引脚(默认上拉)的电平状态确定,高电平为 0x1E,低电平为 0x1C;为保证 IIC 通讯正常,建议将 SCL 和SDA 两个信号线通过电阻上拉至 1.8~3.3V,如图 1-2 所示。同时,建议用户使用 MCU 的I/O 口模拟 IIC 进行通讯,速率为 100KHz。

注:针对 SVGA050 显示器,使用 IIC 通讯前,必须先提供像素时钟信号(PCLK)。

  1.3. 初始化流程

  显示器初始化应流程如图 1-3 所示,为保证程序设计的兼容性,要求所有显示器在复位前都需要先提供像素时钟 PCLK 信号。

3

  2. 显示器功能使用

  2.1. 显示亮度调整(以 SVGA 系列为例)

  SVGA 显示器寄存器描述中有两个寄存器涉及到亮度的调整,一个是 08H 寄存器,另一个是 19H 寄存器。

  08H 寄存器调整的是输入 RGB 信号的亮度(信号增益加减控制),如图 2-1 所示,虽然调节此寄存器可以调节亮度,但是效果并不明显,可调范围非常小,还可能因为调整后与信号对比度不匹配而导致画面失真的异常。

4

  而19H 寄存器调整的是OLED共阴极端的电压(Vcom 电压调整),已知 OLED材料的发光效率正比于流过其电流的大小,电流越大,发光效率越高,亮度也越大。由于SVGA 显示器采用了电压驱动的方式,如图2-2所示,若想调整其亮度必须调整其OLED两端的电压,已知阳极电压固定为Van=5V,那么调整共阴极电压Vcom即可实现OLED显示器亮度的调整。

5

  注:Vcom 为负压,亮度变化与 Vcom 成反比关系

  综上,建议用户调整显示器亮度时,通过调整显示器的 Vcom 设置寄存器实现;有关 Vcom设置寄存器的地址和详细描述请参照对应显示器规格书。

  2.2. 显示窗口设置 

  显示窗口的设置,通过 4 个边距调整寄存器共同实现,可以调整显示画面的大小和位置;建议用户提前确定好显示窗口的大小及位置,把配置数据归入到第 1.3 节中初始化流程的寄存器配置部分。以 SVGA 系列为例说明,其寄存器作用效果描述如下表所示:

寄存器 默认值 功能描述
11H,13H 02H,02H 调整显示窗口起始位置
12H,14H 02H,02H 调整显示窗口结束位置

  其中左边距和上边距控制寄存器设置显示窗口的起始位置,以左上角为起始坐标,右边距和下边距控制寄存器设置显示窗口的结束位置,以右下角为起始坐标,如图 2-3 所示:

6

图 2-3 显示窗口大小、位置调整示意图

  注:显示画面的移动精度为一个像素间距(pixel pitch),详见各型号显示器规格书。

  设置显示窗口时,须保证 4 个边距调整寄存器的值在其可调范围内且匹配输入画面的分辨率,否则会出现画面缺失或部分黑屏的现象。假设所显示画面的分辨率为 A × B,则寄存器设置应满足如下关系:

7

  在保证上述要求的前提下,用户即可实现显示画面大小和位置的控制;若需要居中显示,在满足上述条件的情况下,要求左右边距对称和上下边距对称:

reg (11H) = reg (12H)

reg (13H) = reg (14H)

  *特别注意,针对 SVGA 系列显示器,若其工作在隔行扫描模式下,设置显示窗口时,上下边距只能设置为偶数:

reg (13H) = 2n

reg (14H) = 2n

  设置示例:

  假设所显示画面的分辨率为 768×576,则应满足:

reg (11H) + reg (12H) = 804 – 768 = 36

reg (13H) + reg (14H) = 604 – 576 = 28

  若要居中显示,则应满足:

reg (11H) = reg (12H) = 36 ÷ 2 = 18 = 12H

reg (13H) = reg (14H) = 28 ÷ 2 = 14 = 0EH

  若要移动画面位置,则先确定显示画面的起始坐标,若画面起始坐标为(6,6),则:

reg (11H) = 6,reg(12H) = 36 – reg(11H) = 30 = 1EH

reg (13H) = 6,reg(14H) = 28 – reg(13H) = 22 = 16H

  针对 SXGA 显示器,使用上述相同的方法进行操作,但需要注意总像素点和操作寄存器的不同,详细寄存器说明请参照 SXGA060 显示器规格书。

  2.3. Gamma LUTs 操作

  SVGA 显示器的 Gamma LUTs 共有 LUT0~LUT16 17 个点,均为 9 位数据,直接读写显示器的 20H~42H 寄存器进行 Gamma 数据的读写操作,具体流程如图 2-4 所示:

8

  SXGA 显示器的 Gamma 矫正分为 R,G,B三个独立 LUTs通道,每个通道 LUTs共有256个10位数据,需要通过11H,14H,17H 三个 LUT[n]偏移量寄存器,以间接寻址的方式进行 Gamma 数据的读写操作,如图2-5所示为 Gamma LUTs 操作示意图:

9

图 2-5 SXGA Gamma LUTs 操作示意图

  在分别将 SXGA 显示器 R、G、B 三通道 Gamma LUTs 数据全部写完后,各通道所有数据均缓存在一个数据表中,此时显示器并未按照新的 Gamma 信息进行显示,需要将SXGA 显示器 10H 寄存器的第 3、2、1 位同时置一使能 Gamma LUTs 更新,缓存的数据表将覆盖现有的 Gamma LUTs;更新完成后,显示器即按照新的 Gamma 信息进行显示,具体操作流程如图 2-6 所示:

10

图 2-6 SXGA 显示器 Gamma 操作流程

  最新的矫正方法采用了曲线拟合的方式,以获得更加细腻的 Gamma 矫正效果,详细的计算过程就不做介绍;为了简化 MCU 的计算过程,已经提前完成了一些复杂的指数计算,具体如以下示例代码所示:

  SVGA Gamma 操作示例代码(C 语言):

  所需数据表:

  BYTE LUT[16]={0,33,55,74,92,108,124,139,153,167,181,194,207,219,231,243};

  注:该数据表的值为已经提前完成指数计算的中间值,具体的 Gamma 矫正值还需在此数据表的基础上再进行一定计算。

  功能实现:

  void Wr_Gamma(WORD Gamma_value)
  {

  BYTE k, b;

  WORD tmp, cGamma, Remainder;

  for (k=0,b=0,tmp=Gamma_value, Remainder=0; k<16; k++,b=0)

  {

  Wr_I2C (DISPADDR, 0x20 + k*2, LOW_BYTE (tmp));

  Wr_I2C (DISPADDR, 0x20 + k*2+1, HIGH_BYTE (tmp));

  cGamma = (512-Gamma_value) * (LUT[k+1]-LUT[k]);

  Remainder + = cGamma%256;

  if(Remainder > = 256)

  {

  Remainder - = 256;

  b=1;

  }

  tmp + = (cGamma>>8)+b;

  } 

  }

  SXGA Gamma 操作示例代码(C 语言):

  所需数据表:

  BYTE LUT[256]={0, 9, 13, 17, 21, 24, 26, 29, 31, 34, 36, 38, 40, 42, 44, 46,48, 50, 51, 53, 55, 57, 58, 60, 61, 63, 64, 66, 67, 69, 70, 72,73, 74, 76, 77, 78, 80, 81, 82, 83, 85, 86, 87, 88, 90, 91, 92,93, 94, 95, 97, 98, 99, 100, 101, 102, 103, 104, 105, 107, 108, 109, 110,111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,127, 128, 129, 130, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141,141, 142, 143, 144, 145, 146, 147, 148, 148, 149, 150, 151, 152, 153, 153, 154,155, 156, 157, 158, 158, 159, 160, 161, 162, 163, 163, 164, 165, 166, 167, 167,168, 169, 170, 170, 171, 172, 173, 174, 174, 175, 176, 177, 177, 178, 179, 180,180, 181, 182, 183, 183, 184, 185, 186, 186, 187, 188, 189, 189, 190, 191, 192,192, 193, 194, 194, 195, 196, 197, 197, 198, 199, 199, 200, 201, 202, 202, 203,204, 204, 205, 206, 206, 207, 208, 208, 209, 210, 211, 211, 212, 213, 213, 214,215, 215, 216, 217, 217, 218, 219, 219, 220, 221, 221, 222, 223, 223, 224, 225,225, 226, 226, 227, 228, 228, 229, 230, 230, 231, 232, 232, 233, 234, 234, 235,235, 236, 237, 237, 238, 239, 239, 240, 240, 241, 242, 242, 243, 244, 244, 245,245, 246, 247, 247, 248, 248, 249, 250, 250, 251, 251, 252, 253, 253, 254, 255}

  功能实现:

  void Wr_Gamma(BYTE CHAddr, WORD Gamma_value)
  {

  WORD dGamma, cGamma;

  WORD Remainder;

  BYTE i, b;

  for(i=0, dGamma=Gamma_value,b=0,Remainder=0;i<0xff;i++,b=0)

  {

  Wr_I2C(DISPADDR,CHAddr,i);

  Wr_I2C(DISPADDR,CHAddr+1,HIGH_BYTE(dGamma));

  Wr_I2C(DISPADDR,CHAddr+2,LOW_BYTE(dGamma));

  cGamma=(1024-Gamma_value)*(LUT[i+1]-LUT[i]);

  Remainder+=cGamma%256;

  if(Remainder>=256)
  {

  Remainder-=256;

  b=1;

  }

  dGamma+=(cGamma>>8)+b;

  }

  Wr_I2C(DISPADDR,CHAddr,i);

  Wr_I2C(DISPADDR,CHAddr+1,0x03);

  Wr_I2C(DISPADDR,CHAddr+2,0xff);

  }

  2.4. 温度补偿

  由于 OLED 材料固有的温度特性,SVGA 和 SXGA 显示器在低温环境工作时,亮度相比常温比较暗,而在高温环境工作时又比较亮。为了避免显示器亮度在整个工作温度范围内出现较大波动而影响使用,需要在一定温度范围内进行相应的亮度补偿(Vcom 调整),保证其亮度处于一个基本稳定的状态。正常情况下,温度无法进行瞬变,建议间隔 10s 或 者 20s 进行一次补偿操作,具体流程如图 2-7 所示,关于 SVGA 和 SXGA 温度传感器部分的详细描述请参考其规格书。

11

 

  经过一系列的实验和验证,得到了在-40℃~+65℃温度范围的温度补偿查找表,其表中的值表示每个温度值下,Vcom 所需要调整的值,温度补偿查找表和示例代码如下所示:

  SVGA 温度补偿查找表:

  BYTE TC_Table[129]={-57,-56,-55,-54,-53,-52,-52,-51,-50,-49,-48,-48,-47,-46,-45,-44,-43,-43,-42,-41,-40,-39,-38,-38,-37,-36,-35,-34,-33,-33,-32,-32,-30,-29,-29,-28,-27,-26,-25,-24,-24,-23,-22,-21,-20,-19,-19,-18,-17,-16,-15,-15,-14,-13,-12,-11,-10,-10, -9, -8, -7, -6, -5, -5,-4, -3, -2, -1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 5, 5, 4, 4, 4, 4, 4, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2};

  SXGA 温度补偿查找表:

  BYTE TC_Table[129]={-66,-66,-66,-65,-65,-65,-64,-64,-63,-62,-61,-60,-59,-58,-57,-56,-55,-54,-53,-52,-51,-50,-49,-48,-47,-46,-45,-44,-43,-42,-41,-40,-39,-37,-35,-33,-31,-29,-28,-27,-25,-23,-22,-21,-20,-19,-19,-18,-17,-16,-15,-15,-14,-13,-12,-11,-10,-10, -9, -8, -7, -6, -5, -5, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10,11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18,19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,20};

  SVGA 温度补偿功能实现(c 语言):

  void disp_tc(UINT8 addr, UINT16 ref_vcom)

  {

  UINT8 current_temp; 

  current_temp = disp_get(addr, ADDR_TEMP_VALUE);

  ref_vcom += array_disp_tc[current_temp >> 1];


  if (ref_vcom > 0xff)

  {

  ref_vcom = 0xff;

  }
  else if (ref_vcom < 0x40)

  {

  ref_vcom = 0x40;

  }

  disp_set(addr, ADDR_VCOM_CTRL, ref_vcom);

  }

  SXGA 温度补偿功能实现(c 语言): 

  void disp_tc(UINT8 addr, UINT16 ref_vcom)

  {

  UINT8 current_temp; 

  current_temp = disp_get(addr, ADDR_TEMP_VALUE);

  ref_vcom += array_disp_tc[current_temp >> 1];
 
  if (ref_vcom > 0x1ff)

  {

  ref_vcom = 0x1ff;

  }

  else if (ref_vcom < 0x40)

  {

  ref_vcom = 0x40;

  }

  disp_set(addr, ADDR_VCOM_CTRL, high_byte(ref_vcom));

  disp_set(addr, ADDR_VCOM_CTRL+1, low_byte(ref_vcom));

  }

  2.5. 3D 显示应用

  奥雷德公司的 OLED 微型显示器可用于左右眼(Side-by-Side)格式的 3D 显示应用,具体实现时,需要两片显示器分别显示左眼和右眼的内容,配合专门的双目目镜,即可观察到效果逼真的 3D 影像。应用框图如图 2-8 所示,信号时序如图 2-9 所示:

12

 

图 2-8 OLED 左右 3D 显示应用框图

  注:要实现 3D 显示,必须两片 OLED 显示器同时工作,单片显示器无法实现 3D

13

 

图 2-9 OLED 显示器 3D 显示时序示意图

  3. 典型应用配置示例

  3.1. 24bit 444 RGB with DE、逐行扫描、无镜像

14

 

  注:

  ① 同步信号极性设置应匹配用户系统输出的信号极性,此处均以高电平有效设置;

  ② 有 DE 信号时 Vblank 和 Hblank 可以不设置,无 DE 信号时必须设置;

  ③ 画面镜像设置,也即扫描方向设置,初始化过称中设置时需注意显示器应处于关闭状态,需要时,再打开显示器。

  ④ 对于双字节配置,要求先写髙字节数据,后写低字节数据,否则写入后无效。

  3.2. 16bit 422 YCbCr with DE、逐行扫描、无镜像

15

  3.3. 8bit 422 YCbCr、嵌入同步信号、隔行扫描

16