主要结构包括,MCU、 (经典款用的是SSD1306;方屏SSD1317;竖屏SH1107;有些新款用的是SSD1315)
GDDRAM(我们写入的显示数据存放在这里)、Command register(命令寄存器,写入的命令放在这里)等部分。
各芯片数据手册链接如下:
SSD1306:https://leoeinstein.lanzous.com/iTI83kivv9e
SSD1317:https://leoeinstein.lanzous.com/iiJTukivv8d
SSD1107:https://leoeinstein.lanzous.com/iYK41kivvaf
SSD1315:https://leoeinstein.lanzous.com/iLhlmkivvbg
" # "表示“非”,低电平有效
引脚 | 说明 |
---|---|
RES# | 复位信号,拉低时芯片会开始初始化,置1的时候正常工作 |
CS# | 片选脚,不接的情况下,默认低电平(默认选中) |
D/C# | 为1时,读写数据;为0时,读写指令 |
R/W# | 读写控制端,为1时读;为0时写 |
E/(RD#) | 串行模式下接到VSS,也就是低电平 |
D[7:0] | 串行通信模式下,D0是串行时钟输入(SCLK);D1是串行数据输入(SDIN) |
四线串行接口由串行时钟: SCLK、串行数据: SDIN、D/C#、CS组成
其中D0充当SCLK,D1充当 SDIN;
对于未使用的数据引脚,D2应该保持开路状态;D3到D7、E和 R/W# 的引脚连接到外部地。
在SCLK的每个上升沿,SDIN数据从高到低逐位,移位到一个8位移位寄存器,其顺序为D7…D0。
8个时钟后,对D/C#进行采样(看看接下来的是数据还是命令),移位寄存器中的数据字节会同步写入到图形显示数据aRAM ( GDDRAM )或命令寄存器。
如上图显示数据寄存器,被分为128 * 8页,每一页有8位,总的就有 128 *8 * 8=128 * 64
如上图所示,当一个字节(8位)数据写入GDDRAM时候,会从低位数据D0开始写入,一直到D7。
也就要求了,字符或者图片取模时要求 取模方式为列行式, 取模走向 为低位在前。
Hex | Command |
---|---|
AF | 设置显示为打开 |
AE | 设置显示为关闭 |
A4/A5 | 显示打开 |
A6/A7 | 正常显示(A6)/反转显示(A7) |
81 | 设置对比度控制 |
驱动芯片:STM32F407
//-----------------OLED端口定义----------------
#define OLED_SCLK_Clr() GPIO_ResetBits(GPIOG,GPIO_Pin_12)//SCL
#define OLED_SCLK_Set() GPIO_SetBits(GPIOG,GPIO_Pin_12)
#define OLED_SDIN_Clr() GPIO_ResetBits(GPIOD,GPIO_Pin_5)//DIN
#define OLED_SDIN_Set() GPIO_SetBits(GPIOD,GPIO_Pin_5)
#define OLED_RES_Clr() GPIO_ResetBits(GPIOD,GPIO_Pin_4)//RES
#define OLED_RES_Set() GPIO_SetBits(GPIOD,GPIO_Pin_4)
#define OLED_DC_Clr() GPIO_ResetBits(GPIOD,GPIO_Pin_15)//DC
#define OLED_DC_Set() GPIO_SetBits(GPIOD,GPIO_Pin_15)
#define OLED_CS_Clr() GPIO_ResetBits(GPIOD,GPIO_Pin_1)//CS
#define OLED_CS_Set() GPIO_SetBits(GPIOD,GPIO_Pin_1)
//OLED的初始化函数
void OLED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOG|RCC_AHB1Periph_GPIOE,ENABLE);//使能PORTA~E,PORTG时钟
//GPIO初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_15 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化
//GPIO初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化
//GPIO初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化
OLED_RES_Clr();
delay_ms(200);
OLED_RES_Set();
OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
OLED_WR_Byte(0x40,OLED_CMD);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F)
OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
OLED_WR_Byte(0xCF,OLED_CMD);// Set SEG Output Current Brightness
OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常
OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常
OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)
OLED_WR_Byte(0x00,OLED_CMD);//-not offset
OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period
OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration
OLED_WR_Byte(0x12,OLED_CMD);
OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh
OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level
OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
OLED_WR_Byte(0x02,OLED_CMD);//
OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable
OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable
OLED_WR_Byte(0xA4,OLED_CMD);// Entire Display On (0xa4/0xa5)
OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7)
OLED_WR_Byte(0xAF,OLED_CMD);
OLED_Clear();
}
工程链接:https://leoeinstein.lanzous.com/ipI81kj0vgb