1. <em id="3qmea"><ol id="3qmea"></ol></em>
    2. <em id="3qmea"></em>
      (玩电子) 电子技术学习与研究
      当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

      LCD1602液晶显示完全资料

      作者:佚名   来源:本站原创   点击数:x  更新时间:2010年05月12日   【字体:

      一、关于LCD1602:

      在编写LCD1602程序前,我们必须了解其手册上一些非常重要的信息,如果这些信息不能理解透彻,编程可能会遇到或多或少的问题,在此先大致归纳几点。

      1.管脚:

      1602共16个管脚,但是编程用到的主要管脚不过三个,分别为:RS(数据命令选择端),R/W(读写选择端),E(使能信号);以后编程便主要围绕这三个管脚展开进行初始化,写命令,写数据。

      以下具体阐述这三个管脚:

      RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器。

      R/W为读写选择,高电平进行读操作,低电平进行写操作。

      E端为使能端,后面和时序联系在一起。

          除此外,D0~D7分别为8位双向数据线。

       

      2.操作时序:
            

      RS
      R/W
      操作说明
      0
      0
      写入指令码D0~D7
      0
      1
      读取输出的D0~D7状态字
      1
      0
      写入数据D0~D7
      1
      1
      D0~D7读取数据

      注:关于E=H脉冲——开始时初始化E为0,然后置E为1,再清0.

      读取状态字时,注意D7位,D7=1,禁止读写操作;D7=0,允许读写操作;

      所以对控制器每次进行读写操作前,必须进行读写检测。(即后面的读忙子程序)

       

      3.指令集:

      LCD_1602 初始化指令小结:

      0x38   设置16*2显示,5*7点阵,8位数据接口

      0x01   清屏

      0x0F   开显示,显示光标,光标?#20102;?/p>

      0x08   只开显示

      0x0e   开显示,显示光标,光标不?#20102;?/p>

      0x0c   开显示,不显示光标

      0x06   地址加1,当写入数据的时候光标右移

      0x02   地址计数器AC=0;(此时地址为0x80) 光标归原点,但是DDRAM中断内容不变

      0x18   光标和显示一起向左移动

       

      4.显示地址:



      LCD1602内部RAM显示缓冲区地址的映射图,00~0F、40~4F分别对应LCD1602的上下两行的每一个字符,只要往对应的RAM地址写入要显示字符的ASCII代码,就可以显示出?#30784;?/p>

       

      5.读写时序:

      时序图1602手册中有,这里不引用了。时序图很重要,编程就是根据时序图设置寄存器,让LCD工作。

       

      二、LCD1602程序编写流程:

      LCD1602在了解完以上信息后便可以编写,这里我们把程序分为以下几步:

      1.定义LCD1602管脚,包括RS,R/W,E。这里定义是指这些管脚分别接在单片机哪些I/O口上。

      现举例如下:

      sbit EN=P3^4;

      sbit RS=P3^5;

      sbit RW=P3^6;

       

      2.显示初始化,在这一步进行初始化及设置显示模式等操作,包括以下步骤:

      设置显示方式
      延时
      清理显示缓存
      设置显示模式
      通常推荐的初始化过程如下:

      延时15ms

      写指令38H

      延时5ms

      写指令38H

      延时5ms

      写指令38H

      延时5ms

      注:以上写38H指令可以看情况省略1~2步

      (以上都不检测忙信号)

      (以下都要检测忙信号)

      写指令38H

      写指令08H 关闭显示

      写指令01H 显示清屏

      写指令06H 光标移动设置

      写指令0cH 显示开及光标设置

       

      3.设置显示地址(写显示字符的位置)。

       

      4.写显示字符的数据。

       

      三、LCD1602各子程序模块及主程序编写:

      现在按照上面编写程序的流程,给出各子程序模块及主程序的例子。

      1.头文件,宏定义,定义管脚等:

      #include<reg52.h>

      #include <string.h>

      #define uchar unsigned char

      #define uint unsigned int

      sbit EN=P3^4;

      sbit RS=P3^5;

      sbit RW=P3^6;

      uchar code table0[]={"QQ:545699636"};  //此条语句为显示字符串时定义的字符串数组

       

      2.LCD1602基本初始化子程序:

      void LCD1602()

      {

       EN=0;

       RS=1;

       RW=1;

       P0=0xff;   //这里P0为与LCD D0~D7相连的I/O口

      }

       

      3.读忙子程序:

      void read_busy()

      {

        P0=0xff;

        RS=0;

        RW=1;

        EN=1;

        while(P0&0x80);   //P0和10000000相与,D7位若不为0,停在此处

        EN=0;             //若为0跳出进入下一步;这条语句的作用就是检测D7位

      }                  //若忙在此等待,不忙跳出读忙子程序执行读写指令

       

      4.写指令写数据子程序:

      void write(uchar i,bit j)

      {

        read_busy();

        P0=i;  //其中i=0,写指令;i=1,写数据;

        RS=j;

        RW=0;

        EN=1;

        EN=0;

      }

       

      5.延时子程序:

      void delay(uint c)    //功能为提供初始化等其他子程序中的延时1xc MS

      {

        uint a,b;

        for(a=0;a<c;a++)

        for(b=0;b<120;b++);

      }

       

      6.LCD1602初始化子程序:

      void init()    //完全按照要求初始化流程来,中间省略了一步写指令38H

      {

       

        delay(15);

        write(0x38,0);

        delay(5);

        write(0x38,0);

        write(0x08,0);

        write(0x01,0);

        write(0x06,0);

        write(0x0c,0);

      }

       

      7.显示单个字符子程序:

      void display_lcd_byte(uchar y,uchar x,uchar z)    //Y=0,1(起始行)X=0~15(起始列)Z=想写字符的ASCII码

      {         

          if(y)      //是否显示在第二行(若在第一行Y=0,不进入IF语句,若在第二行,进入IF语句

        {        

         x+=0x40;   //第二行起始地址加上列数为字符显示地址

        }

        x+=0x80;      //设置数据指针位置

        write(x,0);  

        write(z,1);   //写入数据

      }

      8.显示字符串子程序:

      void display_lcd_text(uchar y,uchar x,uchar table[])    //Y,X同上字符显示,table[]字符串数组 

      {      

        uchar z=0;

        uchar t;

        t=strlen(table)+x;   //  求得字符串长度加上起始列位置

        while(x<t)        //功能为LCD显示到字符串最后一个字符,防止字符串

        {                 //没有16个字符,从而不够位产生乱码;

          display_lcd_byte(y,x,table[z]);    //逐位显示数组内字符

          x++;

          z++;

        }

      }

       

      9.主程序:

      主程序里除了放入初始化程序外就是加入自己编写的显示子程序,根据你所要的不用功能可以编写各种类型的显示子程序,这里不做详细介绍,以下举例为显示一个字符和显示字符串的显示子程序。

      void main()

      {

        LCD1602();

        init();

        display_lcd_byte(0,0,'A');      //  显示一个字符

        display_lcd_text(1,3,table);    //  显示字符串

        while(1);

      }

       

      到此,让LCD1602显示的操作流程和编程思想基?#31350;?#20197;告一段落了,这里有一个完整的显示程序可显示2行英文:

       


      要想让某一格子显示就让那一位为1,每行自定义5位,全白为0x00;全黑为0x1f。一共8行,每行一位数据。

      将生成的点阵数组保存到CGRAM存储器中,生成自定义字符。1602内部CGRAM用于自定义的字符点阵的存储,总共64字节。由上一步点阵提取可知,每一个字符由8个字节数据组成。所以64字节CGRAM存储器,能够存储8组自定义字符的点阵数组。按照CGRAM地址划分为 0~7为第一组,8~15为第二组,?#26469;?#31867;推56~63为第8组数据。

      CHARACTER CODE是数据的显示地址,0-7的范围,能存储8位自定义的字符。(能存八个自定义,每个字符存放的)

      CGRAM ADDRESS是存储数据的地址,从0-63共64个字节.存储64个数据。我们写入的数据是0x40~0x7F,共128位。(把字符数组内的8个数送进这8个地址,每存完一个字符的8位,下次地?#20998;?#25509;转到0x48)

      CGRAM DATA 字模每一行5位数据存

      内部常用字符显示时,显示编码是从0x20开始的。0x00~0x0F是专门留给自定义字符显示的。0x00~0x07和0x08~0x0F内容是一样的。例如:调用0x01 位置和0x09位置,显示的内容是一样的。

      LCD1602自定义显示字符的方式共四步,如下面所示:

      1.设置向CGRAM中存入这个数据.初始地址是0x40。然后存一位向后加8,

      总共能存8位自定义的字符。

      2.然后可以把自定义的数据送入到LCD的CGRAM中。

      3.向LCD写指令,送入需要显示数据的地址。

      4.向LCD写指令,把显示的数据指向LCD的CGRAM存储的位置,显示出自定义字符。

      举例如下:

      1.建立一个字符数组;

      uchar LCD_Data1[]={0x01,0x03,0x1D,0x11,0x1D,0x03,0x01,0x00};

      2.设置CGRAM地址,写指令;

      Write_LCD(0x40,0);

      3.把数据送入CGRAM地址内;

      for(i = 0; i < 8 ; i ++ )

      {

      Write_LCD(LCD_Data1[i],1);

      }

      4.写需要显示的位置指令;

      Write_LCD(0x80,0);

      5.把CGRAM的0位的数据送向LCD1602,显示数据存储的数据;

      Write_LCD(0x00,1);
       

      发表评论】【告诉好友】【收藏此文】【关闭窗口

      文章评论

      相关文章

      青海11选5app下载

        
        
        1. <em id="3qmea"><ol id="3qmea"></ol></em>
        2. <em id="3qmea"></em>

            
            
            1. <em id="3qmea"><ol id="3qmea"></ol></em>
            2. <em id="3qmea"></em>
              辽宁35选72019062 二八杠麻将玩法说明 体育彩票31选7几点开奖 甘肃十一选五专家预测号码 湖北体彩彩票十一选五 腾讯分分彩官方平台 今天福建11选5开奖结果 天津快乐10分 p5走势图带坐标 上海基诺开奖号码 3d综合走势图 本期一肖一码中特 开一次锁多少钱 众赢联盟平台 快米打字平台下载