Nokia5110液晶屏新手学习笔…

来源:互联网 发布:div模块滚动加载 js 编辑:程序博客网 时间:2024/05/29 03:20
原文地址:Nokia5110液晶屏新手学习笔记,一看就懂,特别简单哦,如果需要资料,可以来问班长我要啊作者:电子信息工程班
1、本文章用于自己的知识回顾和提供给有需要的初学者,高手请飘过~
2、本文章的内容均从“诺基亚5110液晶屏资料驱动芯片PCD8544中文数据手册.pdf”中,结合自己的理解,整理并简化出来的知识,更多详细内容请查看芯片手册。另外,内容有不对的地方,望指正。

现在我们一步一步来:

一、硬件链接:

首先,看一下硬件(仅供参考,读者已对自己的硬件很熟悉,可以直接跳过。):




[转载]Nokia5110液晶屏新手学习笔记,一看就懂,特别简单哦,如果需要资料,
说明:
图1: 排针从左至右1到8位。
图2: 5110接口在板子中的区域。
图3: 8位排  对应连接5110液晶屏相应的引脚。
图4: 5110液晶显示屏对应8位排针JP19的插入方向。
显示了8位排针JP19(即5110液晶屏的引脚)其中的5根与51单片机(本人的为STC89C516RD+)的PBI/O口的连接方式:

5110_RST   <--->PB2(P1.2)
5110_SCE   <--->PB3(P1.3)
MOSI(sdin) <--->PB5(P1.5)
MISO(dc)  <---> PB6(P1.6)
SCK      <--->PB7(P1.7)

这样,我们知道了用51单片机中的I/O口和5110引脚的链接方式。

二、引脚

接线图请根据程序里的定义连接,51的程序默认接线为:
sbit    sce = P1^3;  //片选sbit    res = P1^2;  //复位,0复位sbit    dc  = P1^6;  //1写数据,0写指令sbit    sdin = P1^5;  //数据sbit    sclk = P1^7;  //时钟 

看了这些默认接线,可能有个疑问:“这些位变量(引脚)究竟有什么用呢?”,带着这个疑问,请看5110芯片手册中的引脚说明
(重点看红色区域):
[转载]Nokia5110液晶屏新手学习笔记,一看就懂,特别简单哦,如果需要资料,



从这个引脚说明中,我们知道了不同的引脚,对应的功能。那么,如何使用这些引脚来控制5110工作呢?

三、指令

5110液晶显示屏(PCD8544芯片),是通过发送指令和写入数据RAM来控制和显示数据的。

指令格式分为两种模式:
1、如果D/C(模式选择)置为低(为0),即位变量 dc =0,为发送指令模式,那么接下来发送的8位字节解释为命令字节。
2、如果D/C置为高,即dc = 1; 为写入数据RAM模式,接下来的字节将存储到显示数据RAM。
注意:
1、每一个数据字节存入之后, 地址计数自动递增。在数据字节最后一位期间会读取D/C信号的电平。 
2、每一条指令可用任意次序发送到PCD8544。首先传送的是字节的MSB(高位)
指令集:


[转载]Nokia5110液晶屏新手学习笔记,一看就懂,特别简单哦,如果需要资料,

[转载]Nokia5110液晶屏新手学习笔记,一看就懂,特别简单哦,如果需要资料,



结合表1和表2, 指令集不难读懂。现在以红色横线所标识的指令来举例说明:

第一条(红色横线1),功能设置指令:
首先,D/C为0, 表示现在是指令模式,然后从表2看:
若要“使用基本指令集”,则PD = 0, V = 0, H = 0,那么相应地DB7~DB0分别为00100000b,即0x20。也就是说,发送0x20就能设置液晶“使用基本指令集”。
同理,使用“使用扩展指令集”,指令值为0x21。

第二条(红色横线2),显示控制:
显示模式有4种,分别是:显示空白,普通模式,开所有显示段,反转映象模式。这些模式分别使用D andE来组合控制。
这样,我们控制显示为“普通模式”, 那么D要为1,E要为0, 这时DB7~DB0分别为 00001100b,即指令值为0x0C。

第三条(红色横线3),写入数据指令:
写入数据,首先D/C必须为1,表示现在是写入数据RAM模式,DB7~DB0就是相应的数据值。

到这里,我们知道了5110液晶屏是使用这样的指令集来控制和显示数据的。那么,我们如何把指令值写进去呢?

四、时序图

没错,要向液晶屏写入数据,我们需要通过模拟一个串行总线协议来写入数据。
先来看看传送一个字节(指令)的时序图:



如果能看懂时这些序图的兄弟,就不要听我废话啦。请飘过~~

从时序图1看出:
1. SCE片选为0时开始发送数据。
2. 时钟信号SCLK仅在SCE片选为0时有效。
3. SDIN数据输入,需要在时钟信号SCLK有效时开始发送数据,且在SCLK的正边缘取样, 注意,数据是从高位开始发送的。

知道了传送数据的时序,我们需要使用程序来模拟这个时序,从而发送指令控制液晶屏。
接下来,看看实例。

五、程序实例

代码一:
void LCD_write_byte(unsigned char dt, unsigned char command){     unsigned char i;     sce=0;         dc=command;         for(i=0;i<8;i++)     {          if(dt&0x80)               sdin=1;          else               sdin=0;          dt=dt<<1;                   sclk=0;                    sclk=1;     }         dc=1;         sce=1;         sdin=1;}

代码分析:
这个是一个写入一个字节数据的模拟时序函数,具有两个参数,dt为要写入的字节,command为数据/命令选择。
首先,需要sce拉低电平,开始发送数据。
i循环8次,写入8位数据,现以“设置扩展指令集”(即写入0x21)全过程如下:
  • i = 0:dt = 0x21 = 0010 0001 b

    dt & 0x80:
    0010 0000
    1000 0000 &
    0000 0000 = 0,则sdin = 0 (DB7),
    dt左移1位,dt<<1 = 0100 0010 b,
    模拟时钟信号sclk = 0, sclk = 1,以使采样

  • i = 1: dt = 0100 0010b

    dt & 0x80:
    0100 0010
    1000 0000 &
    0000 0000 = 0, 则sdin= 0 (DB6),
    dt左移1位,dt<<1 = 1000 0100 b,
    模拟时钟信号sclk = 0, sclk = 1,以使采样 

  • i = 2: dt = 1000 0100b

    dt & 0x80:
    1000 0100
    1000 0000 &
    1000 0000 != 0,则sdin = 1 (DB5)
    dt左移1位,dt<<1= 0000 1000 b,
    模拟时钟信号sclk = 0, sclk = 1
    ,以使采样 

  • i = 3:dt = 0000 1000b

    dt& 0x80:
    0000 1000
    1000 0000 &
    0000 0000 = 0,则sdin = 0 (DB4)
    dt左移1位,dt<<1= 0001 0000 b,
    模拟时钟信号sclk = 0, sclk =1
    ,以使采样

  • i = 4:dt = 0001 0000b

    dt& 0x80:
    0001 0000
    1000 0000 &
    0000 0000 = 0,则sdin = 0 (DB3)
    dt左移1位,dt<<1= 0010 0000 b,
    模拟时钟信号sclk = 0, sclk =1
    ,以使采样

  • i = 5:dt = 0010 0000b

    dt& 0x80:
    0010 0000
    1000 0000 &
    0000 0000 = 0,则sdin = 0 (DB2)
    dt左移1位,dt<<1= 0100 0000 b,
    模拟时钟信号sclk = 0, sclk =1
    ,以使采样
     

  • i = 6:dt = 0100 0000b

    dt& 0x80:
    0100 0000
    1000 0000 &
    0000 0000 = 0,则sdin = 0 (DB1)
    dt左移1位,dt<<1= 1000 0000 b,
    模拟时钟信号sclk = 0, sclk =1
    ,以使采样
     

  • i = 7:dt = 1000 0000b

    dt& 0x80:
    1000 0000
    1000 0000 &
    1000 0000 != 0,则sdin = 1 (DB0)
    dt左移1位,dt<<1= 0000 0000 b,
    模拟时钟信号sclk = 0, sclk =1
    ,以使采样
     
     

过程很罗嗦,不过很简单,呵呵~~
可见,这样循环8次,写入了8位数,DB7~DB0 = 0010 0001b = 0x20,正是“扩展指令集”的指令值。
代码二:
void LCD_init(void){     res=0;           delayms(10);     res=1;      LCD_write_byte(0x21,0);//1、初始化Lcd,功能设定使用扩充指令     LCD_write_byte(0xd0,0);//2、设定液晶偏置电压     LCD_write_byte(0x20,0);//3、使用基本指令     LCD_write_byte(0x0C,0);//4、设定显示模式,正常显示}
代码分析:
初始化步骤可以参照芯片手册中的编程示例:



代码三:
void LCD_write_char_my(unsigned char *font){    unsigned char i;            for (i=0; i<6; i++)      LCD_write_byte(font[i], 1);}

代码分析:
我们可以使用字模软件,求出一个6*8大小的字符“A”,该组值为:
unsigned char A[6] = {0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C};
这些很容易理解,还原看一下:


上面的矩阵,就是一个字母"A",可见只要把这组值写入即可以显示“A”。

最后,到这里,我们已经学会了Nokia5110液晶屏的原理和基本控制。是不是觉得很简单。呵呵~~~希望帮到大家,写得不好,请见谅,写的不对,望指正!
0 0
原创粉丝点击