b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

OLED显示技术具有自发光的特性,BS1/BS2设置

电脑杂谈  发布时间:2021-02-08 17:01:54  来源:网络整理

OLED的基本介绍OLED的定义和优点

OLED或有机发光二极管(有机发光二极管),也称为有机电致发光显示器(OELD)。 OLED具有自发光,无背光,高对比度,厚度薄,视角宽,响应速度快等优异特性,可用于柔性面板,工作温度范围宽,结构和制造工艺简单等。成为下一代平板显示器的新兴应用技术。

OLED显示技术具有自发光特性,它使用非常薄的有机材料涂层和玻璃基板。当有电流通过时,这些有机材料会发光,并且OLED显示屏具有大视角并可以节电。自2003年以来,该显示设备已在MP3播放器中使用。

LCD都需要背光,而OLED则不需要,因为它是自发光的。对于相同的显示器,OLED效果应该更好。使用目前的技术,很难增加OLED的尺寸,但是分辨率可能会很高。

Alinetek的0.96英寸OLED模块OLED模块工作模式选择

4种模式由模块的BS1 / BS2设置(由硬件设置)。 BS1 / BS2设置和模块接口模式之间的关系如下表所示:

OLED的四种工作模式

界面模式

4线SPI

IIC

8位6800

8位8080

BS1

1

1

BS2

1

1

以下是OLED模块的具体物理图片:

oled显示器参数

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

从模块的中,我们可以更清楚地看到:

oled显示器参数

该模块使用8 * 22.52针接头连接到外部,总共16针。在这16行中,我们仅使用其中的15行,其中之一是浮动的。在15条线中,电源线和地线占2条线,剩下13条信号线。在不同的模式下,所需的信号线数量是不同的。在8080模式下,全部13个都是必需的。

OLED控制器为SSD1306,这意味着裸屏由SSD1306驱动,SSD1306也是一种广泛使用的LED驱动器芯片。

OLED显示原理OLED8080并行接口信号线说明

上面提到本文中的OLED采用8080接口方法,对应的并行接口图如下:

oled显示器参数

接下来,解释该并行接口的每条信号线的含义:

OLED8080并行端口读写过程

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

并行编写时序图

oled显示器参数

平行阅读时序图

oled显示器参数

oled显示器参数

OLED模块视频存储器

OLED本身不具有视频内存,并且其视频内存取决于SSD1306(稍后说明的TFTLCD拥有自己的视频内存,该内存由FSMC控制)。 SSD1306提供视频存储器,该芯片的具体说明如下。

SSD1306的视频内存总共为128 * 64bit,SSD1306将这些视频内存分为8页。每页包含128个字节,共8页,正好是128 * 64点矩阵的大小。

oled显示器参数

程序显示原理

在STM32内部创建一个缓存(总共128 * 8字节)。进行每次修改时,仅修改STM32(实际上是SRAM)上的缓存。修改完成后,将STM32放在上。将缓存的数据写入OLED的GRAM。当然,这种方法也有缺点,那就是对于那些具有非常小的SRAM(例如51系列)的微控制器来说,麻烦就更大了。

oled显示器参数_oled显示器显示原理_oled显示技术

SSD1306芯片SSD1306芯片介绍

SSD1306是单芯片CMOS,OLED / PLED驱动器芯片,可以驱动有机/聚合物发光二极管点矩阵图形显示系统。由128个细分市场和64个公用区组成。该芯片设计用于普通阴极OLED面板。

SSD1306嵌入了对比度控制器,显示RAM和晶体振荡器,因此减少了外部组件和功耗。有256级亮度控制。共有三个用于数据/命令传输的接口:6800/8000串行端口,I2C接口或SPI接口。它适用于大多数配置文件应用程序,例如手机的屏幕显示,MP3播放器和计算器。

SSD1306芯片特性VDD =1.65V至3.3V,用于IC逻辑; VCC = 7V至15V,用于面板驱动; OLED驱动输出电压,最大15V;段最大电流:100uA;通用最大反向电流:15mA; 256级对比度亮度电流控制; 8位6800/8000串行端口; 3/4线SPI接口; I2C接口。 SSD1306芯片命令

oled显示器参数

STM32控制OLED硬件连接

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)(P),OLED_D5:OV D5(PC5),OLED_D6:OV D6(PC6),OLED_D7:OV D7(PC7))

STM32控制程序

//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= ))//判断是不是非法字符!
    {       
        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并行写入序列图中的步骤。具体来说:

oled显示器参数_oled显示器显示原理_oled显示技术

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字符库内容的一部分,并且一个字符由u8类型的16个数字表示:

{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,0x,0x11,0x24,0x0E,0x98,0x00,0xE4,0x00,0x84,0x00,0x08},/*"&",6*/

具体显示方法如下图所示:

oled显示器参数

oled显示器参数

从上到下,从左到右,高位在前。这是取模方法,根据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,并画出一个点。然后读取第二个位,依此类推,直到字符的点阵全部取出。此处涉及的列地址和行地址的自增并不难理解。

oled显示器参数


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-354999-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...