5110液晶屏初始化和datasheet详解

这几天学习nikia 5110屏的控制,特地把datasheet看了几遍,琢磨了一下。又参考了网上的一些代码,自己用nios ii io口模拟写了驱动程序。一开始就成功了,但却出现了一些很奇怪的问题,对datasheet一些地方也感到疑惑。因为我用的nios ii的时钟是66.666667MHz,是高速系统,我也不能确定这些问题是不是高速系统和普通低速单片机的区别导致的。

但现在经过多次测试,我已经解决了初始化问题,对于datasheet一些不懂的地方也有进一步的理解。在此分享一下自己的理解。以下是初始化步骤:

1.记住在5110的初始化开始要先给REST引脚发送一个低脉冲来重置(清零)所有内部寄存器,这个低电平脉冲持续时间大于100ns

2.之后片选信号SCE要先变低再变高。

关于为什么要先片选我刚开始也不懂,datasheet上也没说要这么做。网上的代码有些有这个步骤有些没有这个步骤。我开始没有这个步骤,倒是也可以成功,但接下去出现了一些问题。比如设置参数Vop(后面介绍Vop)后屏幕并没有改变,而且有时候屏幕会变白,且变白后再也调不出图案,要先拔掉5110电源再测试才会再出现图像(开始还以为烧坏了,初始化不好会烧坏)(有时也不行)。本来在datasheet中就不太明白参数Vop到底是什么(现在明白了,说白了就是调节液晶屏电压Vlcd的),因为Vlcd可以用软件调节,也可以硬件提供,自己买的是带别人做好的PCB板的,不知道Vlcd是否已经接电源了,所以对Vop更怀疑了。后来经过不断测试终于发现,要是没有先片选一下的话,紧接着设置Vop有很大的概率会设置失败。这也就是为什么很过来人都加上了这一步。

PS:我改变了Vop和混合率的初始化次序,发现会出现一样的问题,所以未必是Vop设置失败,也可能是混合率设置失败。总之,没有这句的话有很大的概率初始化失败,所以最好加上这句吧。当然,对于外接Vlcd的是否有这个问题我就不得而知了。

3.发送指令0x21设置PD = 0 、 V = 0 和 H = 1(表示要使用拓展指令集,Vop和混合率的设置属于拓展指令集)

4.设置Vop(Vlcd外部供电的省略这一步,事实上大多数带PCB板的5110都是内部产生Vlcd的,所以要这一步)

Vop可以内部产生(通过设置Vop)也可以外接电源。外部供电的话要提供6.0V-9.0V给Vlcd(因为和Vdd不同,所以大多数都是采用内部产生这个方法),内部产生的要提供6.0V-8,.5V给Vlcd。Vlcd产生的大小通过Vop的大小来设置。计算公式为:Vlcd = a + Vop * b [V],其中对于5110的控制芯片PCD8544,a = 3.06,b = 0.06。因为Vop是一个7bit的参数,所以Vop从0-127取值,产生的Vlcd的范围为3.06(datasheet上写3.00应该是笔误)到10.68V。其中只有6.0到8.5V的范围内液晶屏才能正常工作。写命令的时候要注意发送的指令为0x80|Vop,最高位是1

5.设置RECOMMENDED MUX RATE(混合率)

什么是混合率呢,这个参数搞了好久才明白,就是对比度啦。当初屏幕没有先片选出现白屏问题,因为不知道Vop和混合率的意思才导致瞎折腾了好久(以为是混合率没设置好,其实是Vop出问题了)。混合率是1:x的形式,x越大对比度越低。虽难datasheet上说5110的混合率要设置1:48,但事实上这样设置对比度太小,看不大清除,所以我看到网上一些程序其实是设置1:40/1:34的,我这里设置了1:24。混合率是通过设置BS2、BS1、BS0这三位来实现的,对应的混合率如下:

6.设置温度系数TC1、TC0,复位后TC1和TC0都置零,即温度系数为0,。事实上,网上的代码要么没这一步,要么置温度系数为0(其实两种都一样)。从datasheet上也看不出温度系数要怎么设置,但上面两种方法都可行,只有在低温情况下要注意这一点

7.发送指令0x20设置PD = 0、 V = 0 和 H = 0(表示要使用基本指令,设置显示模式和设置xy轴坐标属于基本指令)

8.发送0x0c指令或0x0d指令表示进入正常显示模式,0x0c显示黑字,背景为白色,0x0d显示白字,黑色背景。

9.清屏(下面有清屏函数)

其实这里是通过设置D为何E为来设置显示模式的,5110总共有四种显示模式,另外两种还没试下什么效果,试好了我补充

下面是四种模式对应的D和E:


通过以上几步后5110就可以成功初始化,下面提供完整的初始化代码:

#include"lcd_5110_solution.h"

void LcdWrite(alt_u8 data,alt_u8 d_c)
{
	alt_u8 i;
	//chose the chip
	IOWR_ALTERA_AVALON_PIO_DATA(SCE_BASE, 0x00);
	//chose data mode or command mode
	IOWR_ALTERA_AVALON_PIO_DATA(D_C_BASE, d_c);
	//sent 8 bits
	for(i = 0;i < 8;i ++)
	{
		IOWR_ALTERA_AVALON_PIO_DATA(SCLK_BASE, 0x00);
		IOWR_ALTERA_AVALON_PIO_DATA(SDIN_BASE, data >> (7 - i));
		IOWR_ALTERA_AVALON_PIO_DATA(SCLK_BASE, 0x01);
	}
	//release the chip
	IOWR_ALTERA_AVALON_PIO_DATA(SCE_BASE, 0x01);
}

void InitLcd()
{
	usleep(1000);
	//sent a reset pulse(low) to reset all internal registers
	IOWR_ALTERA_AVALON_PIO_DATA(REST_BASE, 0x00);
	usleep(1);
	IOWR_ALTERA_AVALON_PIO_DATA(REST_BASE, 0x01);
	usleep(1);
	IOWR_ALTERA_AVALON_PIO_DATA(SCE_BASE, 0x00);
	usleep(1);
	IOWR_ALTERA_AVALON_PIO_DATA(SCE_BASE, 0x01);
	usleep(1);
	//function set PD = 0 and V = 0, select extended instruction set(H = 1mode)
	LcdWrite(0x21,CMD);
	//set VOP: VOP is set to a + 65 × b [V] = 3.06 + 65 * 0.06 = 6.96 V
	LcdWrite(0xbf,CMD);
	//RECOMMENDED MUX RATE(1:24),you can chose other MUX RATE
	LcdWrite(0x15,CMD);
	//function set PD = 0 and V = 0, select normal instruction set(H = 0 mode)
	LcdWrite(0x20,CMD);
	//display control set normal mode (D=1andE=0)
	LcdWrite(0x0c,CMD);
	//clear screen
	LcdClearAll();
}

void SetXY(alt_u8 x,alt_u8 y)
{
	if(x > 83) x = 0;
	if(y > 5) y = 0;
	LcdWrite(0x40 | y,CMD);
	LcdWrite(0x80 | x,CMD);
}

void LcdClearAll()
{
	alt_u16 i;
	SetXY(0,0);
	for(i = 0;i < LCD_X * LCD_Y / 8;i ++)
	{
		LcdWrite(0,DATA);
	}
}

头文件:

#ifndef LCD_5110_SOLUTION_H_
#define LCD_5110_SOLUTION_H_

#define CMD		0x00
#define DATA	0x01
#define LCD_X	84
#define LCD_Y	48

#include
#include
#include
#include

//write a byte
void LcdWrite(alt_u8 data,alt_u8 d_c);
//initial the 5110
void InitLcd();
//set the position of x axis and y axis
void SetXY(alt_u8 x,alt_u8 y);
//clear screen
void LcdClearAll();

#endif 
下面再提供一些重要的表格还有一些注意事项:

下面是5110的指令集:




注意H=0为基本指令,H=1为拓展指令

下面是复位后LCD就有的状态:



时序图:



时序参数:


关于时序有些要解释:

1.关于单个字节发送为什么会是9个时钟信号,我也不太清楚,感觉画错了,事实上,大家都只发送了8个时钟,我也是这么做。

2.关于D/C信号第八个时钟时会被读出,我也不大清楚,不管他也没问题,可不要以为在第八个时钟时要自己去把D/C改变电平

3复位的两个时序参数表中好像对不上,个人感觉注意复位低脉冲宽度大于100ns就可以了

以上是自己的一些解读,有一些也是自己不断试的,但可能会有一些不正确,希望大家给予指点和改正。

下一篇我会把5110显示中英文字符和图案的代码也写出来,敬请期待。


你可能感兴趣的:(液晶屏,nios,ii)