专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

常用液晶屏LCD1602的使用

作者:佚名   来源:本站原创   点击数:  更新时间:2011年11月12日   【字体:
  /***** 把自己的一些经验分享给大家 *****/
 

     LCD_1602,   学过单片机的朋友们都知道它了吧,可以说是用的最广,最简单,也是学液晶入门级别的一块液晶了。LCD1602顾名思义就是两行显示的液晶,每行最多显示16个字符(里面总共有160个字符),其中包括阿拉伯数字、英文字母的大小写,常用符号,及日文的假名!每个字符对应一个ASCII码,我们通过向液晶送相应符号的ASCII码来显示这个字符。

    总的来说这个用起来很简单的,到网上下载1602的数据手册,自己写写程序估计也就差不多了,我在这里主要是说说自己的对一些常见问题的经验,和LCD1602自定义字符的显示方法。
 
    要显示我们自定义的字符,就要用到LCD中的CGRAM存储器(character generate RAM),而我们之前用的显示自带的字符用到的是DDRAM,两个是不同的。看液晶手册我们知道,CGRAM的容量是64个字节,而一个字符是8个字节,所以一共能显示8个自定义的字符。内部常用字符的显示是从0x20开始的,0x00 ~ 0x0F是专门留给自定义字符显示用的,0x00~0x07和0x80~0x0F显示的内容是一样的,也就是说0x00=0x08,0x01=0x09,以此类推。CGRAM共128个位,地址是0x40~0x7F,128/8=16正好对应的是0x00~0x0F共16个。
 
    下面说说如何显示自定义字符吧。
 
    首先我们要清楚LCD1602显示字符的点阵大小,眼力好的可以看出来,LCD1602一个显示字符的位置是5*8的点阵,也就是说它所能显示的点阵图形的大小是5*8的!要显示一个自定义的字符,首先我们要知道所显示自定义字符的点阵数据,也就是在一个5*8的点阵上那个点是黑的(将该点点黑,就是高电平 ----1),哪个点是白的(该点不显示,为低电平----0),但是我们送入到LCD中的是ASCII码,它是8位的数据,而一个显示字符的点阵大小只是5*8的,显然不够,显示的办法是8*8点阵的前三列不用,也就是不显示,我们只用后面的5列来显示。看过数据手册我们知道,第一行第一个位置的地址是 0x80,第二行一个位置的地址是0xC0。最后就是要显示我们定义的第几个字符其对应CGRAM地址的关系式是:
 
0x00:第一个(0x40)                       0x01:第二个(0x48)   
 

0x02:第三个(0x50)                       0x03:第四个(0x58)

0x04:第五个(0x60)                       0x05:第六个(0x68)    

0x06:第七个(0x70)                       0x07:第八个(0x78)

    具体的流程是这样的:“显示字符的数组数据”--->"定义第几个自定义字符"--->“像地址中发送数组数据”--->“规定显示位置”--->“显示第几个自定义字符”--->OK!
 

    自己想显示什么字符或图像可以自己计算一下对应的数组数据,最好自己弄一个取模软件比较好,我一开始都是自己算的,感觉好麻烦。
 

/***** 下面我写一个用51驱动LCD1602的程序 *****/

   接口方面根据自己的实际电路决定。程序的完整版本下载: http://www.51hei.com/f/1602cc.rar

/* 这里是我自己的经验:在数据手册中说下降沿写入命令,但是我用上升沿写入也是好使的,这里我还是用下降沿吧;下面这条是重点,自习看下你板子上的晶振大小,最好是在下程序的时候看下具体大小事多少,如果你的晶振>11.5M的话最好在下面我标注的地方加延时,不然很可能什么都不显示,而且找不到错误。 */

#include<reg52.h>

sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;//LCD的三个控制端
unsigned char table[]={0x15,0x0A,0x15,0x0A,0x15,0x0A,0x15,0x0A};

void delay(unsigned int i)
{
    while(--i);
}
void Read_busy()    //忙检测,DB7为1则busy,不能进行读写操作 ;每次读写前应"读忙"检测
{
    P0=0x00;
    RS=0;
    RW=1;
    EN=1;
    while(P0 & 0x80);
    EN=0;
}

void write_LCD_command(unsigned char value)//写命令函数
{
    Read_busy();
    RS=0;
    RW=0; 

    EN=1;
    P0=value;
    delay(100);
    EN=0;
}

void write_LCD_data(unsigned char value)//写命令函数
{
    Read_busy();
    RS=1;
    RW=0; 
    EN=1;
    P0=value;
    delay(100);
    EN=0;
}

void init_LCD()
{
    write_LCD_command(0x38);

//在这里加延时

    delay(5);

    write_LCD_command(0x0c);//开显示,不显示光标,且不闪烁

//在这里加延时

    delay(5); 
    write_LCD_command(0x06);//每次写入数据后地址指针加1 

//在这里加延时

    delay(5);
    write_LCD_command(0x01);//清屏

}
void main()
{
    unsigned char num;
    init_LCD();
    write_LCD_command(0x40);    //对CGRAM第一个自定义字符操作,若是第二个则为0x48,其次类推(上面有对顶的关系)
    for(num=0;num<8;num++)
    {
        write_LCD_data(table[num]);
    }
    write_LCD_command(0x80);    //规定显示在第一行第一个位置
    write_LCD_data(0x00);         //显示第一个自定义字符 (0x40对应第一个:0x00)
    while(1);
}


/*到这里程序结束了,第一次写可能说的不够清晰,有不懂的可以留言给我^_^*/
关闭窗口

相关文章