OLED液晶屏操作记录

今天在老谭的帮助下,操作了一下OLED,以前对于液晶显示不是很重视,特别是对于这种OLED的显示,更是没怎么好好的熟悉过,今天被老谭逼着,好好的练习了一下对于OLED的操作。

先来一些OLED的介绍。

OLED,即有机发光二极管,又称为有机电激光显示。OLED由于具备自发光,不需要光源、对比度高、厚度薄、视角广、反应速度快、可用于扭曲性面板、使用温度范围广、构造及制作简单等优异性特点。

以现在的技术,OLED尺寸很难做到大型化,但是分辨率却而已做到很高。这次我使用的OLED尺寸为0.96寸,但是分辨率达到了128*64。

OLED液晶屏操作记录_第1张图片

附图是显存和屏幕对应关系表,从上表上可以发现,屏幕每页包含128列,总共8页,每页总共8行。正好就是128*64的点阵大小。

该OLED提供多种接口方式:6800、8080、4线SPI、IIC接口,方式的选择主要是通过芯片引脚BS1和BS2设置的,BS1和BS2的设置方法与模块的接口模式的关系如下表:

OLED液晶屏操作记录_第2张图片

关于6800和8080、IIC方式的接口和电路连接就不介绍了。我主要使用的是SPI接口,在这里主要介绍一下关于SPI的引脚连接。

CS:OLED的片选信号。

RST(RES):硬复位OLED

DC:命令/数据标志 (0:读写命令,1:读写数据)

SCLK:串行时钟线。在4线串行模式下,D0信号线作为串行时钟线SCLK。

SDIN:串行数据线。在4线串行模式下,D1信号线作为串行数据线SDIN。

其余引脚的连接查看数据手册就可以进行自行设计。

这里,我使用的MCU是STM32F103ZET6,本来在电路板上设计的时候,想着是使用硬件SPI,所以除了SCLK、SDIN之外,其余引脚也是连接的硬件SPI的I/O引脚,但是后来想到,自己不知道在使能SPI引脚时钟之后,我只使用了其中两个引脚,怎么将其余两个引脚作为普通GPIO使用,所以最后直接使用的是模拟SPI方式。

其实,只要是编写了模拟SPI部分的程序之后,就可以完全操作这个液晶屏了。我的学习过程是参照正点原子的例程了PDF文档进行学习的。这里,前面的程序部分都是参考正点原子的程序编写的,但是,后面关于显示部分,个人感觉正点原子对于OLED的操作方式有点像对于TFT彩色液晶屏的操作,感觉不是很适合OLED的操作方式,所以,自己重新编写了这部分的程序。

今天在自己编写和调试过程中,主要问题是集中在关于字模取模和关于显示部分的理解,所以,今天晚上的总结主要是对于这部分只是的总结。

字模取模软件使用的是PCtoLCD2002软件,感觉这个软件还是使用起来比较的顺手的。下面,先来一个软件界面的截图,然后再说明一下操作需要注意的事项。

OLED液晶屏操作记录_第3张图片

OLED液晶屏操作记录_第4张图片

第一张图片是软件的界面,在这个界面中,我们可以进行以下操作:①字体大小设置;②点阵大小设置;③字模输入;④生成字模编码;⑤保存字模编码为TXT文本。

第二张图片是软件取模方式设置界面,在这个界面中,我们可以进行以下操作:①点阵格式选择,这个根据你使用的点阵的实际情况进行选择。②取模方式选择,这个是比较重要的,如果取模方式设置不正确,那么取模的编码是没有任何意义的;③取模走向:这个也是关系到字模编码正确与否的关键,需要认真选择;④自定义格式,可以选择你需要的字模编码输出格式,可以选择C51模式,输出的是十六进制数据,方便我们使用;⑤每行显示的数据:这个选项是关系到你最后生成的字模编码的数组大小,可以根据自己的实际情况进行选择,然后在程序中进行运用。

关于取模方式,我使用的OLED支持的是列行式,即先显示每列,然后再一行一行的增加,直至显示完我们的数据。

然后,还有一点需要注意的就是,使用这个软件生成的字模编码,我们可以有两种存储方式:①使用二维数组;②使用一维数组。数组使用的不同,也就造成了我们在程序中应用时候的不同。

如果我们要显示的字符比较的小,即16*8,或者12*8,也就是不牵扯到多页的话,我们的程序就比较的简单,因为在编程的过程中,我们不需要增加页的地址,但是,如果我们显示的字符是多页的话,这样就牵扯到了多页的处理。下面附上我自己编写的程序:

上面的程序中,主要使用的一维数组存储的字模编码。而且字模的大小是32*16大小的字符,即需要占用4页。使用offset变量实现了 初始列 位置的设置,通过num来查询数据,确定了我们字模编码。

如果在使用过程中,使用的字模大小不一样的话,如果不牵扯到多页,就可以取消掉k变量,使用k变量实现了多页的显示。

如果我们使用的字模的大小不一样的话,即不是 16的大小,我们只需要修改 for(j=k*16;j<(k=1)*16;j++) 中的数字 16,将 16 修改为我们实际工作中需要的编码。

如果我们使用的字模数组不是二维数组的话,只需要修改LCDWriteByte 函数中的第一个参数,这个参数 就是 编码数据值。比如修改为二维数组 numeric[x1][x2],其中x1代表的是索引值,即我们需要显示的数据。x2代表的是 整个字模大小,一般,二维数组中的数组大小都是一样的,即x2为固定值。所以,这个程序中,我们就修改为

numeric[num+j][64];


从上面的分析中,我才渐渐的明白了关于多页显示部分的原理。可能是有点笨吧。呵呵 

下面实际说明一个自己的取模画面:

OLED液晶屏操作记录_第5张图片   OLED液晶屏操作记录_第6张图片


通过实例说明一下自己对OLED上面的字符显示的理解,和对取模方式的选择。

好了,到这里,就将自己今天比较疑惑的地方总结完成了。今天的问题还是主要在多页字符显示方式的不理解方面,经过这个之后,对于多页显示终于有了清晰的认识了。

对于OLED的操作也是有些认知了。但是没有做字符串和点的显示实验,以后在补上。


关于OLED操作函数补充:

//OLED数据显示函数

void LCD_DisNumLine(UINT8 offset, UINT8 num)
{
UINT8 j, k;


for(k=0; k<4; k++)
{
OLED_WR_Byte(0xb2+k, OLED_CMD); // set page address
OLED_WR_Byte(0x10+offset, OLED_CMD); //set column 
OLED_WR_Byte(0x00, OLED_CMD);


for(j=k*16; j<(k+1)*16; j++)
{
OLED_WR_Byte(zimo[num][j],OLED_DATA);
}
}
}

//OLED写数据函数

void OLED_WR_Byte(u8 dat,u8 cmd)
{
u8 i;  
OLED_RS=cmd; 
OLED_CS=0;  
for(i=0;i<8;i++)
{  
OLED_SCLK=0;
if(dat&0x80)OLED_SDIN=1;
else OLED_SDIN=0;
OLED_SCLK=1;
dat<<=1;   
}  
OLED_CS=1;  
OLED_RS=1;    

你可能感兴趣的:(电子)