0.96寸OLED12864屏幕控制(原理+代码)

您所在的位置:网站首页 oled显示屏连接特点 0.96寸OLED12864屏幕控制(原理+代码)

0.96寸OLED12864屏幕控制(原理+代码)

2024-06-16 05:58| 来源: 网络整理| 查看: 265

 末尾附cubemx文件与keil文件。

SPI/IIC 接口模块 模块接口定义: 1. GND 电源地 2. VCC 电源正(3~ 5.5V ) 3. D0           OLED 的 D0 脚,在 SPI 和 IIC 通信中为时钟管脚 4. D1           OLED 的 D1 脚,在 SPI 和 IIC 通信中为数据管脚 5. RES        OLED 的 RES# 脚,用来复位(低电平复位) 6. DC          OLED 的 D/C#E 脚,数据和命令控制管脚 7. CS           OLED 的 CS# 脚,也就是片选管脚

 原理图如下:

SSD1306的显存大小为128*64bit,内部储存中分为8页,每页128字节,对应128*64的点阵大小

 SSD1306由命令集控制,如下是开发手册中的一个命令表

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

命令0xA4/A5:0xA4,即X0=0:恢复到RAM内容显示(RESET),输出遵循RAM内容;0xA5,即X0=1:整个显示打开,输出忽略RAM内容。

命令0xA6/0xA7: 0xA6,即X0=0: 0在RAM中表OFF,1在RAM中表ON;0xA7为反转模式,与之相反。 命令0XAE/0XAF:0XAE为关闭显示命令;0XAF为开启显示命令。 命令0X8D:包含2个字节,第一个为命令字,第二个为设置值,第二个字节的BIT2表示电荷泵的开关状态,该位为1,则开启电荷泵,为0则关闭。在模块初始化的时候,这个必须要开启,否则是看不到屏幕显示的。 命令0XB0~B7:用于设置页地址,其低三位的值对应着GRAM的页地址。命令0X00-0XOF:用于设置显示时的起始列地址低四位。 命令0X10~0X1F用于设置显示时的起始列地址高四位。

OLED显示过程:1.复位  2.SSD1306初始化 3.开启显示  4.清零显存 5.开始显示

2. SSD1306初始化:

void OLED_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_12|GPIO_PIN_13;//配置管脚为输出 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_12|GPIO_PIN_13, GPIO_PIN_SET); HAL_Delay(100); 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(0xf0,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);// Disable Entire Display On (0xa4/0xa5) OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7) OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/ OLED_Clear(); OLED_Set_Pos(0,0); }

3.开启显示

3.1 向ic写入一个字节

/向SSD1306写入一个字节。 //dat:要写入的数据/命令 //cmd:数据/命令标志 0,表示命令;1,表示数据; void OLED_WR_Byte(u8 dat,u8 cmd) { u8 i; if(cmd) OLED_DC_Set(); else OLED_DC_Clr(); OLED_CS_Clr(); for(i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3