- 什么是LCD1602

LCD:Liquid Crystal Display—液晶显示器,简称LCD,其主要显示原理是以电流刺激液晶分子产生点、线、面并配合背部灯管构成画面,通常把各种液晶显示器都直接叫做液晶。
1602:液晶的命名通常都是按照显示字符的行数或液晶点阵的行、列数来的。1602的意思是每行可以显示16个字符,一共可以显示俩行,类似还有0801、1601等。
注意:此类液晶都是字符液晶,即只能显示ASCII码字符,如数字、大小写字母、各种符号等。
LCD1602显示如图:

- 如何操作LCD1602

在操作之前先要了解LCD1602的几个重要知识点:
RS:数据/命令选择端,它控制着指令操作和数据操作,RS=0即对LCD指令操作,RS=1即对LCD数据操作。
RW:读写选择端,顾名思义其作用就是控制读和写的,RW=0即对LCD进行写操作(可以写指令或者数据),RW=1即对LCD进行读操作。
E:使能信号,E的一次脉冲代表操作的开始。
RAM地址映射:控制器内部带有80B的RAM缓冲区,对应关系如图所示。向图中的00-0F、40-4F地址中的任意一处写入数据时(对应着1602,即每行可以显示16个字符,一共可以显示俩行),液晶屏都可以立刻显示出数据,但当写入其他地址处时就得通过移屏指令将它们移入可显示区域方可显示。

数据指针:控制器内部设有一个数据地址指针,用户可以通过它们访问全部的80B的RAM(访问方式:0X80+相应地址码)。

说了这么多那到底如何使LCD1602显示字符呢?简单讲分为三块:初始化、指令操作、数据操作。接下来我们梳理一下这三块内容(以实际应用为主,不可能面面俱到,请谅解)。
初始化:初始化可以理解为设置LCD1602的显示方式,下面列出一组常用的初始化指令。

void LCD_1602_init()//初始化
{
LCD_1602_Cmd(0X38);//开显示:8位一行、5x7显示点阵
LCD_1602_Cmd(0X06);//每写入一个字符后指针加一,即光标右移一位
LCD_1602_Cmd(0X0c);//开显示但不显示光标
LCD_1602_Cmd(0X01);//清屏
//LCD_1602_Cmd(0X18):所有显示的字符向左移一位,
//LCD_1602_Cmd(0X80):设置数据指针的起点如LCD_1602_Cmd(k2+0x80)。
}

指令操作:一般都是对LCD进行写指令的,所以RW=0、RS=0

void LCD_1602_Cmd(uchar cmd)//写指令
{
RS=0; //时序为先RS再RW最后E
RW=0;
P0=cmd;//具体指令给P0,因为一般LCD的八位数据端口对应接在P0上
E=1; //一次脉冲、一次使能信号
dy(2);
E=0;
}

数据操作:对LCD进行写数据操作,即RW=0、RS=1

void LCD_1602_Data(uchar dat)//写数据,写入数据dat(dat是ASCII码字符,如数字、大小写字母、各种符号等)
{
RS=1;
RW=0;
P0=dat;//具体数据给P0
E=1;
dy(2);
E=0;
}

显示的位置:显示是没有问题了,但要在LCD的哪个位置显示呢?这就要用到上文的数据指针了,数据指针指向哪一个地址,数据就显示在哪一位,我们以行为x、列为y来表示具体的位置

void LCD_1602_Display(uchar x,uchar y,uchar dat)//在x行、y列进行显示字符dat
{
uchar k1=0x00,k2=0x40;//对照RAM地址,第一行显示出的16位都是0x0?,第二行都是0x4?
if(x==1)//如果在第一行
{
k1+=y;//此时k1就对应是(x,y)地址了
LCD_1602_Cmd(k1+0x80);//数据指针的访问位置
}
else//在第二行
{
k2+=y;
LCD_1602_Cmd(k2+0x80);
}
LCD_1602_Data(dat);//在(x,y)上显示对应数据
}

显示数字和单个字符:在显示数字时因为数字0的ASCII码为48,所以要LCD_1602_Data(6+48);,显示单个字符时要上单引号LCD_1602_Data('k');,所以显示数字也可以LCD_1602_Data('6');
有关LCD1602的操作这些就足够了。

- 上代码

在下利用LCD1602实现了一个简单的’‘i love you’'显示,代码如下(亲测可以使用):

#include"reg51.h"
#define uchar unsigned char
#define uint unsigned int
uchar p[]="i love you";
sbit E=P2^7;//使能E,以脉冲形式发送信号
sbit RS=P2^6;//0:指令 1:字符
sbit RW=P2^5;//0:写 1:读 void dy(uint x)
{
uint i;
i=x*100;
while(i--);
} void LCD_1602_Cmd(uchar cmd)//写指令
{
RS=0; //时序为RS、RW、E
RW=0;
P0=cmd;
E=1; //一次脉冲、一次使能信号
dy(2);
E=0;
} void LCD_1602_Data(uchar dat)//写字符
{
RS=1;
RW=0;
P0=dat;
E=1;
dy(2);
E=0;
}
void LCD_1602_init()//初始化
{
LCD_1602_Cmd(0X38);//开显示:8位一行、5x7显示点阵
LCD_1602_Cmd(0X06);//每写入一个字符后指针加一,即光标右移一位
LCD_1602_Cmd(0X0c);//开显示但不显示光标
LCD_1602_Cmd(0X01);//清屏
//LCD_1602_Cmd(0X18):所有显示的字符向左移一位,
//LCD_1602_Cmd(0X80):设置数据指针的起点如LCD_1602_Cmd(k2+0x80)。
} void LCD_1602_Display(uchar x,uchar y,uchar dat)//在x行、y列进行显示字符dat
{
uchar k1=0x00,k2=0x40;
if(x==1)
{
k1+=y;
LCD_1602_Cmd(k1+0x80);
}
else
{
k2+=y;
LCD_1602_Cmd(k2+0x80);
}
LCD_1602_Data(dat);
} void display(uint l,uchar *p)//显示字符串
{
uint i;
for(i=0;i<l;i++)
LCD_1602_Data(p[i]);
} void main()
{
uchar i;
LCD_1602_init();
//LCD_1602_Display(2,0,6+48);//显示数字时加48,因为0的ascii码为48
for(i=0;i<sizeof(p)-1;i++)
{
LCD_1602_Display(1,i,p[i]);
}
LCD_1602_Cmd(0X80+0X40);
display(sizeof(p)-1,p);
}

希望可以对读者的学习助力!

51单片机—LCD1602显示模块的更多相关文章

  1. 51单片机通过ESP8266模块与手机进行通讯(单片机)

    相关连接和资料下载: 个人博客 资料下载 Step1:配置ESP8266 通过USB转TTL模块把ESP8266模块和电脑连接起来,如图: 把ESP8266模块的VCC,GND,CH_PD,UTXD, ...

  2. 51单片机 HC05蓝牙模块

    一.注意事项 1.烧写程序时,要把蓝牙tx,rx信号线拔掉,对烧写程序有影响. 2.执行HC05集命令时,均以\r\n结尾.串口中断若选择“发送新行”时,不用添加\r\n.原理相同. 二.准备软硬件 ...

  3. 51单片机对无线模块nRF24L01简单的控制收发程序

    它的一些物理特性如工作频段.供电电压.数据传输速率就不详细介绍了,直接上代码. 1.首先是发送端: // Define SPI pins #include <reg51.h> #defin ...

  4. [51单片机] nRF24L01 无线模块 测试 按键-灯-远程控制

    哈哈,穷吊死一个,自己做的一个超简单的板还没有电源提供,只得借助我的大开发板啦.其实这2个模块是完全可以分开的,无线嘛,你懂得!进入正题,这个实验的功能就是一个发送模块(大的那个板)连接4个按键,通过 ...

  5. [51单片机] nRF24L01 无线模块 串口法命令 通过无线控制另一个的灯

    >_<!概述: 这是在上一个的基础上通过按键发送4种不同命令来控制接收端的LED灯亮的改进版(上一个:http://www.cnblogs.com/zjutlitao/p/3840013. ...

  6. #51单片机#蓝牙模块(ATK-SPP-HC06从机串口)的使用方法

    #include <AT89X51.H> #include <intrins.h> // 函数原形定义 #define uchar unsigned char #define ...

  7. 基于51单片机个LCD1602的万年历程序

    小白 第一次跟新博客 基于51单片机和LCD1602的万年历程序 可实现走时和调时功能 有简单的1602菜单制作 欢迎大家交流 LCD1602和51单片机的连接方法 RS = P3^5; //数据/命 ...

  8. LCD1602液晶显示模块的单片机驱动深入详解之软件篇(AVR)

    LCD1602液晶显示模块的驱动虽然比七段数码管之类的显示要复杂一些,但实际上也并不是很难,最主要的还是初始化,为什么这么说呢?我们在调试一块新液晶屏的时候,都会先初始化看看有没有光标在闪,没有光标前 ...

  9. 51单片机实现对24C02进行页写、顺序读取并显示验证

    //************************************************************************************* //**程序名称:51单 ...

随机推荐

  1. com.rabbitmq.client.impl.Frame.readFrom(Frame.java:95)

    RabbitMQ 基于Erlang 实现, 客户端可以用Python | Java | Ruby | PHP | C# | Javascript | Go等语言来实现.这里做个java语言的测试.首先 ...

  2. leetcode 面试题 17.22. 单词转换(DFS+回溯)

    题目描述 思路分析 这题回溯,先想出它的空间解是什么,这里空间解,其实就是给的原字符串到结束字符串中间的变形过程,那么就可以容易的画出一个解空间树,用深度搜索进行搜索, 剪枝后,进入下一个维度,再进行 ...

  3. java封装继承以及多态(含代码)

    封装 该露的露,该藏的藏 我们常需设计要追求,"高内聚,低耦合".高内聚就是类的内部数据操作细节自己完成.不允许外部干涉:低耦合:仅暴漏少量的方法给外部使用. 封装(数据的隐藏) ...

  4. 如何使用Jdk查看源码?

    先看再点赞,给自己一点思考的时间,如果对自己有帮助,微信搜索[程序职场]关注这个执着的职场程序员.我有什么:职场规划指导,技能提升方法,讲不完的职场故事,个人成长经验. 最近,有很多读者问我,有没有j ...

  5. 为什么0x100是256个字节、0x400是1KB、0x800是2KB、0x1000是4KB?

    [TOC] # 前言在刚开始学习嵌入式时我们就遇到各种进制之间的换算,十六进制.十进制.八进制.二进制等等,一开始会经常在各种进制之间迷失自我:在深入学习或者做项目或者工作时我们也经常要查看各种芯片的 ...

  6. ARTS第十一周

    受辞职考研和新冠肺炎疫情影响,一直没更.遗憾,数学和专业课再高点就有戏了.继续. 1.Algorithm:每周至少做一个 leetcode 的算法题2.Review:阅读并点评至少一篇英文技术文章3. ...

  7. Docker单机网络实战

    前言 Docker系列文章: 此篇是Docker系列的第八篇,大家一定要按照我做的Demo都手敲一遍,印象会更加深刻的,加油! 为什么要学习Docker Docker基本概念 Docker镜像基本原理 ...

  8. 高校表白App-团队冲刺第四天

    今天要做什么 就如昨天所说,今天继续进行引导页制作的学习.并开始通过ViewPager做简单的布局与Activity. 遇到的问题 本来以为只是使用一个ViewPager控件就可以搞定,原来还是需要配 ...

  9. Python_结合Re正则模块爬虫

    ##### 爬取古诗文import reimport requestsdef parse_page(url): headers = { 'User-Agent':'Mozilla/5.0 (Windo ...

  10. mybatis-5-关联查询

    外键查询 1.回忆外键约束 注意要在tbl_dept中添加外键 #添加外键约束 # 此处Employee为外键表,dept为主键表 # 删除Employee的数据不会影响dapt,而删除dept一定会 ...