精华内容
下载资源
问答
  • OLED显示模块

    2018-01-26 19:58:36
    OLED屏幕显示模块。使用STM32单片机控制。修改相应引脚后可直接使用。
  • 1)什么是OLED显示模块OLED显示模块为OLED显示屏+PCB+铁框构成。 OLED显示屏是指有机电激发光二极管(OrganicLight-EmittingDiode,OLED)由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度...

    1)什么是OLED显示模块:
    OLED显示模块为OLED显示屏+PCB+铁框构成。
    在这里插入图片描述在这里插入图片描述
    OLED显示屏是指有机电激发光二极管(OrganicLight-EmittingDiode,OLED)由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。

    2)OLED显示模块特点:
    OLED为自发光材料,不需用到背光板,同时视角广、画质均匀、反应速度快、较易彩色化、用简单驱动电路即可达到发光、制程简单、可制作成挠曲式面板,符合轻薄短小的原则,应用范围属于中小尺寸面板。
      显示方面:主动发光、视角范围大;响应速度快,图像稳定;亮度高、色彩丰富、分辨率高。
      工作条件:驱动电压低、能耗低,可与太阳能电池、集成电路等相匹配。
      适应性广:采用玻璃衬底可实现大面积平板显示;如用柔性材料做衬底,能制成可折叠的显示器。由于OLED是全固态、非真空器件,具有抗震荡、耐低温(-40℃)等特性,在军事方面也有十分重要的应用,如用作坦克、飞机等现代化武器的显示终端。
    OLED显示模块较OLED显示屏优势在于便于安装,应用场合主要是工业现场,军工行业,地质勘探,石油煤炭勘探等行业。

    3)OLED显示模块使用注意事项

    a) 编程方面:☆避免或减少固定画面显示;
    ☆多上下、左右滚动等动态显示;
    ☆在没有信息输入、输出时,采用低亮度动画屏保显示或不显示

    b) 安装方面:☆ 装机时面板应保持平整,OLED 屏的 PCB 板安装孔在固定时避免受力不均匀,导致
    ☆PCB 板扭曲变形,导致 OLED 屏损坏。模块必须避免剧烈震动、冲击、挤压和从高 处掉落。
    ☆ OLED 模块避免扭动,拆卸金属钮角。
    ☆ OLED 模块避免在印有线路的工作平台上操作。

    c)清洗方面:在清理 OLED 屏表面时,请使用带溶剂(建议如下)的软布,轻轻擦拭。
    ☆ 异丙醇
    ☆ 乙醇
    ☆ 不要用干燥或者比较硬的材料擦拭,否则很容易损坏屏表面。
    以下溶剂请不要使用:
    ☆ 水
    ☆ 酮
    ☆ 芳烃

    d)严防静电
    在打开电源之前,请不要输入任何信号,清达光电推荐以下措施:
    ☆ 在装配 OLED 模块前,请不要将其从包装袋中取出,OLED 模块所使用的包装袋是
    经过防静电处理的特殊包装袋,在储存模块时也要带有包装袋储存,或者放在能充分
    接地的容器中储存。
    ☆ 操作 OLED 模块时,要始终保持操作人充分接地,使人体和模块保持同一电位。
    ☆ 在操作过程中所需的设备要充分接地,尤其是驱动器,必须良好接地,没有漏电,以
    避免干扰。
    ☆ OLED 模块表面都有一层保护膜,目的在于避免造成屏被划伤,沾染污渍等,请慢慢
    揭去 OLED 模块保护膜,如果快速揭去保护膜都将产生静电。
    ☆ 注意厂房的湿度:厂房湿度范围: 50~60%RH。

    e)电流保护装置
    OLED 模块上没有装电流保护装置,因此,在使用时应预备好电流保护装置

    f)焊接注意事项
    ☆ OLED 模块上只有输入/输出连线处可以焊接。
    ☆ 焊接所需的烙铁必须绝缘。
    ☆ 焊接条件:
    电烙铁的温度:280 ±10 ℃ ℃
    焊接时间:﹤3-4S
    焊接材料:低熔点,可充分熔化的焊锡
    为了避免 OLED 模块污染,应在焊接完成后再揭去 OLED 模块的保护膜。

    g)包装与存储 设计时要注意遮光,以免因透光而影响 OLED 的显示效果。由于 OLED 器件里的有机材料对水汽和氧气比较敏感,为了延长 OLED 的寿命,需要长时间储存时应遵循以下原则:
    ☆ 尽可能使用出厂时的原包装。
    ☆ 储存散装的 OLED 模块时,应先装入防静电袋,封口严密并真空包装。
    ☆ 为防止模块性能退化,不要暴露在高湿温环境对它直接操作或存储。
    ☆ 应保持低于 60%湿度的环境下,最佳储存温度范围为:0℃~35℃
    ☆ 不允许任何东西接触到 OLED 屏表面。

    各位客户在使用我们模块的过程中有任何疑问,请与我们取得联系清达液晶刘经理 13701081790 微信同手机号,QQ 453189731。

    展开全文
  • OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可...

    OLED的基础介绍

    OLED的定义和优势

    OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。

    OLED显示技术具有自发光的特性,采用非常薄的有机材料涂层和玻璃基板,当有电流通过时,这些有机材料就会发光,而且OLED显示屏幕可视角度大,并且能够节省电能,从2003年开始这种显示设备在MP3播放器上得到了应用。

    LCD都需要背光,而OLED不需要,因为它是自发光的。这样同样的显示,OLED效果要来得好一些。以目前的技术,OLED的尺寸还难以大型化,但是分辨率确可以做到很高。

    ALINETEK的0.96寸OLED模块

    • 模块有单色和双色两种可选,单色为纯蓝色,而双色则为黄蓝双色。单色模块每个像素点只有亮与不亮两种情况,没有颜色区分;
    • 尺寸小,显示尺寸为0.96寸,而模块的尺寸仅为27mm*26mm大小;
    • 高分辨率,该模块的分辨率为128*64;
    • 多种接口方式,该模块提供了总共4种接口包括:6800、8080两种并行接口方式、 4线的穿行SPI接口方式、IIC接口方式
    • 不需要高压,直接接3.3V就可以工作了。

    OLED模块工作模式选择

    4种模式通过模块的BS1/BS2设置(通过硬件来设置),BS1/BS2的设置与模块接口模式的关系如表所示:

    OLED四种工作模式
    接口方式 4线SPI IIC 8位6800 8位8080
    BS1 0 1 0 1
    BS2 0 0 1 1

    下面是OLED模块的具体实物图:

    ALIENTEK OLED模块默认设置是BS0接GND,BS1和BS2接VCC(8080模式),即使用8080并口方式,如果想要设置成其他的模式,则需要在OLED的背面,用烙铁修改BS0-BS2的设置。

    从模块的原理图上,我们可以看到的更加清晰:

    该模块采用8*2的2.52排针与外部连接,总共16个管脚,在16条线中,我们只用了15条,有一条是悬空的。15条线中,电源和地线占了2条,还剩下13条信号线。在不同的模式下,需要的信号线的数目是不同的,在8080模式下,需要全部的13条。

    OLED控制器为SSD1306,也就是说:裸屏由SSD1306驱动,这也是一种较为广泛使用的led驱动芯片。

     

    OLED的显示原理

    OLED8080并行接口信号线说明

    在上面,提到了本文中OLED采用8080的接口方式,其对应的并行接口图如下所示:

    接下来,就对这个并行接口的各个信号线的含义进行解释说明:

    • CS:OLED片选信号;
    • WR:向OLED写入数据;
    • RD:从OLED读取数据;
    • D[7:0]:8位双向数据线;
    • RST(RES):硬复位OLED;
    • DC(RS):命令/数据标志(0,读写命令;1,读写数据)。

    OLED8080并口读写过程

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

    • 将数据放到数据口;
    • 根据要写入/读取的数据的类型,设置DC(RS)为高(数据)/低(命令);
    • 拉低片选,选中SSD1306;
    • 接着我们根据是读数据,还是要写数据置RD/WR为低;
    • 读数据过程:在RD的上升沿, 使数据锁存到数据线(D[7:0])上;
    • 写数据过程:在WR的上升沿,使数据写入到SSD1306里面;
    • 拉高CS和DC(RS)。

    并口写时序图

    并口读时序图

    OLED模块显存

    OLED本身是没有显存的,它的显存是依赖于SSD1306提供的(之后讲解的TFTLCD是本身自带显存,利用FSMC来进行控制)。而SSD1306提供一块显存,芯片具体的讲解见下文。

    SSD1306的显存总共为128*64bit大小,SSD1306将这些显存分为了8页。每页包含了128个字节,总共8页,这样刚好是128*64的点阵大小。

    程序显示原理

    在STM32的内部建立一个缓存(共128*8个字节),在每次修改的时候,只是修改STM32上的缓存(实际上就是SRAM),在修改完了之后,一次性把STM32上的缓存数据写入到OLED的GRAM。当然这个方法也有坏处,就是对于那些SRAM很小的单片机(比如51系列)就比较麻烦了。

     

    SSD1306芯片

    SSD1306芯片简介

    SSD1306是一个单片CMOS、OLED/PLED驱动芯片可以驱动有机/聚合发光二极管点阵图形显示系统。由128 segments 和64 Commons组成。该芯片专为共阴极OLED面板设计。 

    SSD1306中嵌入了对比度控制器、显示RAM和晶振,并因此减少了外部器件和功耗。有256级亮度控制。数据/命令的发送有三种接口可选择:6800/8000串口,I2C接口或SPI接口。适用于多数简介的应用,注入移动电话的屏显,MP3播放器和计算器等。

    SSD1306芯片特性

    • 分辨率:128 * 64 点阵面板;
    • 电源:
    1. VDD = 1.65V to 3.3V,用于IC逻辑;
    2. VCC = 7V to 15V,用于面板驱动;
    • 点阵显示:
    1. OLED驱动输出电压,最大15V;
    2. Segment最大电流:100uA;
    3. 常见最大反向电流:15mA;
    4. 256级对比亮度电流控制;
    • 嵌入式128 * 64位SRAM显示缓存;
    • 引脚选择MCU接口:
    1. 8位6800/8000串口;
    2. 3/4线SPI接口;
    3. I2C接口。

    SSD1306芯片命令

    • 命令0X81:设置对比度。包含两个字节,第一个0X81为命令,随后发送的一个字节为要设置的对比度的值。这个值设置得越大屏幕就越亮。
    • 命令0XAE/0XAF:0XAE为关闭显示命令;0XAF为开启显示命令。
    • 命令0X8D:包含2个字节,第一个为命令字,第二个为设置值,第二个字节的BIT2表示电荷泵的开关状态,该位为1,则开启电荷泵,为0则关闭。在模块初始化的时候,这个必须要开启,否则是看不到屏幕显示的。
    • 命令0XB0~B7:用于设置页地址,其低三位的值对应着GRAM的页地址。
    • 命令0X00~0X0F:用于设置显示时的起始列地址低四位。
    • 命令0X10~0X1F:用于设置显示时的起始列地址高四位。

     

    STM32控制OLED

    硬件连接

    • 单片机:STM32F103ZET6
    • 模块:OLED显示模块
    • 引脚连接:

    之前的并行接口图是相对于显示屏上的引脚,而上图的并行接口图是相对于STM32的IO口的图。

    OLED_DC(RS):OV SCL(PD3)、OLED_CS:FIFO WRST(PD6)、OLED_ED:OV SDA(PG13)、OLED_WR:FIFO RRST(PG14)、OLED_RST:FIFO OE(PG15)、OLED_D0:OV D0(PC0)、OLED_D1:OV D1(PC1)、OLED_D2:OV D2(PC2)、OLED_D3:OV D3(PC3)、OLED_D4:OV D4(PC4)、OLED_D5:OV D5(PC5)、OLED_D6:OV D6(PC6)、OLED_D7:OV D7(PC7)

    • 硬件资源:指示灯DS0、OLED模块

    STM32控制程序

    • 设置STM32与OLED模块相连接的IO(设置与OLED相连的IO口设置为输出);
    • 初始化OLED模块(硬复位SSD1306、驱动IC初始化程序、开启显示、清零显存、开始显示);
    • 通过函数将字符和数字显示到OLED模块上。
    //OLED模式设置
    //0: 4线串行模式  (模块的BS1,BS2均接GND)
    //1: 并行8080模式 (模块的BS1,BS2均接VCC)
    #define OLED_MODE 	1 
    		    						  
    //---------------------------OLED端口定义--------------------------  					   
    #define OLED_CS  PDout(6)
    #define OLED_RST PGout(15) 	
    #define OLED_RS  PDout(3)
    #define OLED_WR  PGout(14)		  
    #define OLED_RD  PGout(13)	   
    //PC0~7,作为数据线
     
    #define DATAOUT(x) GPIO_Write(GPIOC,x);//输出  
      
    //使用4线串行接口时使用 
    #define OLED_SCLK PCout(0)
    #define OLED_SDIN PCout(1)
    		     
    #define OLED_CMD  0	//写命令
    #define OLED_DATA 1	//写数据
    //OLED的显存
    //存放格式如下.
    //[0]0 1 2 3 ... 127	
    //[1]0 1 2 3 ... 127	
    //[2]0 1 2 3 ... 127	
    //[3]0 1 2 3 ... 127	
    //[4]0 1 2 3 ... 127	
    //[5]0 1 2 3 ... 127	
    //[6]0 1 2 3 ... 127	
    //[7]0 1 2 3 ... 127 		   
    u8 OLED_GRAM[128][8];	 
    
    //更新显存到LCD		 
    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); 
    	}   
    }
    
    //向SSD1306写入一个字节。
    //dat:要写入的数据/命令
    //cmd:数据/命令标志 0,表示命令;1,表示数据;
    void OLED_WR_Byte(u8 dat,u8 cmd)
    {
    	DATAOUT(dat);	    
     	OLED_RS=cmd;
    	OLED_CS=0;	   
    	OLED_WR=0;	 
    	OLED_WR=1;
    	OLED_CS=1;	  
    	OLED_RS=1;	 
    } 	    	    
    	  	  
    //开启OLED显示    
    void OLED_Display_On(void)
    {
    	OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
    	OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON
    	OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON
    }
    //关闭OLED显示     
    void OLED_Display_Off(void)
    {
    	OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
    	OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF
    	OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF
    }		   			 
    //清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!	  
    void OLED_Clear(void)  
    {  
    	u8 i,n;  
    	for(i=0;i<8;i++)for(n=0;n<128;n++)OLED_GRAM[n][i]=0X00;  
    	OLED_Refresh_Gram();//更新显示
    }
    //画点 
    //x:0~127
    //y:0~63
    //t:1 填充 0,清空				   
    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;	    
    }
    //x1,y1,x2,y2 填充区域的对角坐标
    //确保x1<=x2;y1<=y2 0<=x1<=127 0<=y1<=63	 	 
    //dot:0,清空;1,填充	  
    void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot)  
    {  
    	u8 x,y;  
    	for(x=x1;x<=x2;x++)
    	{
    		for(y=y1;y<=y2;y++)OLED_DrawPoint(x,y,dot);
    	}													    
    	OLED_Refresh_Gram();//更新显示
    }
    //在指定位置显示一个字符,包括部分字符
    //x:0~127
    //y:0~63
    //mode:0,反白显示;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;
    			}
    		}  	 
        }          
    }
    //m^n函数
    u32 mypow(u8 m,u8 n)
    {
    	u32 result=1;	 
    	while(n--)result*=m;    
    	return result;
    }				  
    //显示2个数字
    //x,y :起点坐标	 
    //len :数字的位数
    //size:字体大小
    //mode:模式	0,填充模式;1,叠加模式
    //num:数值(0~4294967295);	 		  
    void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size)
    {         	
    	u8 t,temp;
    	u8 enshow=0;						   
    	for(t=0;t<len;t++)
    	{
    		temp=(num/mypow(10,len-t-1))%10;
    		if(enshow==0&&t<(len-1))
    		{
    			if(temp==0)
    			{
    				OLED_ShowChar(x+(size/2)*t,y,' ',size,1);
    				continue;
    			}else enshow=1; 
    		 	 
    		}
    	 	OLED_ShowChar(x+(size/2)*t,y,temp+'0',size,1); 
    	}
    } 
    //显示字符串
    //x,y:起点坐标  
    //size:字体大小 
    //*p:字符串起始地址 
    void OLED_ShowString(u8 x,u8 y,const u8 *p,u8 size)
    {	
        while((*p<='~')&&(*p>=' '))//判断是不是非法字符!
        {       
            if(x>(128-(size/2))){x=0;y+=size;}
            if(y>(64-size)){y=x=0;OLED_Clear();}
            OLED_ShowChar(x,y,*p,size,1);	 
            x+=size/2;
            p++;
        }  
    	
    }	   
    //初始化SSD1306					    
    void OLED_Init(void)
    { 	
     
     	GPIO_InitTypeDef  GPIO_InitStructure;
     	
     	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE);	 //使能PC,D,G端口时钟
    
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_6;	 //PD3,PD6推挽输出  
     	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
     	GPIO_Init(GPIOD, &GPIO_InitStructure);	  //初始化GPIOD3,6
     	GPIO_SetBits(GPIOD,GPIO_Pin_3|GPIO_Pin_6);	//PD3,PD6 输出高
     
     	GPIO_InitStructure.GPIO_Pin =0xFF; //PC0~7 OUT推挽输出
     	GPIO_Init(GPIOC, &GPIO_InitStructure);
     	GPIO_SetBits(GPIOC,0xFF); //PC0~7输出高
    
     	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;				 //PG13,14,15 OUT推挽输出
     	GPIO_Init(GPIOG, &GPIO_InitStructure);
     	GPIO_SetBits(GPIOG,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);						 //PG13,14,15 OUT  输出高
      							  
    	OLED_CS=1;
    	OLED_RS=1;	 
    	
    	OLED_RST=0;
    	delay_ms(100);
    	OLED_RST=1; 
    					  
    	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_WR_Byte(0x40,OLED_CMD); //设置显示开始行 [5:0],行数.
    													    
    	OLED_WR_Byte(0x8D,OLED_CMD); //电荷泵设置
    	OLED_WR_Byte(0x14,OLED_CMD); //bit2,开启/关闭
    	OLED_WR_Byte(0x20,OLED_CMD); //设置内存地址模式
    	OLED_WR_Byte(0x02,OLED_CMD); //[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;
    	OLED_WR_Byte(0xA1,OLED_CMD); //段重定义设置,bit0:0,0->0;1,0->127;
    	OLED_WR_Byte(0xC0,OLED_CMD); //设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]->COM0;N:驱动路数
    	OLED_WR_Byte(0xDA,OLED_CMD); //设置COM硬件引脚配置
    	OLED_WR_Byte(0x12,OLED_CMD); //[5:4]配置
    		 
    	OLED_WR_Byte(0x81,OLED_CMD); //对比度设置
    	OLED_WR_Byte(0xEF,OLED_CMD); //1~255;默认0X7F (亮度设置,越大越亮)
    	OLED_WR_Byte(0xD9,OLED_CMD); //设置预充电周期
    	OLED_WR_Byte(0xf1,OLED_CMD); //[3:0],PHASE 1;[7:4],PHASE 2;
    	OLED_WR_Byte(0xDB,OLED_CMD); //设置VCOMH 电压倍率
    	OLED_WR_Byte(0x30,OLED_CMD); //[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;
    
    	OLED_WR_Byte(0xA4,OLED_CMD); //全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)
    	OLED_WR_Byte(0xA6,OLED_CMD); //设置显示方式;bit0:1,反相显示;0,正常显示	    						   
    	OLED_WR_Byte(0xAF,OLED_CMD); //开启显示	 
    	OLED_Clear();
    }  
    
    int main(void)
     {	u8 t;
    	delay_init();	    	 //延时函数初始化	  
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
     	LED_Init();			     //LED端口初始化
    	OLED_Init();			//初始化OLED      
      OLED_ShowString(0,0,"ALIENTEK",24);  
    	OLED_ShowString(0,24, "0.96' OLED TEST",16);  
     	OLED_ShowString(0,40,"ATOM 2015/1/14",12);  
     	OLED_ShowString(0,52,"ASCII:",12);  
     	OLED_ShowString(64,52,"CODE:",12);  
      
    	OLED_Refresh_Gram();		//更新显示到OLED 
    	t=' ';  
    	while(1) 
    	{		
    		OLED_ShowChar(48,48,t,16,1);//显示ASCII字符	   
    		OLED_Refresh_Gram();
    		t++;
    		if(t>'~')t=' ';
    		OLED_ShowNum(103,48,t,3,16);//显示ASCII字符的码值 
    		delay_ms(500);
    		LED0=!LED0;
    	}	  
    	
    }

    STM32控制程序分析

    OLED_Refresh_Gram()函数:更新显存到OLED。

    在STM32内部定义了一个块GRAM:

    u8 OLED_GRAM[128][8];

    此部分GRAM对应OLED模块上的GRAM。在操作的时候,我们只需要修改STM32内部的GRAM,然后通过OLED_Refresh_Gram()函数将GRAM一次性刷新到OLED的GRAM中。

    	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); 
    	} 

    函数的具体内容先设置页地址,然后写入列地址,然后从0开始写入128个字节,这样就将一页的内容刷新过去。重复8次,将8页的内容全部刷新过去。

    OLED_WR_Byte()函数:向SSD1306写入数据或命令(参数cmd为1时表示数据,为0时表示命令)。这里的步骤是和上文中8080并口写时序图的步骤基本类似。具体为:

    void OLED_WR_Byte(u8 dat,u8 cmd)
    {
    	DATAOUT(dat);	    
     	OLED_RS=cmd;
    	OLED_CS=0;	   
    	OLED_WR=0;	 
    	OLED_WR=1;
    	OLED_CS=1;	  
    	OLED_RS=1;	 
    } 	

    首先通过DATAOUT()函数将数据放到数据口,其中DATAOUT()是一个宏定义:

    #define DATAOUT(x) GPIO_Write(GPIOC,x);//输出  

    其次,在判断cmd参数是命令还是数据,如果是命令,DC置高;如果是数据,DC置低。接下来,拉低片选,将WR拉低再拉高产生一个上升沿。这样数据就写入到了控制器。最后,拉高片选、DC。

    OLED_DrawPoint()函数:画点函数,这里有一个对应关系需要理解。

    OLED_GRAM[128][8]中的128代表列数(x坐标),而8代表的是页,每页又包含8行,总共是64行(y坐标)。从高到低对应行数从小到大。比如,我们要在x=100,y=29这个点写入1,则可以用这个句子实现:

    OLED_GRAM[100][4]=1<<2;

    一个通用的点(x,y)置1的表达式为:

    OLED_GRAM[x][7-y/8]=1<<(7-y%8);

    其中,x的取值范围为0-127;y的取值范围为0-63。

    OLED_ShowChar()函数:显示字符。这里的字符采用16*8的显示方式,也就是说在OLED上16*8数目大小的点阵表示一个字符,即128个点。

    下面截取了一部分16*8的字符库的内容,一个字符用16个u8类型的数字表示:

    {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
    {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xCC,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/
    {0x00,0x00,0x08,0x00,0x30,0x00,0x60,0x00,0x08,0x00,0x30,0x00,0x60,0x00,0x00,0x00},/*""",2*/
    {0x02,0x20,0x03,0xFC,0x1E,0x20,0x02,0x20,0x03,0xFC,0x1E,0x20,0x02,0x20,0x00,0x00},/*"#",3*/
    {0x00,0x00,0x0E,0x18,0x11,0x04,0x3F,0xFF,0x10,0x84,0x0C,0x78,0x00,0x00,0x00,0x00},/*"$",4*/
    {0x0F,0x00,0x10,0x84,0x0F,0x38,0x00,0xC0,0x07,0x78,0x18,0x84,0x00,0x78,0x00,0x00},/*"%",5*/
    {0x00,0x78,0x0F,0x84,0x10,0xC4,0x11,0x24,0x0E,0x98,0x00,0xE4,0x00,0x84,0x00,0x08},/*"&",6*/

    具体的显示方式如下图所示:

    从上到下,从左到右,高位在前。就是这样的取模方式,将字符集按照16*8的大小取模出来。1表示亮,0表示暗。

    显示字符函数的具体实现:

            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;
    			}
    		}  

    这里也是按照从上到下,从左到右的取模方式来进行的。先得到最高位,然后判断是写1还是0,画点;接着读第二位,如此循环,直到一个字符的点阵全部取完为止。这里涉及到的列地址和行地址的自增,不难理解。

     

    展开全文
  • 1.5英寸彩色OLED显示模块以集成SSD1351驱动的UG-2828GDEDF11为核心,采用底板+屏蔽方式,并通过FPC端子连接,更换方便。 该模块支持4种通信方法(由S1,S2焊盘修改):3-WireSPI,4-WireSPI,6800(8位),8080(默认...
  • 1.27英寸彩色OLED显示模块以集成SSD1351驱动的UG-2828GDEDF11为核心,采用底板+屏幕模式,并且通过FPC端子连接,易于更换。 该模块支持4种通信方法(由S1,S2焊盘修改):3-WireSPI,4-WireSPI,6800(8位),8080...
  • ATK-0.96’OLED 显示模块

    2018-07-22 17:37:50
    ATK-0.96’ OLED 模块是 ALIENTEK 推出的一款小尺寸(0.96 寸)、高亮、自带升压电路的高性能 OLED 显示模块, 分辨率为 128*64, 该模块采用原装维信诺高亮 OLED 屏,采用SSD1306 驱动 IC,该芯片内部集成 DCDC 升压...
  • STM32F103驱动0.96寸OLED显示模块,采用SPI驱动
  • 【正点原子】0.96寸OLED显示模块资料.zip 包括原理图 用户手册 数据手册和各个版本的程序示例。
  • OLED显示模块驱动原理及应用

    万次阅读 多人点赞 2018-12-10 10:15:03
    OLED显示模块驱动原理及应用   本文以中景园OLED显示模块为例,介绍模块的应用和OLED显示及驱动的基本原理。文中介绍了显示模块、SSD1306驱动芯片以及GT20L16S1Y字库芯片相关技术内容及原理,并加上了作者的理解...

    OLED显示模块驱动原理及应用

     

    本文以中景园OLED显示模块为例,介绍模块的应用和OLED显示及驱动的基本原理。文中介绍了显示模块、SSD1306驱动芯片以及GT20L16S1Y字库芯片相关技术内容及原理,并加上了作者的理解和应用记录。

    一、 模块介绍

    1.   OLED显示屏基础

    显示屏的发光单元是有机聚合物发光二级管,即organic/polymer light emitting diode,简称 OLED。单色屏的一个像素就是一个发光二极管。OLED是“自发光”,像素本身就是光源,所以对比度极高,显示效果很犀利,绝无朦朦胧胧、拖泥带水之感,深受爱好者追捧,可惜当前技术所限,无法大尺寸化,价格也比TFT液晶屏高得多。

    OLED分PMOLED、AMOLED两种,PMOLED为无源驱动,AMOLED为有源驱动。本文介绍的模块显示屏为PMOLED。

     

    2.         模块基本信息

    模块外观如图1,型号为QG-2864KLBEG01,尺寸见图2。本模块显示颜色为1/4黄+3/4蓝,但仍属于单色屏,另有“蓝+白”组合色可选。模块接口为8个插针,针脚定义已印在板上,使用串行SPI协议。因为板载稳压芯片U2,模块供电电压可以是3-5V。模块自带中文字库芯片。

    OLED显示模块驱动原理及应用



    图1.模块正面及反面

    OLED显示模块驱动原理及应用



    图2.模块尺寸图

     

    3.   模块器件及元件简介

      1)  OLED显示屏:128*64点阵OLED单色屏。下文简称为显示屏、屏、OLED屏。

      2)  SSD1306驱动芯片:模块上直接看不到,芯片封装在显示屏背面玻璃基板上。

      3)  GT20L16S1Y字库芯片:内部固化了8套字符的点阵数据,90%的容量都用来存储中文字库。

      4)  接口及电源配置电路:8路插针,板载低压差降压稳压芯片662K。

      5)  PCB板及若干外围电阻电容元件。模块厂家已做好外围电路,不用再操心硬件电路。

     

    4.   模块电路图

     

    OLED显示模块驱动原理及应用
     

    图3、模块电原理图

     

    供电:模块供电输入端为VCC_IN,经U2降压后供U1、U4等电路。OLED屏驱动需要7-7.5V电压,由SSD1306内置电荷泵升压后提供。

    接口:SSD1306支持并行、SPI及I2C等串行协议,本模块通过BS0-BS2这三个引脚接地,已设置为SPI协议,与U4汉字库芯片共享SPI接口,工作时通过芯片的片选引脚来区分,读写时应将目标芯片的CS引脚置为低电平。

    其他外围电路:R5=910K,设置恒流源参考电流;R6、R7为数据线上拉电阻;RES#接复位电路,其他电路参见驱动芯片数据手册。

     

    二、 显示屏及驱动的电气连接

     

    1.  显示屏尺度及引脚

    本模块显示区域尺寸为:宽21.744毫米,高10.864毫米,因此有效显示面积为2.36平方厘米,作为对比,一元硬币的面积为4.9平方厘米,整个模块也仅一个硬币大小,不要被网上放大的图片所误导。就在这2.36平方厘米的面积里,做进了8192个发光二级管,每个发光点就是一个像素,这些点组成了一个“阵列”,因此也叫“点阵”。点阵分成128列,64行,每个像素尺寸仅0.154*0.154毫米,像素间距0.016毫米。进入这种尺度,用微米作单位更合适。

    OLED显示模块驱动原理及应用

     

     

    图4.显示屏像素示意图

     

    显示屏有8192个像素,每个发光点都有正负两个电极,全部引出8192*2个驱动电极是不现实的,实际做法是把每列的正极都接在一起引出一个电极,定义为一个段(SEG),把每行的负级接在一起引出一个电极,定义为一个公共极(COM),这样128*64的点阵,只需要引出128个段引脚、64个公共极引脚、一共有192个引脚就可以了。

     

    2.   驱动芯片的尺度及引脚

    驱动芯片SSD1306尺寸很小,只有6.76X0.86毫米,长条形,四周一圈上有281个引脚,为提高导电率,这些引脚都是镀金的,可能是纯金的,厚度也就几个微米。这些引脚很瘦弱,尺度在30-80微米间。芯片上的几个十字形或圆孔形的对标孔,是安装时与玻璃基板上电极精确定位用的。

     

    OLED显示模块驱动原理及应用



    图5. 驱动芯片SSD1306尺寸示意图

     

    281个引脚中,192个引脚就是专门伺候那块屏的,还有30个引脚通过 “柔性电路板”接在本模块的印制线路板上,相关外围器件均已焊接好。仅有4个脚最终通过模块的插针提供给用户:数据、时钟、片选和指令数据脚,简化了使用。其他一些引脚用于供电,还有一些未被使用。

     

    3.   COG封装技术

    驱动芯片与显示屏的192路“微米”级电气连接,传统PCB布线只能羞愧退场,代之于COG封装技术,即clip on glass,安装时,引脚一一对应后,通过热压方式直接把芯片“粘”在屏的玻璃基板上。这个粘芯片的粘合剂称为ACF,是一种各向异性的导电胶,在垂直方向上导电、而在水平方向绝缘。ACF技术细节不太清楚,但好处显而易见:可以整排引脚涂胶而不用担心电极间短路。

    30个控制引脚,是用柔性印刷线路板(FPC)接出来的,FPC的引出端可以做成一个插头,连接到线路板或其他部件的插座上,也可以直接焊接到线路板上。本文介绍的模块就是直接焊接到线路板上的。下图是网上的示意图,并非本模块FPC。

    OLED显示模块驱动原理及应用


    图6. 柔性印刷电路板FPC 样图

     

    三、 驱动原理及技术要点

    1、 驱动技术要点

    OLED屏天生丽质,驱动技术功不可没。事实上,材料及工艺缺陷的克服,显示效果的灵活多变,外围电路及操作的简化,全都依赖驱动电路设计。以本模块的驱动芯片SSD1306为例,其技术要点罗列如下,相关内容在文中各处详细介绍。

    1)  行列式点阵扫描驱动:矩阵显示屏动辄上万像素的分辨率,除扫描驱动,别无选择。

    2) 像素恒流驱动:OLED发光亮度与驱动电流有较好的线性关系。而电压与亮度呈幂级数关系,控制电路不易实现。

    3) 预充电技术:因寄生电容影响,OLED屏各像素点亮不同步,预充电技术解决此问题。

    4) 预放电技术:各像素寄生电容电压不一致,电压过高会造成恒流驱动时无法准确控制其亮度,造成显示屏亮度不均匀。

    5)  反向抑制技术:行列电极公用,会导致交叉效应,功能薄膜相连造成临近像素串扰,交叉和串扰效应会导致暗点发弱光,影响对比度。解决办法是加上反向电压来抑制。

    6) 电荷泵技术:OLED面板恒流驱动时需要7-15V电源,电荷泵是一个升压电路。

    7) 帧同步写入技术:该技术防止外部MCU写入数据速度滞后于帧频而造成一屏显示内容被撕裂的情形。

    8) 多种显示方式:部分显示、顺序或隔行显示、行列倒置、256级对比度控制、水平及垂直滚动显示、写入换行次序定义等,均有专门操作指令,支持丰富的显示效果需求。

    当然,驱动芯片技术远不止上述所列,上述技术可帮助我们理解及应用模块。

     

    2、 点阵屏扫描驱动的基本原理


    OLED显示模块驱动原理及应用
     

    图7、显示点阵示意图

     

    点阵屏像素按128列X64行组织,每一行128个像素单元的阴极是连接在一起,作为公共极(COM),每一列64个像素单元的阳极也连接在一起,作为一段(SEG)。行列交叉点上的LED就是一个显示单元,即一个像素。要点亮一个像素,只要在该像素所在列电极上加上正电压、行电极接地。同样,要驱动一整行图像,就需要同时把128列信号加载到列电极上,把该行行电极接地。该行显示时,其他63行均不能显示,其行电极应为高电平或悬空。

    可见,整屏的显示,只能分时扫描进行,一行一行的显示,每次显示一行。行驱依次产生低电平扫描各行,列驱动读取显示数据依次加载到列电极上。扫描一行的时间称为行周期,完成一次全屏扫描,就叫做一帧。一般帧频为大于60,因此人眼观察不到逐行显示。每行扫描显示用时叫占空比,占空比小,为达到相同的显示亮度,驱动电流就大。SSD1306段驱动最大电流为100uA,当整行128个像素全部点亮时,行电极就要流过12.8mA的电流。

     

    3、 OLED工艺问题及解决技术

    OLED工艺上存在两个问题,一个是寄生电容,第二个是“单元串扰”。

    先分析寄生电容的影响。一个像素的等效电路为一个发光二极管和一个电容并联,这个电容不是真正的器件,而是寄生电容,其容量约在22PF左右。一般要点亮一个OLED二极管,需要在阳极和阴极间加上大概4V左右的电压,这个电压叫开启电压,与制造材料有关。但寄生电容的存在,电源先要对电容充电,两端电压达到或超过二极管的开启电压后,二极管才会点亮。

    OLED显示模块驱动原理及应用

     

    图8、显示单元等效电路

     

    寄生电容的存在,一是造成显示反应速度变慢;二是造成屏幕亮度不均,其原因是各寄生电容内电压不一致。AMOLED屏驱动电路解决办法是“预充电”,即对面板上所有寄生电容进行预充电,充到略低于二极管开启电压,当驱动信号到达时,无需等待即可点亮。PMOLED驱动电路的解决办法分3步走,不管电容原有电压高低,先全部放电,再统一充电到相同电压,最后加显示驱动信号。

    第二个问题是“单元串扰”,即一个像素加载驱动电压或电流点亮,感应电压造成隔壁像素甚至同行同列像素微弱发光,这是OLED平面工艺的胎病,只能在驱动技术上动脑筋。解决办法是“反向抑制”,即对当前不显示的所有行加上反偏电压,即行电极(COM)加正电压Vcomh,当列电极驱动信号为0时,列电压接地,反压就是Vcomh。当列电极驱动信号为1时,列电极处于恒流驱动,列电压约在4V-Vcc间,此时反向抑制电压较小或接近于0,但不管反压大小,都能确保感应电荷及时被反压旁路掉。Vcomh可通过指令调节为Vcc 的0.65、0.77、0.83倍。

     

    4、 行周期中的段驱动信号分析

    有了上面的分析,就不难理解驱动芯片SSD1306数据手册中的“段输出波形图”。该图描述的是扫描某一行时,加载到列电极上的“段信号”波形。

    OLED显示模块驱动原理及应用
     

    图9、列(段)驱动信号3阶段

     

    信号分成3个阶段,分别是放电、充电、恒流驱动,如上图标注1、2、3所示,每个阶段驱动信号的类型是不同的,时间长短也不同。因而其电路也较复杂,见图10所示。

    阶段1:放电阶段,行列电极均接地,电容两端同电位,电容放电。放电时间可以通过指令调节,这跟电路内阻、电容大小有关,SSD1306默认为2DCLK。

    阶段2:充电阶段,行电极接地,列电极接到一个略小于二极管开启电压的固定电压端进行充电,充电时间也可以通过指令调节,SSD1306默认也是2DCLK。

    阶段3:充电结束后进入恒流驱动阶段,这个阶段持续50DCLK。需点亮像素被恒流源持续驱动,截止像素的列电极接地。

    驱动电流从0-100uA分256极可调,调节电流就是调节亮度,不支持单个像素的灰度显示。

     

    OLED显示模块驱动原理及应用

     

    图10、驱动示意图(图片来源:OLED显示驱动及原理)

     

    非扫描行的行电极接Vcomh时,各像素反偏,感应电被及时释放,就不会出现串扰现象。

    假设帧频为100HZ,扫描一帧的时间就是10ms,一帧包括64行,每行扫描用时即行周期就是156us,每个行周期又分成54个显示时钟(DCLK),每个显示时钟为2.9us,预放电、充电都是占2个DCLK,为5.8us。DCLK可通过调节“振荡频率”及“分频因子”来调整,从而也调整了帧频。

     

    四、 GDDRAMOLED屏的对应关系

    1.     GDDRAM的作用

    GDDRAM用于存储显示数据,用户通过MCU把数据写入RAM,同时向SSD1306发送相应的显示命令,驱动芯片会按用户指令要求自动进行逐帧扫描显示。与OLED屏128X64像素点阵对应,1个像素对应1个存储bit,因此 SSD1306驱动芯片内建1024字节的SRAM。

     

    2.    GDDRAM的逻辑结构

    GDDRAM的逻辑存储结构是按页来组织的,相应地,OLED屏像素点阵空间也把每8行组织成1页,但128个列不作划分。整个显示区域(存储空间)被划分成8个“页”,每页8行、128列,每页对应128个字节,每个字节按竖向排列的,低位在上,高位在下,下图是第2页的存储映像示意图。

    OLED显示模块驱动原理及应用
     

    图11、页的存储结构示意图

     

    “页”的划分是方便于显示字符图形,一页8个像素的高度可以显示一个ASC字符,两页合起来16个像素高度,正好可显示一个16X16像素点阵汉字。这样写数据就很方便,如要显示一个5X7尺寸的ASC字符,可连接写5个字节。要显示一个16X16的汉字,就需要在2页上分别写16个字节。如果字节的各位横向排列,每一个字节都要定位,无法连续写入。

     

    3.         驱动电路细节

    然而,GDDRAM与屏点阵的映像关系不是固定不变的,两者之间的桥梁就是驱动电路,依赖对操作指令的硬件译码,驱动电路提供了灵活的显示方式。理解驱动细节是理解多数指令的关键。SSD1306数据手册给出的驱动逻辑图较为简单,结合逻辑图及指令可分析驱动的一些实现细节。

     

     OLED显示模块驱动原理及应用
     

    图12、驱动电路功能逻辑示意图

     

    行(公共极)驱动:行驱动产生周期性脉冲,负责逐行扫描。扫描顺序既支持从COM0到COM63的正向扫描,也支持从COM63-COM0的反向扫描。从上图可见,行驱动是分成两部分的,可实现逐行/隔行、顺序/交叉等不同的扫描方式。

    列(段)驱动:段驱动加载SRAM中当前行的128列显示数据,通过图10所示的切换开关,先后切换到放电、充电及恒流驱动的输出电路上,完成一行的扫描周期。同行驱动一样,0-127路段信号既可以顺向加载,也可以反向加载。

    行、列驱动的正/反方向扫描或加载设计,可以很方便地让用户实现显示内容的变换:行列同时反向,显示内容倒置,即旋转180度;仅行或仅列反向,显示内容在行或列方向上镜像。旋转90度是做不到的,除非在软件中重组整个SRAM的映像。

    驱动电路还能显示部分行,而屏蔽掉另一部分;当然也能有选择地加载SRAM中的数据。

     

    五、 SSD1306的指令系统解析

    1.         指令表

    有了前述显示驱动电路的原理分析,就不难理解SSD1306的指令。指令一共有23条,按功能分为五类。这些指令长短不一,短的为单字节指令,最长的为6字节指令。下面举例说明指令的格式:

    第1条指令是一条亮度控制指令,格式为81,A[7:0],有2个字节,第一个字节为81H,第二个字节表述为A[5:4],是一个用户自定义参数的字节,其中A仅表示本条指令的第1个参数字节,如果是第2个参数字节则用B表示,注意这个A、B不是16进指令数值;[5:4]表示该字节的第5、第4位,这两位是可以设置参数的,该字节的其他6位取值需要查指令表,可能被明确定义为0或1,也可能取值无关(用*表示)。

     

    SSD1306指令表:

    指令类别

    指令名称

    指令代码(H)

    指令作用简介

    基础指令

    1.     亮度控制

    81,A[7:0]

    参数A[]可设置256级亮度

    2.     全显开关

    A4/A5

    A4正常显示,A5点亮全部像素

    3.     反白开关

    A6/A7

    A6正常显示,A7反白显示

    4.     显示开关

    AE/AF

    AE关闭显示,AF打开显示

    显示滚动

    5.     水平滚动

    26/27,00,B[],C[],D[],00,FF

    26水平右滚,27水平左滚

    6.     双向滚动

    29/2A,00, B[],C[],D[],E[]

    垂直+水平右/左滚动

    7.     关闭滚动

    2E

     

    8.     启动滚动

    2F

     

    9.     垂直滚动区域

    A3,A[],B[]

    A[]区域锁定不动,B[]区域滚动

    地址设置

    10.  起始列地址低

    00~0F

    2个4位合成一个字节作为列指针,页模式下指定显示内容的列位置

    11.  起始列地址高

    10~1F

    12.  地址模式

    20,A[]

    3种模式:页,水平,垂直

    13.  列(起止)地址

    21,A[],B[]

    水平或垂直模式时,指定行列起止地址来描写一块连续写入存储区域

    14.  页(起止)地址

    22,A[],B[]

    15.  页起始地址

    B0~B7

    页模式下,指定要写入的页

    硬件配置

    16.  显示起始行

    40~7F

    从RAM中哪一行起读取显示内容

    17.  段重映像

    A0/A1

    A1:列显示次序反向

    18.  行扫多路系数

    A8,A[]

    设置只扫描哪些行(16~64)

    19.  行扫方向

    C0/C8

    C8:行扫描次序反向

    20.  行扫偏移

    D3,A[5:0]

    公共极(垂直)方向移动A[]行

    21.  行扫配置

    DA,A[]

    4种组合,再结合行扫方向有8种

    22.  升压泵开关

    8D,A[]

    打开或关闭内置升压泵

    时序设置

    23.  时钟分频

    D5,A[]

    16级振荡频率及16级分频设置

    24.  充放电周期

    D9,A[]

    16级充电、放电周期设置

    25.  Vcomh反压

    DB,A[]

    3级反向截止电压设置

    26.  空操作

    E3

     

    上表中,指令名称作了意译处理,并对指令功能作了简单的描述。具体用法、参数含义可查阅数据手册。

     

    2.         初始设置及基本操作类指令

    上表中,基础类指令及时序设置类作用及原理多在前文中述及。第2条“全显开关”可用以测试全屏像素。第22条打开SSD1306的内置升压泵后,可将5V电压升到7.5V供OLED显示屏使用。第23-25条跟屏的生产批次有关,出厂后厂商会提供建议参数。

    OLED显示模块驱动原理及应用
     

    3.         地址设置类指令

    要在屏上显示字符,首先要指定位置,这个位置就是“地址指针”,分成行指针和列指针。列指针可以128列中随意选定,但行指针不能指定0-63的任意一行,只能按“页”指定。地址模式是指连续写入数据的方式,分为“页、水平、垂直”3种不同的地址模式。

    “页地址模式”可以本页内连续写入字节,需发送的指令顺序为:确定模式、确定页指针、确定列起始地址指针(依次为上表第12、15、10、11行指令),然后就逐个字节连续写入。“页地址模式”下既可以写整行,也可以在该页的任意一列起写1到多个字符,是最灵活的写入方式。

    OLED显示模块驱动原理及应用

     

    图13、页地址模式的指针移动示意图

     

    “水平地址模式”与“垂直地址模式”,可以在整个屏中划出一块行列区域,然后连续写入数据。指定该区域需要4个指针:页起始、页结束、列起始、列结束,分别通过第14、13条指令来实现。指定后整块区域可连续写入,水平模式是“写完一页再写下一页”,垂直模式则是“写完一列再写下一列”,但不管是水平还是垂直模式,还是按页的结构来组织字节的。

    OLED显示模块驱动原理及应用

     

    图14、水平地址模式的指针移动示意图

     

    OLED显示模块驱动原理及应用

     

    图15、垂直地址模式的指针移动示意图

     

    4.         硬件配置类指令

    这类指令的功能表述最不清楚,实际上跟滚动操作一样,都是对灵活显示的支持。

    1)  第18条:行扫描多路系数

    这个指令让驱动电路只扫描一部分行,系数N可以设置为15-63,对应可扫描16-64行。下图分别是扫描16行、32行、49行的效果。扫描行越少,帧频就越高,亮度也就高。

    OLED显示模块驱动原理及应用 

    2)  第16条:显示起始行、第20条:行扫偏移

    这两条指令的显示效果类似,只是驱动内部实现不同。行扫描偏移是通过重构COM电极输出来实现,而起始行设置是RAM读取地址的偏移来实现。

    OLED显示模块驱动原理及应用

    3)  第17条:段重映像,第19条:行扫方向

    OLED显示模块驱动原理及应用

     4)   第21条:行扫配置

    本条指令最复杂,参数A[5:4]包括2个开关,A[4]为是否奇偶配置COM,A[5]为是否左右交换配置COM。这个需要结合图10来理解,SSD1306的64个COM电极,并非按0-63的自然顺序连接到显示屏,而是分为左右两组,左边一组为奇数电极,右边为偶数电极。所谓左右,是指这个逻辑图而言,这些COM极反映到屏上就是行,左右也就变成上下了。

    当A[4]=0时按顺序配置COM极,显示数据发送到奇数行显示,结果造成“隔行显示”效果,如下图1,2行汉字就可满屏。继续读取数据,就发送到偶数行上屏,奇偶显示重叠就无法看清,如图2。当A[4]=1时按替换方式配置COM电极,数据一奇一偶交替上屏,显示正常。

    A[5]是COM左右交换配置开关。当A[5]=0为禁止COM左右交换,相当于正常显示。A[5]=1为允许COM左右交换,结果得到下图3的显示效果,这个图让人费解。看数据手册还以为2组COM可以整体交换,这样显示效果就是上2行汉字与下2行汉字整体交换位置,但事实上是相邻奇偶行交换,即1234……交换为2143……,暂未发现这种交换的实用价值。

    OLED显示模块驱动原理及应用

    行扫配置可以和行扫方向配合使用,这样就有8种组合,手册上有一堆示意图,让人头晕目眩。

     

    5.         滚动类指令

    所谓滚动,就是“循环移动”,包括水平方向滚动和水平垂直同时滚动,但没有单独的垂直滚动。滚动时可以向左也可以向右。滚动时可以单行内容滚动,也可以指定部分区域的内容滚动。从指令中“关闭滚动要恢复原数据需要重写”来看,滚动实现的内部操作可能是直接修改DDRAM相关单元的数据。

    OLED显示模块驱动原理及应用

    图片中的字体在滚动时出现重影,并非OLED显示迟滞,而是拍摄设备的曝光时间不够所致。另外,发送行扫描相关指令后,显示效果直接发生变化,但发送列重映像指令,显示并不变化,需要重写数据。

     

    本文主要介绍了OLED屏的显示及驱动原理,在理解原理的基础上,就可以比较充分地理解驱动相关指令。汉字库原理、应用及相关例程待后续介绍。

     

     

    转自:http://blog.sina.com.cn/s/blog_57ad1bd20102wtq8.html

    展开全文
  • 本文介绍了OLED显示模块P13501与AT91RM9200的接口电路设计,以及在嵌入式Linux下OLED驱动程序的编写、编译和加载。该电路和驱动已成功应用于一控制系统中系统参数的显示,效果良好;配合简单的矩阵扫描式键盘,还...
  • STM32F103驱动0.96寸OLED显示模块,采用IIC驱动
  • OLED显示模块(7PIN)教程资料-技小新-(技小新)0.96'OLED模块-7Pin-产品手册.pdf
  • OLED显示模块(7PIN)教程资料-技小新-(技小新)0.96寸OLED模块-7PIN-原理图.pdf
  • 摘要:OLED作为新一代显示技术,广泛用于各种仪器仪表的显示终端,实时显示字符、汉字、曲线等信息。...关键词:点阵显示模块 OLED C8051F 接口设计  有机发光显示OLED(Organic Light Emitting Disp
  • MOD-OLED-128x64 MOD-OLED-128x64是具有UEXT连接器的低功耗OLED显示模块
  • 0.91OLED模块以SSD1306作为主芯片,像素为128 * 32, 通讯方式是IIC, IIC地址默认为0x78, 界面很简单, 该模块具有稳压芯片, 支持3.3V〜5V电压供电 开机后自动复位, 自发光自由视角 低功耗。 兼容3.3V或5V电源...
  • OLED显示模块(7PIN)教程资料-技小新-(技小新)0.96寸OLED模块-7Pin-学习手册(STM8S版).pdf
  • OLED显示模块(7PIN)教程资料-技小新-STM32F103VET6驱动OLED(模拟SPI).rar
  • OLED显示模块(7PIN)教程资料-技小新-STM8S105C6T6_OLED(硬件SPI).zip
  • OLED显示模块(7PIN)教程资料-技小新-STM8S105C6T6_OLED(模拟IIC).zip
  • OLED显示模块(7PIN)教程资料-技小新-STM8S105C6T6_OLED(硬件IIC).zip
  • 近年来,智能控制已经广泛应用于烟叶烘烤系统中。由于烘烤自控系统通常在高温、甚至夏日强光环境下运行,并且烟叶烘烤工艺复杂,烘烤...OLED 是发展前景的新一代显示技术,与 LCD 显示技术相比,OLED 具有超轻薄、高亮
  • 0.96oled显示模块资料

    2015-04-12 16:50:18
    模块显示资料代码手册
  • 字符型低温OLED显示模块HCS1625是一款可以显示32个字符(2行,每行显示16个字符)的自带西文字符库的OLED显示模块,工作温度可以-40~80℃,适合工业现场,并且普通单片机可以直接驱动和控制,下面是51单片机控制参考...

    字符型低温OLED显示模块HCS1625是一款可以显示32个字符(2行,每行显示16个字符)的自带西文字符库的OLED显示模块,工作温度可以-40~80℃,适合工业现场,并且普通单片机可以直接驱动和控制,下面是51单片机控制参考电路(使用了IO口模拟I2C时序):
    在这里插入图片描述基于此电路下的参考程序如下:
    #include<reg51.h>
    #include <string.h>
    #include <intrins.h>
    #include <math.h>
    #define uchar unsigned char
    #define uint unsigned int
    sbit SCL =P1^0;
    sbit SDA =P1^1;
    uchar code tab1[]={“0123456789ABCDEFGHIJ”};
    uchar code tab2[]={“0123456789ABCDEFGHIJ”};
    uchar code tab3[]={" Tel:13701081790 "};
    uchar code CGR[]={ 0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,//隔列1
    0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,//隔行1
    0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,//隔列2
    0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,//隔行2
    0xff};
    //清达光电编写,有问题可以及时联系我们13701081790刘经理
    /******************************************************************
    延时子程序
    *****************************************************************/

    void delay(uint z)
    {
    uint x,y;
    for(x=z;x>0;x–)
    for(y=124;y>0;y–);
    }

    void del(void)
    {
    nop(); nop();
    }

    void start(void)
    {
    SDA=1;del();
    SCL=1;del();
    SDA=0;del();
    SCL=0;del();
    }

    void stop(void)
    {
    SDA=0;del();
    SCL=1;del();
    SDA=1;del();
    }

    void ack(void)
    {
    uchar i=0;
    SCL=1;
    del();
    SCL=0;
    del();
    }

    void wr_byte(uchar b)
    {
    uchar i;
    for(i=0;i<8;i++)
    {

    SCL=0;del();
    SDA=b&0x80;del();
    b=b<<1;
    SCL=1;del();
    SCL=0;del();
    }
    SDA=1;del();

    ack();
    }

    void wr_data(uchar b)
    {
    start();
    wr_byte(0x78);
    wr_byte(0x40);
    wr_byte(b);
    stop();
    }

    void wr_com(uchar com)
    {
    start();
    wr_byte(0x78);
    wr_byte(0x00);
    wr_byte(com);
    stop();
    }

    /******************************************************************
    定位地址(一个地址对应5*8字符和)
    x–> 水平方向地址数(0~39) ;y–> 垂直方向字符数(0~1);
    *****************************************************************/

    void dot(uchar x,uchar y)
    {
    if(y) x|=0x40;
    x|=0x80;
    wr_com(x);
    }
    /******************************************************************
    自定义字符形成;
    **/
    void CGR_SET(uchar code s)
    {
    uchar i=0;
    while(s!=0xff)
    {
    wr_com(0x40+i);
    wr_data(s);
    s++;
    i++;
    }
    }
    /

    全屏;
    *****************************************************************/
    void fill(uchar z) //全屏
    {
    uchar x,y ;
    for(y=0;y<2;y++)
    for(x=0;x<20;x++)
    {
    dot(x,y);
    wr_data(z);
    }
    }

    /******************************************************************
    清屏;
    *****************************************************************/

    void clear(void)
    {
    wr_com(0x01);delay(5);
    }

    /******************************************************************
    字符的输入(5*8)
    x–> 水平方向地址数(0~39) ;y–> 垂直方向字符数(0~1);s–>字符代码首地址;
    *****************************************************************/
    void en_c_r(uchar x,uchar y,uchar code * s)
    {
    dot(x,y);
    while(*s>0&&x<20)
    {
    wr_data(*s);
    s++;
    x++;
    }
    }

    /******************************************************************
    初始化设置;
    *****************************************************************/

    void init(void)
    {
    RS=0;

    delay(50);

    // RES=1;delay(5);
    // RES=1;delay(5);
    // RES=1;delay(5);

    wr_com(0x38);
    delay(5);
    wr_com(0x38);
    delay(5);
    wr_com(0x38);

    wr_com(0x38);
    wr_com(0x08);
    wr_com(0x01);
    wr_com(0x06);
    wr_com(0x0c);
    }

    /******************************************************************
    主程序;
    *****************************************************************/
    int main(void)
    {
    init();
    CGR_SET(CGR);
    while(1)
    {
    fill(0x00);delay(700);
    fill(0x01);delay(700);
    fill(0x02);delay(700);
    fill(0x03);delay(700);
    fill(0x1f); delay(500);//全显
    fill(0x20); //清屏
    clear();
    en_c_r(0,0,tab1);
    en_c_r(0,1,tab3); delay(2000);
    }
    }

    展开全文
  • OLED显示模块(7PIN)教程资料-技小新-STM8S105C6T6_OLED(模拟4-WireSPI).zip
  • 0.96'OLED(4Pin)模组以SSD1306为主要晶片, 像素为128 * 64, 通信方式可以选择SPI或IIC(地址默认为0x78), 该引脚与IIC完全兼容(也就是说,在IIC模式下, 只能连接4条线), 默认为4线SPI通信模式, 自发光...
  • 0.96'OLED(7Pin)模块使用SSD1306作为主芯片, 像素为128 * 64, 通信方式可以选择SPI或IIC(地址默认为0x78), 该引脚与IIC完全兼容(即在IIC模式下, 只能连接4条线), 默认为4线SPI通信模式, 自发光自由视角 ...
  • 以中景园电子科技的IIC应答例程为基础修改而成。包括ASCII字符显示、字符串显示、数字显示、汉字显示...目前在STC15W408AS+0.96寸OLED显示系统测试通过,如需移植请自行修改延时函数和软件模拟IIC用到的那两个IO口定义

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,676
精华内容 1,470
关键字:

oled显示模块