嵌入式学习之oled模块(SSD1306控制器)

(1)OLED显存存放格式(GDDRAM)
在这里插入图片描述
(2)在某页的一列中D0在高位,D7位在底。
在这里插入图片描述
2.时序:在每个时钟的上升沿写入且先写高位。
在这里插入图片描述
3.常用命令:
第一个命令为 0X81,用于设置对比度的,这个命令包含了两个字节,第一个 0X81 为命令,随后发送的一个字节为要设置的对比度的值。这个值设置得越大屏幕就越亮。
第二个命令为 0XAE/0XAF。0XAE 为关闭显示命令;0XAF 为开启显示命令。
第三个命令为 0X8D,该指令也包含 2 个字节,第一个为命令字,第二个为设置值,第二个字节的 BIT2 表示电荷泵的开关状态,该位为 1,则开启电荷泵,为 0 则关闭。在模块初始化的时候,这个必须要开启,否则是看不到屏幕显示的。
第四个命令为 0XB0~B7,该命令用于设置页地址,其低三位的值对应着 GRAM 的页地址。
第五个指令为 0X00~0X0F,该指令用于设置显示时的起始列地址低四位。
第六个指令为 0X10~0X1F,该指令用于设置显示时的起始列地址高四位。
注意:第五个和第六个命令两者合起来选择128列中的一列,如图所示为选择第100列时的两个命令应写入的值:
在这里插入图片描述
4.实现代码解读:
(1)在 STM32 内部定义了一个块 GRAM:
static unsigned char OLED_buffer[1024](1024 * 8==128 * 64)
用于对应oled中的GDDRAM,这样在操作的时候,我们只要修改 STM32 内部的 GRAM(即修改数组) 就可以了,然后通过下面这个OLED_Display(void)函数把 GRAM 一次刷新到 OLED 的 GDDRAM上。

void OLED_Display(void)//将数组的内容更新到到oled中
{
    
    
	u8 i,n;		    
	for(i=0;i<PAGE_SIZE;i++)  
	{
    
      
		OLED_WR_Byte (YLevel+i,OLED_CMD);    //设置页地址(0~7)
		OLED_WR_Byte (XLevelL,OLED_CMD);      //设置显示位置—列低地址
		OLED_WR_Byte (XLevelH,OLED_CMD);      //设置显示位置—列高地址  
		for(n=0;n<WIDTH;n++)//即从低0页的第一列开始写起
		{
    
    
			OLED_WR_Byte(OLED_buffer[i*WIDTH+n],OLED_DATA); 
		}
	}   //更新显示
}

(2)写某一个像素点的函数(当然操作的是定义的数组)

void OLED_Set_Pixel(unsigned char x, unsigned char y,unsigned char color)
{
    
    
	if(color)
	{
    
    
		OLED_buffer[(y/PAGE_SIZE)*WIDTH+x]|= (1<<(y%PAGE_SIZE))&0xff;
	}
	else
	{
    
    
		OLED_buffer[(y/PAGE_SIZE)*WIDTH+x]&= ~((1<<(y%PAGE_SIZE))&0xff);
	}
}	

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44142774/article/details/106127348
今日推荐