基于SSD1306的OLED的驱动学习(一):SSD中文命令表(搬运)

SSD1306命令

命令表单(D/C#=0, R/W#(WR#) = 0, E(RD#=1) 特殊状态除外)

  1. 基本命令

 

D/C

Hex

D7

D6

D5

D4

D3

D2

D1

D0

命令

描述

0

81

A[7:0]

1

A7

0

A6

0

A5

0

A4

0

A3

0

A2

0

A1

1

A0

设置对比度

双字节命令,1~256级对比度可选,对比度随值增加。

(复位值 = 0x7f)

0

A4/A5

1

0

0

0

0

1

0

X0

全部显示开

A4h,X0 = 0 :恢复内存内容显示(默认),输出内存中的内容

A5h,X0 = 1 :开显示,输出无视内存的内容

0

A6/A7

1

0

0

0

0

1

1

X0

设置正常/逆显示

A6,X[0]= 0:正常显示(默认)

RAM为0:显示面板关

RAM为1:显示面板开

A7 X[0]= 1:逆显示

RAM为0:显示面板开

RAM为1:显示面板关

0

AE/AF

1

0

0

0

1

1

1

X0

设置显示开/关

AE:X[0]= 0:关显示(默认)

AF:X[0]= 1:在正常模式显示

2、滚动命令表

D/C

Hex

D7

D6

D5

D4

D3

D2

D1

D0

命令

描述

0

0

0

0

0

0

0

26/27

A[7:0]

B[2:0]

C[2:0]

D[2:0]

E[7:0]

F[7:0]

0

0

*

*

*

0

1

0

0

*

*

*

0

1

1

0

*

*

*

0

1

0

0

*

*

*

0

1

0

0

*

*

*

0

1

1

0

B2

C2

D2

0

1

1

0

B1

C1

D1

0

1

X0

0

B0

C0

D0

0

1

连续水平滚动设置

26小时,X[0]= 0,右向水平滚动

27 h,X[0]= 1,左向水平滚动

(水平滚动1列)

[7:0]:虚拟字节(设置为00 h)

B(2:0):定义开始页面地址

0~7   PAGE0 ~ PAGE7

C(2:0):设置每个滚动步骤之间的时间间隔的帧频

000 b - 5帧100 b - 3帧

001 b - 64帧101 b - 4帧

010 b - 128帧110 b - 25帧

011 b - 256帧111 b - 2帧

D(2:0):定义最终页面地址

0~7   PAGE0 ~ PAGE7

D(2:0)的值必须大于或等于B(2:0)

E[7:0]:虚拟字节(设置为00 h)

F[7:0]:虚拟字节(设置为FFh)

0

0

0

0

0

0

29/2A

A[2:0]

B[2:0]

C[2:0]

D[2:0]

E[5:0]

0

0

*

*

*

0

0

0

*

*

*

0

1

0

*

*

*

E5

0

0

*

*

*

E4

1

0

*

*

*

E3

0

0

B2

C2

D2

E2

X1

0

B1

C1

D1

E1

X0

0

B0

C0

D0

E0

连续垂直和水平滚动

设置

29H,X1X0 = 01 :垂直和水平滚动

2AH,X1X0 = 10 :垂直和水平滚动

(水平滚动1列)

[7:0]:虚拟字节

B(2:0):定义开始页面地址

0~7   PAGE0 ~ PAGE7

C(2:0):设置每个滚动步骤之间的时间间隔的帧频

000 b - 5帧100 b - 3帧

001 b - 64帧101 b - 4帧

010 b - 128帧110 b - 25帧

011 b - 256帧111 b - 2帧

D(2:0):定义最终页面地址

0~7   PAGE0 ~ PAGE7

D(2:0)的值必须大于或等于B(2:0)

E[5:0]:垂直滚动偏移量

例如E[5:0]= 01 h指抵消= 1行

E(5:0)= 3跳频是指抵消= 63行

请注意(1)没有可用连续垂直滚动。

0

2E

0

0

1

0

1

1

1

0

禁用滚动

0

2F

0

0

1

0

1

1

1

1

激活滚动

0

0

0

A3

A[5:0]

B[6:0]

1

*

0

0

*

B5

1

A5B5

0

A4B4

0

A3B3

0

A2

B2

1A1

B1

1A0

B0

设置垂直滚动

区域

A(5:0):没有。的行固定区域。没有。的行固定区域引用的GDDRAM(重置= 0)(即行。0]

B[6:0]:没有。在滚动的行。这是一个用于垂直的行数滚动。滚动区域开始在第一行下面的顶部固定区域。(重置= 64)

请注意

(1)A[5:0]+[6:0]< = MUX比率

(2)B(6:0)< = MUX比率

(3)垂直滚动抵消(E(5:0)h / 2啊29日)<B[6:0]

(3 b)设置显示线(X5X4X3X2X1X0开始40 h ~ 7跳频)< B[6:0]

(4)最后一行滚动区域的转移到第一行滚动的区域。

(5)对64 d MUX显示(5:0)= 0,B[6:0]= 64:整个区域卷轴

(5:0)= 0,B[6:0]< 64:高级卷轴

A[5:0]+[6:0]< 64:中心区卷轴

A[5:0]+[6:0]= 64:底部区域卷轴

3、寻址设置命令表

D/C

Hex

D7

D6

D5

D4

D3

D2

D1

D0

命令

描述

0

00~0F

0

0

0

0

X3

X2

X1

X0

设置低的列开始地址页面寻址模式

设置列的低咬起始地址注册页面使用X(握)寻址模式数据位。最初的显示行寄存器复位后重置为0000 b。

请注意

(1)该命令只是页面寻址模式

0

10~1F

0

0

0

1

X3

X2

X1

X0

设定更高的列

开始地址页面寻址模式

设置列的高咬起始地址注册页面使用X(握)寻址模式数据位。最初的显示行寄存器复位后重置为0000 b。请注意

1)这个命令只是页面寻址模式

0

0

20

A[1:0]

0

*

0

*

1

*

0

*

0

*

0

*

0

A1

0

A0

设置内存寻址模式

A[1:0]= 00,水平寻址模式

A[1:0]= 01,垂直的寻址模式

A[1:0]= 10,页面寻址模式(重置)

A[1:0]= 11,无效

0

0

0

21

A[6:0]

B[6:0]

0

*

*

0

A6B6

1

A5B5

0

A4B4

0

A3B3

0

A2

B2

0A1

B1

1A0

B0

设置列地址

设置列开始和结束地址

A[6:0]:列起始地址,范围:0 - 127 (默认值 = 0)

B[6:0]:列结束地址范围:0 - 127 (默认值 = 127)

注:(1)该命令只是为水平或垂直寻址模式。

0

0

0

22

A[2:0]

B[2:0]

0

*

*

0

*

*

1

*

*

0

*

*

0

*

*

0

A2

B2

1A1

B1

0A0

B0

设置页面地址

页面设置开始和结束地址

A[2:0]:页面起始地址,范围:0-7

(默认值= 0 )

B[2:0]:页面结束地址,范围:0-7

(默认值= 7 )

注:(1)该命令只是为水平或垂直寻址模式。

0

B0~B7

1

0

1

1

0

X2

X1

X0

设置页面开始

页面地址寻址模式

设置GDDRAM页面的起始地址

(PAGE0 ~ PAGE7)页面寻址模式,使用X[2:0]。

请注意

(1)该命令只是页面寻址模式

4、硬件配置表(面板分辨率&设计相关)命令

0

40~7F

0

1

X5

X4

X3

X2

X1

X0

设置显示开始行

设置显示RAM的显示起始行地址0 -> 63,使用X5X4X3X2X1X0 。

在复位后起始行地址为0。

0

A0/A1

1

0

1

0

0

0

0

X0

设置段重映射

A0,X[0]= 0:列地址0映射到

SEG0(默认值)

A1 X[0]= 1:列地址127映射到SEG0

0

0

A8

A[5:0]

1

*

0

*

1

A5

0

A4

1

A3

0

A2

0

A1

0

A0

设置多种比列

MUX比率设置为N + 1 MUX

N =A[5:0]:从16MUX到64MUX ,复位值= 111111 b(即63 d、64 mux)

A[5:0]:值0到14是无效的。

0

C0/C8

1

1

0

0

X3

0

0

0

设置COM输出扫描方向

C0:X[3]= 0:正常模式(默认值)扫描 COM0->COM(N - 1)

C8:X[3]= 1:重映射模式。扫描

COM0(N - 1)->COM0

其中N是MUX比率值

0

0

D3

A[5:0]

1

*

1 *

0

A5

1

A4

0

A3

0

A2

1

A1

1

A0

设置显示补偿

设置COM垂直移动 0->63

复位后的值为0。

0

0

DA

A[5:4]

1

*

1 *

0

A5

1

A4

0

0

0

0

1

0

1

0

设置COM脚

A[4]= 0,连续COM脚配置

A[4]= 1,(默认),可选择COM脚配置

A[5]= 0,(默认),禁用COM左/右重映射

A[5]= 1,COM左/右可重映射

5、时间和驱动方案设置命令表

0

0

D5

A[7:0]

1

A7

1

A6

0

A5

1

A4

0

A3

1

A2

0

A1

1

A0

设置显示时钟

分比率/振荡器频率

A[3:0]:设置DCLK的除频因子:分频比=A[3:0]+ 1,复位后为0(分频比= 1);

A[7:4]:设置晶振频率,FOSC频率随

A[7:4]的增加而增加,反之亦然。

复位后为8,范围:0 ~ 15;

当设定值增加时频率增加。

0

0

D9

A[7:0]

1

A7

1

A6

0

A5

1

A4

1

A3

0

A2

0

A1

1

A0

设置Pre-charge间隔

A[3:0]:1到15 DCLK的间隔,

写入0是无效的(复位值 = 2);

A[7:4]:2到15 DCLK的间隔;写入0是无效的(复位值 = 2)

0

0

DB

A[6:4]

1

0

1 A6

0

A5

1

A4

0

0

0

0

1

0

1

0

VCOMH

电压设置

A[6:4] V COMH设置

00     0.65 x VCC

20     0.77 x VCC(复位之后)

30     0.83 x VCC

0

E3

1

1

1

0

0

0

1

1

NOP

没有操作命令

6、高级图形命令表

0

0

23

A[6:0]

0

*

0

*

1

A5

0

A4

0

A3

0

A2

1

A1

1

A0

设置褪色出去,闪烁的

A[5:4]= 00 禁用淡出/闪烁模式(重置)

A[5:4]= 10 使能消退模式。

一旦启用消退模式,对比逐渐减少

对所有像素。输出内存内容时消退模式是禁用的。

A[5:4]= 11 b启用闪烁模式。一旦启用了闪烁模式,对比减少逐步对所有像素,比对照增加逐渐正常显示。这个过程循环不断,直到闪烁模式是禁用的。

A[3:0]:设置时间间隔为每一个褪色的一步

请注意

(1)请参考10.3.1节细节。

A[3:0]时间间隔为每一个褪色的一步

0000 b 8帧

0001 b 16帧

0010 b 24帧

:

1111 b 128帧

0

0

D6

A[0]

1

0

1

0

0

0

1

0

0

0

1

0

1

0

0

A0

设置放大

A[0]= 0禁用放大模式(重置)

A[0]= 1 b使放大模式

请注意

(1)必须在替代COM销的面板配置(命令哒[4]= 1)

(2)请参考10.3.2节细节。

7、电荷泵命令表

0

0

8D

A[7:0]

1

*

0

*

0

0

0

1

1

0

1

A2

0

0

1

0

电荷泵

设置

A[2]= 0,禁用电荷泵(复位)

A[2]= 1,在显示时使能电荷泵

请注意:在下列的命令序列之前电荷泵必须启用:

0x8d;电荷泵设置

0x14,使能电荷泵

0xAF;开显示

注:由于时间有限,很多是机器翻译只是加以修改,请自己参照英文对照。

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于STM32F103C8T6驱动SSD1306 OLED显示图像的代码: ```c #include "stm32f10x.h" #include "stm32f10x_spi.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #define OLED_CS_H() GPIO_SetBits(GPIOB, GPIO_Pin_12) #define OLED_CS_L() GPIO_ResetBits(GPIOB, GPIO_Pin_12) #define OLED_DC_H() GPIO_SetBits(GPIOB, GPIO_Pin_10) #define OLED_DC_L() GPIO_ResetBits(GPIOB, GPIO_Pin_10) #define OLED_RST_H() GPIO_SetBits(GPIOB, GPIO_Pin_11) #define OLED_RST_L() GPIO_ResetBits(GPIOB, GPIO_Pin_11) void SPI_Configuration(void) { SPI_InitTypeDef SPI_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_Init(SPI1, &SPI_InitStructure); SPI_Cmd(SPI1, ENABLE); } void OLED_Init(void) { OLED_RST_L(); delay_ms(1000); OLED_RST_H(); delay_ms(1000); OLED_CS_L(); OLED_DC_L(); SPI1_Send(0xAE); OLED_DC_H(); SPI1_Send(0x40); SPI1_Send(0xB0); SPI1_Send(0xC8); SPI1_Send(0x81); SPI1_Send(0xff); SPI1_Send(0xa1); SPI1_Send(0xa6); SPI1_Send(0xa8); SPI1_Send(0x3f); SPI1_Send(0xd3); SPI1_Send(0x00); SPI1_Send(0xd5); SPI1_Send(0x80); SPI1_Send(0xd9); SPI1_Send(0xf1); SPI1_Send(0xda); SPI1_Send(0x12); SPI1_Send(0xdb); SPI1_Send(0x40); SPI1_Send(0x20); SPI1_Send(0x00); SPI1_Send(0x21); SPI1_Send(0x00); SPI1_Send(0x7f); SPI1_Send(0x22); SPI1_Send(0x00); SPI1_Send(0x07); OLED_DC_L(); SPI1_Send(0xA4); OLED_DC_H(); SPI1_Send(0xAF); OLED_CS_H(); } void OLED_Display_On(void) { OLED_CS_L(); OLED_DC_L(); SPI1_Send(0xAE); OLED_DC_H(); SPI1_Send(0xAF); OLED_CS_H(); } void OLED_Display_Off(void) { OLED_CS_L(); OLED_DC_L(); SPI1_Send(0xAE); OLED_CS_H(); } void OLED_Clear(void) { uint8_t i, j; OLED_CS_L(); for (i = 0; i < 8; i++) { OLED_DC_L(); SPI1_Send(0xb0 + i); SPI1_Send(0x00); SPI1_Send(0x10); OLED_DC_H(); for (j = 0; j < 128; j++) { SPI1_Send(0); } } OLED_CS_H(); } void OLED_DrawPixel(uint8_t x, uint8_t y) { uint8_t page = y / 8; uint8_t shift = y % 8; OLED_CS_L(); OLED_DC_L(); SPI1_Send(0xb0 + page); SPI1_Send(0x00 + (x & 0x0f)); SPI1_Send(0x10 + ((x >> 4) & 0x0f)); OLED_DC_H(); SPI1_Send(1 << shift); OLED_CS_H(); } void OLED_DrawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2) { uint8_t steep = abs(y2 - y1) > abs(x2 - x1); uint8_t dx, dy; int8_t err, ystep; if (steep) { swap(x1, y1); swap(x2, y2); } if (x1 > x2) { swap(x1, x2); swap(y1, y2); } dx = x2 - x1; dy = abs(y2 - y1); err = dx / 2; if (y1 < y2) { ystep = 1; } else { ystep = -1; } for (; x1 <= x2; x1++) { if (steep) { OLED_DrawPixel(y1, x1); } else { OLED_DrawPixel(x1, y1); } err -= dy; if (err < 0) { y1 += ystep; err += dx; } } } void OLED_DrawRect(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2) { OLED_DrawLine(x1, y1, x2, y1); OLED_DrawLine(x1, y1, x1, y2); OLED_DrawLine(x2, y1, x2, y2); OLED_DrawLine(x1, y2, x2, y2); } void OLED_DrawCircle(int16_t x0, int16_t y0, int16_t r) { int16_t x = 0, y = r; int16_t d = 3 - 2 * r; while (x <= y) { OLED_DrawPixel(x0 + x, y0 + y); OLED_DrawPixel(x0 + x, y0 - y); OLED_DrawPixel(x0 - x, y0 + y); OLED_DrawPixel(x0 - x, y0 - y); OLED_DrawPixel(x0 + y, y0 + x); OLED_DrawPixel(x0 + y, y0 - x); OLED_DrawPixel(x0 - y, y0 + x); OLED_DrawPixel(x0 - y, y0 - x); if (d < 0) { d += 4 * x + 6; } else { d += 4 * (x - y) + 10; y--; } x++; } } void OLED_DrawImage(uint8_t *image) { uint8_t i, j; OLED_CS_L(); for (i = 0; i < 8; i++) { OLED_DC_L(); SPI1_Send(0xb0 + i); SPI1_Send(0x00); SPI1_Send(0x10); OLED_DC_H(); for (j = 0; j < 128; j++) { SPI1_Send(image[i * 128 + j]); } } OLED_CS_H(); } int main(void) { SPI_Configuration(); OLED_Init(); OLED_Display_On(); OLED_Clear(); uint8_t image[1024] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; OLED_DrawImage(image); while (1) { } } void SPI1_Send(uint8_t data) { while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPI1, data); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); SPI_I2S_ReceiveData(SPI1); } void delay_ms(uint16_t ms) { uint32_t i; for (i = 0; i < ms * 8000; i++); } ``` 需要注意的是,这只是一个简单的例子,实际开发需要根据具体的需求编写更加复杂的程序。同时,需要根据具体的OLED屏幕和STM32微控制器型号,选择相应的驱动程序和通信协议。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值