资讯详情

STM32——OLED显示实验

一、关于OLED

1、OLED(有机发光二极管)又称有机激光显示。OLED同时具有自发光、无背光源、对比度高、厚度薄、视角广、反应速度快、柔性面板、使用温度范围广、结构简单、生产工艺简单等特点。

2、OLED显示技术具有自发光的特点,采用非常薄的有机材料涂层和玻璃基板,当电流通过时,有机材料会发光,OLED从2003年开始,这种显示设备视角大,可以节约电能。MP应用于播放器。

3、LCD需要背光,OLED不需要。OLED是自发光,相比之下,OLED效果更好OLED尺寸难以大规模化,但分辨率可以很高。

二、ALINETEK0.96寸OLED模块

1.模块有两种选择:单色和双色。单色为纯蓝色,双色为黄色和蓝色(四分之一显示黄色,四分之一显示蓝色)。单色模块的每个像素点只有亮点和不亮点,没有颜色差异。

2、尺寸小,显示尺寸为0.96英寸,模块只有27英寸mm*26mm大小。

3.该模块的分辨率为128*64。

4.多接口模式,该模块共提供6800和8080两种并行接口模式和4条线穿行四种接口模式SPI接口方式、IIC接口方式。

5、不需要高压,3.3V可以工作。(模块不和5.0V接口兼容,接5.0V会烧坏模块)

6、OLED通过模块选择模块工作模式:四种模式BS1/BS2设置,BS1/BS设置与模块接口模式的关系如表:

7、OLED 8080平行接口信号线说明

CS:OLED片选信号;WR:向OLED写入数据;RD:从OLED读取数据;

D【7:0】:8位双向数据线;RST(RES):硬复位OLED;

DC:命令/数据标志(0、读写命令;1、读写数据);OLED控制器位SSD1306

三、OLED 8080并口读写过程

模块的8080并读/写过程为:

首先根据要写入/读取的数据类型设置DC高(数据)/低(命令),然后拉低片选,选择SSD1306,然后我们是读数据还是写数据?RD/WR低,然后:

读数据:在RD数据定数据锁定到数据线(D(7:0)上;

写数据:在WR上升沿将数据写入SSD1306里面;

3、OLED模块显存

SSD1306显存共128*64bit大小,SSD这些显存分为8页,每页包含128个字节,共8页,即128页*64点阵大小。

4.程序显示原理:在STM32内部建立缓存(共128*8字节),每次修改,只是修改STM32上的缓存(实际上是SRAM),修改后,一次性修改STM将32上的缓存数据写入OLED的GRAM。

四、SSD1306的命令:

1、命令0X81:设置对比度。包括两个字节,第一个0X81是命令,随后发送的字节是要设置的对比值。屏幕越大,屏幕就越亮。

2、命令0XAE/0XAF:0XAE关闭显示命令;0XAF为开启显示命令。

3、命令0X8D:包括两个字节,第一个是命令字,第二个是设置值,第二个字节BIT2表示电荷泵的开关状态,1打开电荷泵,0关闭。模块初始化时,必须打开,否则屏幕无法显示。

4、命令0XB0~B7:用于设置页面地址,其低三位值对应GRAM的页地址。

5、命令0X00~0X0F:用于设置显示的起始列地址低四位。

6、命令0X10~0X1F:设置显示时的起始列地址高四位。

五、OLED初始化过程:

复位SSD1306 ——>RST=0,延时10ms,RST=1——>驱动IC初始化代码——>所有寄存器的建设复位——>开启显示——>清0显存——>开始显存

1、OLED初始化

void OLED_Init(void) { OLED_WR_Byte(0xAE,OLED_CMD);//关闭显示 OLED_WR_Byte(0xD5,OLED_CMD);///设置时钟分频因子,震荡频率 OLED_WR_Byte(80,OLED_CMD);//3:0,7:4振荡频率 OLED_WR_Byte(0xA8,OLED_CMD);//设置驱动路数 OLED_WR_Byte(0x3F,OLED_CMD);//默认0X3F(1/64) OLED_WR_Byte(0xD3,OLED_CMD);//设置显示偏移 OLED_WR_Byte(0x00,OLED_CMD);//默认为0 OLED_Clear();//清除 }

2、OLED写一个字节

//向SSD1306写入一个字节 //dat:要写的数据/命令 //cmd:数据/命令标志 0表示命令 1表示数据 void OLED_WR_Byte(u8 dat,u8 cmd) { DATAOUT(dat);//数据放在数据端口 if(cmd) OLED_RS_Set();//写数据,置高 else OLED_RS_Clr()//写命令,放低 OLED_CS_Clr(); OLED_WR_Clr();//WR拉低再拉高产生上升沿 OLED_WR_Set(); OLED_CS_Set();//数据完成后,将CS拉高 OLED_RS_Set();//拉高 }

3、OLED更新缓存,显示内容

u8 OLED_GRAM[128][8]; void OLED_Refresh_Gram(void) {   u8 i,n;   for(i=0;i<8;i  )   {     OLED_WR_Byte(0xb0 i,OLED_CMD);//设置页面地址(0~7)     OLED_WR_Byte(0x00,OLED_CMD);//设置显示位置-列低地址     OLED_WR_Byte(0x10,OLED_CMD);//设置显示位置-列高地址     for(n=0;n<128;n  )       {        OLED_WR_Byte(OLED_GRAM[n][i],OLED_DATA);       }   } }

4、OLED画点函数

void OLED_DrawPoint(u8 x,u8 y,u8 t) {   u8 pos,bx,temp=0;   if(x>127||y>63) return;//超出范围   pos=7-y/8;   bx=y%8;   temp=1<<(7-bx);   if(t) OLED_GRAM[x][pos]=temp;   else OLED_GRAM[x][pos]&=~temp; }

5、OLED字符显示函数

///在指定位置显示一个字符,包括一些字符 //x:0~127 y:0~63 //mode:反白显示1;   size:选择字体  12/16/24 void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode) {   u8 temp,t,t1;   u8 y0=y;   u8 csize=(size/8 (size%8)?1:0))*(size/2);//得到字体对应点阵集合占据的字节数   chr=chr-   for(t=0;t<csize;t  )   {     if(size==12) temp=asc2_1206[chr][t];///调用1206字体     else if(size==16) temp=asc2_1608[chr][t];///调用1608字体     else if(size==24) temp=asc2_2412[chr][t];///调用2412字体     else return;///没有字库     for(t1=0;t1<8;t1  )     {       if(temp&0x80) OLED_DrawPoint(x,y,mode);       else OLED_DrawPoint(x,y,!mode);       temp<<=1;       y  ;       if((y-y0)==size)       {         y=y0;         x  ;         break;       }     }   } }

标签: 蓝双色二极管

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台