zoukankan      html  css  js  c++  java
  • 1602/2002/2004液晶模块驱动

    .概述

    点阵式液晶显示模块(LCD)广泛应用于单片机控制系统,比数码管、段式液晶能模块显示更多、更直观的信息,如汉字、曲线、图片等。点阵液晶显示模块集成度很高,一般都内置控制芯片、行驱动芯片和列驱动芯片,点阵数量较大的LCD还配置RAM芯片,带汉字库的LCD还内嵌汉字库芯片,有负压输出的LCD还设有负压驱动电路等。单片机读写LCD实际上就是对LCD的控制芯片进行读写命令和数据。编程驱动LCD时,不需要对LCD的结构和点阵行列驱动原理深入了解,只要理解LCD接口的定义和LCD的控制芯片的读写时序和命令就可以了。

    1602/2002/2004 LCD属于点阵字符液晶模块,控制芯片一般使用HD44780U或者KS0066U芯片,只能显示数字和西文字符,不能显示汉字和图片。1602可以显示2行每行16个字符;2002可以显示2行每行20个字符;2004可以显示4行每行20个字符,它们的接口定义、读写时序、命令均相同,所以驱动程序可以直接互相套用。

    .电路设计

    一般情况下,1602/2002/2004 LCD对比度调节的电位器从10K-20K欧姆选择,背光的限流电阻从10-20欧姆选择。如果说明书有明确要求的,请使用说明书规定的参数。

     

                

                  

    .软件设计

    /*****************************************************************

    *程序名称:1602/2002/21004液晶显示模块驱动

    *程序功能:显示字符

    *开发工具:WSF-51DB开发板

    * MCU型号:AT89S52-24PU

    *时钟频率:12MHZ

    *程序作者:吴师傅

    *版权说明:吴师傅版权所有。转载请注明来源和作者。

    *****************************************************************/

    #i nclude<reg52.h>

     

    sbit E=P3^4;//脉冲使能

    sbit RW=P3^3;//读写选择

    sbit RS=P3^2;//数据命令选择

     

    // 延时ms函数:

    void Delayms(unsigned int t)

    {

           unsigned int i,j;

           for(i=t;i>0;i--)

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

    }

     

    // 1602检查状态函数:

    void Check1602State(void)

           P2=0xff;//赋P2口初始值

           E=0;//读状态前三控制线的状态

           RS=0;

           RW=1;

           E=1;//拉高,读状态

           while((P2&0x80)==0x80);//判断是否繁忙,等待空闲

           E=0;//读状态后三控制线的状态

           RS=1;

           RW=0;   

    }

     

    // 1602写命令函数:

    void Write1602Command( unsigned char com)

           Check1602State();//检查状态

           P2=com;//赋值

           E=0;//写命令前三控制线的状态

           RS=0;

           RW=0;

           E=1;//拉高,写命令

           E=0;//写命令后三控制线的状态

           RS=1;

           RW=1;

    }

     

    //1602写数据函数:

    void Write1602Data( unsigned char dat)

           Check1602State();//检查状态

           P2=dat;//赋值

           E=0;//写数据前三控制线的状态

           RS=1;

           RW=0;   

           E=1;//拉高,写数据

           E=0;//写数据后三控制线的状态

           RS=0;

           RW=1;

    }    

     

    //在指定的位置显示一个数字(0-9)函数(用来显示变量的值):

    void LCD1602DisplayOneNumber( unsigned char y,unsigned char x,unsigned char v)

                  //y-行数值0-3,x-列数值0-19,v-变量的一位数字0-9

    {

          unsigned char lineaddr;

          switch(y)//根据行号选择行地址(对于1602,2002液晶只有两行)

          {

                   case 0:lineaddr=0x80;break;//第一行首地址

                   case 1:lineaddr=0xc0;break;//第二行首地址

                   //case 2:lineaddr=0x94;break;//第三行首地址 (2004LCD才有)

                   //case 3:lineaddr=0xd4;break;//第四行首地址 (2004LCD才有)

                   default:;

          }

          Write1602Command(lineaddr+x);//写地址

          Write1602Data(0x30+v);//先将数字化成ASCII码,再写入

    }    

     

    //在指定的位置显示字符串函数:

    void LCD1602DisplayString( unsigned char y,unsigned char x, unsigned char *pstr)

                 //y-行数值0-3,x-列数值0-19,pstr-字符串指针

    {      unsigned char lineaddr,n=0;

            switch(y)//根据行号选择行地址(对于1602,2002液晶只有两行)

           {

                    case 0:lineaddr=0x80;break;//第一行首地址

                    case 1:lineaddr=0xc0;break;//第二行首地址

                   //case 2:lineaddr=0x94;break;//第三行首地址 (2004LCD才有)

                   //case 3:lineaddr=0xd4;break;//第四行首地址 (2004LCD才有)

                    default:;

            }

            Write1602Command(lineaddr+x);//写地址

            while(*pstr!='')//判断字符串是否写完

            {

                     Write1602Data(*pstr++);//写字符

                     n++;

                     if((n+x)==16)//如果第一行写满,写第二行(对于1602液晶)

                             Write1602Command(0xc0);//写第二行地址

            }

    }

    /1602初始化函数:

    void Initialize1602()

    {  

           Delayms(20);

           Write1602Command(0x38);//显示模式设置:5*7点阵,8位数据接口

           Write1602Command(0x08);//显示关

           Write1602Command(0x01);//清屏

           Write1602Command(0x06);//写一个字符地址指针加一、光标加一

           Write1602Command(0x0c);//显示开

    }

     

    //主函数:

    int main(void)

    {  

           Initialize1602();//初始化1602

           LCD1602DisplayString(0,2,"http://wushifuc51.21ic.org");

                                                                 //在第一行第二个位置开始写字符串

           LCD1602DisplayOneNumber(1,15,8);//在第二行最后一个位置显示数字8

           while(1);

           return 0;

    }

  • 相关阅读:
    《P3953 [NOIP2017 提高组] 逛公园》
    《P4180 [BJWC2010]严格次小生成树》
    《济南icpc补题》
    《levil的因子和》
    《洛谷P2704 [NOI2001]炮兵阵地》
    《Codeforces Round #689 (Div. 2, based on Zed Code Competition)》
    《2174: Leapin' Lizards》
    《3820: Revenge of Fibonacci 》
    马拉车求最长回文子串
    二分训练
  • 原文地址:https://www.cnblogs.com/alanfeng/p/5082595.html
Copyright © 2011-2022 走看看