SH1106
SH1106是一种单色OLED显示屏控制器,主要用于显示文字和图形。本文档详细介绍SH1106的技术规格、引脚定义和使用方法。
目录
1. 基本规格
1.1 显示规格
- 显示模式: 被动矩阵
- 显示颜色: 单色(白色)
- 驱动占空比: 1/64
1.2 机械规格
- 像素数量: 128 × 64
- 面板尺寸: 34.5 × 23.0 × 1.4 (mm)
- 有效显示区域: 29.42 × 14.7 (mm)
- 像素间距: 0.23 × 0.23 (mm)
- 像素尺寸: 0.21 × 0.21 (mm)
- 重量: 2.18 (g)
1.3 有效区域/内存映射和像素结构
1.4 机械图纸
1.5 引脚定义
电源引脚
| 引脚号 | 符号 | 类型 | 功能描述 |
|---|---|---|---|
| 9 | VDD | P | 逻辑电路电源 逻辑电路电压供应引脚,必须连接外部电源 |
| 8 | VSS | P | 逻辑电路地 逻辑电路地引脚,作为逻辑引脚的参考地,必须连接外部地 |
| 28 | VCC | P | OLED面板电源 芯片最高正电压供应引脚。使用转换器时,此引脚与VSS之间应连接稳定电容 |
| 29 | VLSS | P | 模拟电路地 模拟地引脚,外部应连接到VSS |
驱动引脚
| 引脚号 | 符号 | 类型 | 功能描述 |
|---|---|---|---|
| 26 | IREF | I | 亮度调节电流参考 段电流参考引脚,此引脚与VSS之间应连接电阻,最大电流设置为12.5μA |
| 27 | VCOMH | O | COM信号高电平电压输出 COM信号高电平电压输出引脚,此引脚与VSS之间应连接电容 |
DC/DC转换器引脚
| 引脚号 | 符号 | 类型 | 功能描述 |
|---|---|---|---|
| 6 | VBAT | P | DC/DC转换器电路电源 内部DC/DC电压转换器缓冲器的电源引脚 |
| 4/5, 2/3 | C1P/C1N, C2P/C2N | I | 飞跨反相电容正/负端 升压电容正/负端 端子之间需要电荷泵电容 |
接口引脚
| 引脚号 | 符号 | 类型 | 功能描述 |
|---|---|---|---|
| 10-12 | BS0-BS2 | I | 通信协议选择 MCU接口选择输入引脚 |
| 14 | RES# | I | 控制器和驱动器电源复位 复位信号输入引脚,低电平时执行芯片初始化 |
| 13 | CS# | I | 片选 片选输入引脚,仅当CS#为低电平时芯片才启用MCU通信 |
| 15 | D/C# | I | 数据/命令控制 数据/命令控制引脚,高电平时D7-D0输入作为显示数据,低电平时作为命令寄存器 |
| 17 | E/RD# | I | 读/写使能或读 MCU接口输入引脚 |
| 16 | R/W# | I | 读/写选择或写 MCU接口输入引脚 |
| 18-25 | D0-D7 | I/O | 主机数据输入/输出总线 8位双向数据总线 |
保留引脚
| 引脚号 | 符号 | 类型 | 功能描述 |
|---|---|---|---|
| 7 | N.C. | - | 保留引脚 功能引脚之间的N.C.引脚保留用于兼容性和灵活设计 |
| 1,30 | N.C.(GND) | - | 保留引脚(支撑引脚) 支撑引脚可减少功能引脚上的应力影响 |
2. 绝对最大额定值
| 参数 | 符号 | 最小值 | 最大值 | 单位 | 备注 |
|---|---|---|---|---|---|
| 逻辑电源电压 | VDD | -0.3 | 4 | V | 1,2 |
| 显示电源电压 | VCC | 0 | 14 | V | 1,2 |
| DC/DC电源电压 | VBAT | -0.3 | 5 | V | 1,2 |
| 工作温度 | TOP | -40 | 85 | °C | |
| 存储温度 | TSTG | -40 | 85 | °C | 3 |
| 寿命(120cd/m²) | 10,000 | - | 小时 | 4 | |
| 寿命(80cd/m²) | 30,000 | - | 小时 | 4 | |
| 寿命(60cd/m²) | 50,000 | - | 小时 | 4 |
备注说明:
- 所有电压均基于"VSS=0V"
- 超过绝对最大额定值可能导致模块永久损坏
- 定义的温度范围不包括偏光片,偏光片最高耐受温度应为80°C
- 寿命测试条件:VCC=12.0V, Ta=25°C, 50%棋盘格图案
3. 功能规格
3.1 命令集
请参考SH1106技术手册
3.2 电源关断和开启序列
为了保护OLED面板并延长面板寿命,驱动器IC的电源开启/关断程序应在高压和低压电源之间包含延迟期。
3.2.1 电源开启序列
- 开启VDD
- 发送显示关闭命令
- 初始化
- 清屏
- 开启VCC/VBAT
- 延迟100ms(当VCC稳定时)
- 发送显示开启命令
3.2.2 电源关断序列
- 发送显示关闭命令
- 关断VCC/VBAT
- 延迟100ms(当VCC/VBAT达到0且面板完全放电时)
- 关断VDD
3.3 复位电路
当RES#输入为低电平时,芯片以以下状态初始化:
- 显示关闭
- 128×64显示模式
- 正常段和显示数据列行地址映射
- 串行接口移位寄存器数据清除
- 显示起始行设置在显示RAM地址0
- 列地址计数器设置为0
- COM输出的正常扫描方向
- 对比度控制寄存器设置为7Fh
- 正常显示模式
3.4 实际应用示例
3.4.1 外部VCC供电
电源开启序列:
电源关断序列:
进入睡眠模式:
退出睡眠模式:
外部设置代码:
{
RES=1;
delay(1000);
RES=0;
delay(1000);
RES=1;
delay(1000);
write_i(0xAE); /*显示关闭*/
write_i(0x02); /*设置低列地址*/
write_i(0x10); /*设置高列地址*/
write_i(0x40); /*设置显示起始行*/
write_i(0xB0); /*设置页地址*/
write_i(0x81); /*对比度控制*/
write_i(0xBF); /*128*/
write_i(0xA1); /*设置段重映射*/
write_i(0xA6); /*正常/反向*/
write_i(0xA8); /*多路复用比*/
write_i(0x3F); /*占空比=1/64*/
write_i(0xad); /*设置电荷泵使能*/
write_i(0x8a); /*0x8a 外部VCC*/
write_i(0x32); /*0X30---0X33 设置VPP 8V*/
write_i(0xC8); /*COM扫描方向*/
write_i(0xD3); /*设置显示偏移*/
write_i(0x00); /*0x20*/
write_i(0xD5); /*设置振荡器分频*/
write_i(0x80);
write_i(0xD9); /*设置预充电周期*/
write_i(0x22); /*0x22*/
write_i(0xDA); /*设置COM引脚*/
write_i(0x12);
write_i(0xdb); /*设置vcomh*/
write_i(0x40);
write_i(0xAF); /*显示开启*/
}
void write_i(unsigned char ins)
{
DC=0;
CS=0;
WR=1;
P1=ins; /*指令*/
WR=0;
WR=1;
CS=1;
}
void write_d(unsigned char dat)
{
DC=1;
CS=0;
WR=1;
P1=dat; /*数据*/
WR=0;
WR=1;
CS=1;
}
void delay(unsigned int i)
{
while(i>0)
{
i--;
}
}3.4.2 内部DC/DC电路生成VCC
电源开启序列:
电源关断序列:
进入睡眠模式:
退出睡眠模式:
内部设置代码(电荷泵):
{
RES=1;
delay(1000);
RES=0;
delay(1000);
RES=1;
delay(1000);
write_i(0xAE); /*显示关闭*/
write_i(0x02); /*设置低列地址*/
write_i(0x10); /*设置高列地址*/
write_i(0x40); /*设置显示起始行*/
write_i(0xB0); /*设置页地址*/
write_i(0x81); /*对比度控制*/
write_i(0xff); /*128*/
write_i(0xA1); /*设置段重映射*/
write_i(0xA6); /*正常/反向*/
write_i(0xA8); /*多路复用比*/
write_i(0x3F); /*占空比=1/64*/
write_i(0xad); /*设置电荷泵使能*/
write_i(0x8b); /*0x8B 内部VCC*/
write_i(0x33); /*0X30---0X33 设置VPP 9V*/
write_i(0xC8); /*COM扫描方向*/
write_i(0xD3); /*设置显示偏移*/
write_i(0x00); /*0x20*/
write_i(0xD5); /*设置振荡器分频*/
write_i(0x80);
write_i(0xD9); /*设置预充电周期*/
write_i(0x1f); /*0x22*/
write_i(0xDA); /*设置COM引脚*/
write_i(0x12);
write_i(0xdb); /*设置vcomh*/
write_i(0x40);
write_i(0xAF); /*显示开启*/
}
void write_i(unsigned char ins)
{
DC=0;
CS=0;
WR=1;
P1=ins; /*指令*/
WR=0;
WR=1;
CS=1;
}
void write_d(unsigned char dat)
{
DC=1;
CS=0;
WR=1;
P1=dat; /*数据*/
WR=0;
WR=1;
CS=1;
}
void delay(unsigned int i)
{
while(i>0)
{
i--;
}
}