这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 物联网技术 » 51单片机简单的驱动LCD1602

共1条 1/1 1 跳转至

51单片机简单的驱动LCD1602

菜鸟
2020-07-14 13:26:17     打赏

【LCD1602】


什么是LCD1602


LCD1602是一种工业字符型液晶,能够同时显示16x02即32个字符。LCD1602液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,即可以显示出图形。


1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。

 

1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。

 

市面上字符液晶大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。

 

注意:LCD1602仅能显示字母、符号或数字,无法显示汉字。

 

LCD1602管脚

20181213214413743.png


状态字

20181213214753416.png


RAM地址映射

20181213214818324.png


控制器接口时序

1、读操作时序

20181213215753711.png


2、写操作时序

20181213215811804.png


3、时序参数

20181213215836125.png


基本操作时序

1602的基本操作时序一共有4个,下面一一介绍。

写程序前我们先将用到的总线接口做一个同意声明:



#define LCD1602_DBP2           //并行输入口

sbit LCD1602_RS =P0^5;         //数据/命令选择端

sbit LCD1602_RW =P0^6;         //读写选择端

sbitLCD1602_EN = P0^7;         //使能端


<1>读状态:RS = L,R/W = H,EN = H



LCD1602_DB = 0xFF;

LCD1602_RS = 0;

LCD1602_RW = 1;

LCD1602_EN = 1;

sta = LCD1602_DB;


这样就把当前液晶的状态字读到了sta这个变量中,可以通过判断sta最高位的值来了解当前液晶是否处于“忙”状态,也可以得知当前数据的指针位置。

 

<2>读数据:RS = H,R/W = H,EN = H

在实际使用时,读数据很少使用,大家可以仅了解就行。

 

<3>写指令:RS = L,R/W = L,D0~D7 = 指令码,EN = 高脉冲 

在这里就E = 高脉冲需要了解一下。因为这一句很关键,当前状态是写数据,根据时序图,首先保证EN引脚是低电平状态,不管前三句之前怎么设置,1602这里EN引脚没有使能控制,就不会读总线上的信号。当前三句准备好之后,让EN引脚从低电平到高电平变化,然后EN引脚再从高电平到低电平出现一个下降沿,1602检测到这个下降沿之后,并且检测到RS = L,R/W = L,就会马上读取D0~D7的数据,完成单片机写1602指令的过程。

 

归纳:EN使能引脚先低拉高,再从高拉低,形成一个高脉冲。

 

<4>写数据:RS = H,R/W = L,D0~D7 = 数据,EN = 高脉冲

写数据与写指令类似,就是把RS改成H,把总线改成数据而已。

 

指令介绍

1、显示模式设置

写指令0x38:设置16×2显示,5×7点阵,8位数据接口。(这条指令是固定的,必须写0x38)

20181213220730798.png


2、显示开/关以及光标设置指令

如下图所示:

第一条指令:一个字节中8位,前5位是固定的0B0001,低3位分别用DCB从高到低表示

第二条指令:高6位是固定的0B000001,低2位使用NS从高到低表示

2018121322083492.png


3、清屏指令

写入0x01表示显示清屏(固定的),其中包含了数据指针清零,所有的显示清零。

写入0x02仅仅是数据指针清零,显示不清零。

20181213221509387.png


4、RAM地址设置指令

该指令的最高位为1,低7位为RAM地址,RAM地址与液晶上字符的关系如上图所示。通常在读写数据之前都要先设置好地址,然后再进行数据的读写操作。

20181213221201331.png


5、初始化过程



延时15ms

写指令38H(不检测忙信号)

延时5ms

写指令38H(不检测忙信号)

延时5ms

写指令38H(不检测忙信号)

(以后每次写指令、读/写数据操作前,都要检测忙信号)

写指令38H:显示模式设置

写指令08H:显示关闭

写指令01H:显示清屏

写指令06H:显示光标移动设置

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


电路图

20181213221952612.png


或者可以参考下图

20181213222028983.png


【程序】


关于LCD1602的参考程序,我在这里放两个,一个是自己最开始做51小车时写的关于LCD1602的程序,以下程序仅供参考



/*写命令*/

void Write_Cmd(ucharcmd)

{

    LCD1602_RS = 0;         //写入命令

    LCD1602_RW = 0;

    LCD1602_DB = cmd;          

    Delay_10us(10);

    LCD1602_EN = 1;         //使能端高电平

    Delay_10us(10);

    LCD1602_EN = 0;

}

 

/*写数据*/

void Write_Dat(uchardat)

{

    LCD1602_RS = 1;

    LCD1602_RW = 0;

    LCD1602_DB = dat;

    Delay_10us(10);

    LCD1602_EN = 1;         //使能端高电平

    Delay_10us(10);

    LCD1602_EN = 0;

}

 

/*LCD1602初始化*/

void LCD_INIT()

{

    Write_Cmd(0x38);        //设置显示模式

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

    Write_Cmd(0x06);        //写一个指针+1

    Write_Cmd(0x01);        //清屏

    Write_Cmd(0x80);        //设置数据指针起点

}

 

/*延时函数*/

void Delay_10us(uintn)

{

    while(n--)

    {      

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

    }

}

 

/*LCD1602显示*/

void Print_LCD1602()

{

    uint i,j;

    Write_Cmd(0x80);                //写第1行

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

        Write_Dat(str1[i]);

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

        Write_Dat(disdata[i]);

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

        Write_Dat(str2[i]);

   

    Write_Dat(0x20);

   

    if(HAA == 1)

        Write_Dat('B');

    else if(HAA == 0)

        Write_Dat('T');

   

    Write_Cmd(0x80 + 0x40);//写第2行

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

        Write_Dat(str3[j]);

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

        Write_Dat(distance[j]);

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

        Write_Dat(str4[j]);

}


另一个是自己后来多了解之后看的



#define LCD1602_DBP2           //并行输入口

sbit LCD1602_RS =P0^5;         //数据/命令选择端

sbit LCD1602_RW =P0^6;         //读写选择端

sbit LCD1602_EN =P0^7;         //使能端   

 

void main()

{

    LCD1602_Init();

    LCD1602_Show(2,0,"Xiaomo_HAA");

    LCD1602_Show(0,11,"HAppy!");

}

 

//等待液晶准备好

void LCD1602_wait()

{

    unsigned char sta;

    LCD1602_DB = 0xff;

    LCD1602_RS = 0;

    LCD1602_RW = 1;

 

    do{

        LCD1602_EN = 1;

        sta = LCD1602_DB;    //读取状态字

        LCD1602_EN = 0;     

    }while(sta & 0x80);      //bit7等于1表示液晶正忙,重复检测直到其为0为止

}

 

//写命令

voidLCD1602_cmd(unsigned char cmd)

{

    LCD1602_wait();

    LCD1602_RS = 0;

    LCD1602_RW = 0;

    LCD1602_DB = cmd;

    LCD1602_EN = 1;

    LCD1602_EN = 0;

}

 

//写数据

voidLCD1602_Data(unsigned char dat)

{

    LCD1602_wait();

    LCD1602_RS = 1;

    LCD1602_RW = 0;

    LCD1602_DB = dat;

    LCD1602_EN = 1;

    LCD1602_EN = 0;

}

 

//设置显示RAM起始地址(x,y对应屏幕上字符坐标)

voidLCD1602_SetRAM(unsigned char x,unsigned char y)

{

    unsigned char addr;

    if(y == 0)

        addr = 0x00 + x;

    else

        addr = 0x40 + x;

    LCD1602_cmd(addr | 0x80);

}

 

//显示字符串

voidLCD1602_Show(unsigned char x,unsigned y,unsigned char *str)

{

    LCD1602_SetRAM(x,y);

    while(*str != '\0')

    {

        LCD1602_Data(*str++);

    }

}

 

//初始化LCD1602

void LCD1602_Init()

{

    LCD1602_cmd(0x38);      //设置显示模式

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

    LCD1602_cmd(0x06);      //写一个指针+1

    LCD1602_cmd(0x01);      //清屏

}





关键词: 单片机     简单     驱动     LCD1602     液晶     显示         

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]