本帖最后由 丸子~ 于 2021-8-28 15:49 编辑

在开发产品时,很多时候,我们需要将系统的信息进行可视化展示,方面我们对系统进行测试。这里我们介绍如何通过常用的LCD1602液晶来显示一些单片机的信息。


所谓的1602是指显示的时候,有2行内容每行有16个字符。其实这类字符型产品都可以这样解读比如:lcd12864就是有128行64列。目前市面上字符液晶大多数是基于HD44780液晶芯片的,控制原理大多相同。因此基于HD44780写的液晶控制程序可以很方便适用于市面上大多数字符型液晶产品。
1602引脚信号说明

字符型LCD1602通常分为14条引脚和16引脚两种,16引脚多出来的是背光电源线VCC(15引脚)和地线(16引脚),其控制原理与14引脚LCD完全一样,引脚定义如下表:



V$W}H639]4QK_[6[_ZY}XIF.png


控制器接口介绍1、基本操作时许

  • 1.1读状态:输入:RS=L,RW=H,E=H
    ----输出:D0~D7=状态字
  • 1.2写指令:输入:RS=L,RW=L,D0~D7=指令码
    ----输出:无
  • 1.3读数据:输入:RS=H,RW=H,E=H
    ----输出:D0~D7=数据
  • 1.4写数据:输入:RS=H,RW=L,D0~D7=数据,E=高脉冲
    ----输出:无
2、状态字说明
STA7 D7STA6 D6STA5 D5STA4 D4STA3 D3STA2 D2STA1 D1STA0 D0

STA0-6当前数据地址指针的数值
STA7读写操作使能1:禁止 0:允许

对控制器每次进行读写操作前,都必须进行读写检测,确保STA7为0

3、指令说明

初始化设置
显示模式设置

20201128164513484.png
显示开/关光标设置
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Njg5NzA3Mw==,size_16,color_FFFFFF,t_70.jpg
20201128164957868.png
数据控制
控制器内部没有一个数据地址指针,可以通过他们来访问内部的全部80字节RAM。
其他设置

指令码功能
01H显示清屏:1.数据指针清零 2.所有显示清零
02H显示回车:1.数据指针清零

初始化过程:

延时写指令38H延时写指令38H延时写指令38H(每次写指令、读/写数据操作之前均需检测信号)写指令38H:显示模式设置写指令08H:显示关闭写指令01H:显示清屏写指令06H:显示光标移动设置写指令0CH:显示开及光标设置

下图为实际LCD1602与单片机的电路原理图:
20210612_fig001.jpg

除了单片机最小系统的元器件外,还需要液晶显示器1602以及相应的电阻,其实物图如图2所示:

20210612_fig002.jpg

图中,排针用于使用杜邦线连接LCD1602和单片机,可调变阻器用于调节LCD1602的明暗程度。

最后,给出简单的LCD1602显示的C语言程序:

#include<reg52.h>

#define uchar unsigned char

#define uint unsigned int

sbit lcden=P2^7;

sbit lcdrs=P2^5;

uchar code table1[]="   Hello World!   ";

uchar code table2[]=" tengweitw.com  ";

void delay(uint z)

{

        uint x,y;

        for(x=z;x>0;x--)

                for(y=110;y>0;y--);

}

void write_com(uchar com)// LCD1602写命令

{

        lcdrs=0;

        P0=com;

        delay(5);

        lcden=1;

        delay(5);

        lcden=0;

}

void write_date(uchar dat)// LCD1602写数据

{

        lcdrs=1;

        P0=dat;

        delay(5);

        lcden=1;

        delay(5);

        lcden=0;

}

void init()

{

        lcden=0;

        write_com(0x38); //设置1602显示

        write_com(0x0e);//开显示、显示光标、光标不显示

        write_com(0x06); //移动光标

        write_com(0x01); //清除LCD的显示内容

        write_com(0x80);//设置显示的起始地址

}

void main()

{

        uchar num;

        init();

    write_com(0x80);

        for(num=0;num<16;num++)//显示第一行

                {

                        write_date(table1[num]);

                        delay(10);

                }

    write_com(0x80+0x40);

        for(num=0;num<16;num++)//显示第二行

                {

                        write_date(table2[num]);

                        delay(10);

                }

        while(1);//程序停在

}