首页 > 技术文章 > LCD1602液晶

xiejinxu 2019-10-20 18:28 原文

一,1602介绍

 

 

1,管脚

GND - 接地

VCC - 电源

VO -  对比度调节

RS -  数据 or 命令选择端口

RW - 读 or 写选择端口

DB0->DB7 传输口

BLA - 背光源正极

BLK - 背光源负极

2,写数据的区域

1602可以写 16x2 个字符,一行16个,一共两行。

注意!!!!!!!

1602只能接收字符库的东西(十六进制),不能接收十进制!!!!

如果要送十进制的0~9的数加上: 0x30 。这样子十进制就会转化成 ASCII 码表

比如:lcd_write_date(0x30+0);//显示0

而不是 :lcd_write_date(0);//十进制无法显示,显示出来的是一坨不知道什么东西

注意:看图先看上面再看左边(先纵再横);比如 0 就是 30 。

加个 0x 在前面就可以变成十六进制了 0x30

 

地址:                        这里是隐藏区域,可以写数据但是不会显示。使用整屏幕移动指令 16 次可以移动出来;

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F  |  10 ...... 27

40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F  |  50 ...... 67

在写数据之前要确定在哪里显示!

上面的对应了16个字符,两行。 

行地址: 0x80(起始地址)

比如:lcd_write_com(0x80);//这样子就设置了地址指针指向第一行开头

比如设定在第三个开始显示:lcd_write_com(0x80+0x03);//这样子就设定了数据在第三个开始写入

行地址: 0x80+0x40(起始地址)

比如:lcd_write_com(0x80+0x40);这样子就设置了地址指针指向第二行开头

比如设定在第三个开始显示:lcd_write_com(0x80+0x42);//这样子就设定了数据在第三个开始写入

3,说明

1602没有所谓的动态显示,静态显示。

可以这么理解:写在循环外的是静态显示<不会变的>

       写在循环内的是动态显示<会改变的>

4,指令

0011 1000 = 0x38

作用:开启1602显示,5x7点阵,8位IO口,光标设置;

0000 1DCB

D:

D = 1,开显示。D = 0,关显示,1602不显示东西。

C:

C = 1,开启光标,C = 0。关闭光标<下面的那一横东西>

B:

B = 1,光标闪烁。B = 0,光标不闪烁<闪烁的正方形>

0000 01NS

N:

N = 1,写或读数据指针与光标自动加一。N = 0,写或读数据指针与光标自动减一。

S:

S 默认0就好。

0000 0001 = 0x01

清屏指令

0000 0010 = 0x02

显示回车,指针清零

0001 1000 = 0x18

整个屏幕左移

0001 1100 = 0x1c

整个屏幕右移

二,1602驱动

#include<reg52.h>
/***************延时*******************/
void delay(unsigned int z)// 延时 z 个毫秒
{
    unsigned int x,y;
    for(x=0;x<z;x++)
    {
        for(y=0;y<110;y++)
        {
            ;
        }
    }
}
/*************1602驱动*****************/
/*              只演示写                   */
#define lcd_io P0    // 传输的 IO 口
sbit EN = P2^7;        // 使能端
sbit RS = P2^6;        // 数据或命令选择端,对应电平的( 1 0 )
sbit RW = P2^5;        // 读或写选择端,对应电平的( 1 0 )
void lcd_bus()        // 检测LCD1602是否忙
{
    unsigned char i;
    lcd_io = 0xff;    // 读命令之前置位
    RS = 0;            // 命令
    RW = 1;            // 读
    for(i=0;i<200;i++)
    {                // 最多检测 200 次,防止死机
        EN = 0;
        EN = 1;        // 发射脉冲信号
        if(!(lcd_io & 0x80))
        {
            break;    // 不忙则退出
        }
    }
    EN = 0;            // 使能端拉低,阻止数据或命令传输
}
void lcd_write_date(unsigned char date)
{
    lcd_bus();        // 检测忙
    RS = 1;            // 数据
    RW = 0;            // 写
    lcd_io = date;    // 给数据
    delay(5);        // 等待数据建立
    EN = 1;            // 高脉冲,传输数据过去
    delay(5);
    EN = 0;    
}
void lcd_write_com(unsigned char com)
{
    lcd_bus();        // 检测忙
    RS = 0;            // 命令
    RW = 0;            // 写
    lcd_io = com;    // 给命令
    delay(5);        // 等待命令建立
    EN = 1;            // 高脉冲,传输命令据过去
    delay(5);
    EN = 0;        
}
/**************初始化******************/
void init()
{
    lcd_write_com(0x38);  // 启动LCD
    lcd_write_com(0x0c);  // LCD开显示,显示光标,光标闪烁
    lcd_write_com(0x06);  // 写一个数据指针自动加一,不整屏移动
    lcd_write_com(0x01);  // 清屏指令 <方便等一下的写数据>        
}
/**************主函数******************/
void main()
{
    init();
}

三,演示

 自己思考一下吧;

 -。-、

推荐阅读