历史上的今天
返回首页

历史上的今天

今天是:2024年09月01日(星期日)

正在发生

2021年09月01日 | 51单片机—LCD1602显示模块

2021-09-01 来源:eefocus

- 什么是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 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 {

LCD_1602_Display(1,i,p[i]);

}

LCD_1602_Cmd(0X80+0X40);  

display(sizeof(p)-1,p);

}

推荐阅读

史海拾趣

Gwconnect (Molex)公司的发展小趣事
相比集成电路,分立元件构成的电路体积较大,占用空间多。
DENWIRE公司的发展小趣事
超声波在医疗领域也有广泛应用,如超声波诊断仪利用超声波发射电路产生超声波并接收反射信号来形成图像,帮助医生进行疾病诊断。
AKM [Asahi Kasei Microsystems]公司的发展小趣事
使用分立元件构成电路,相比集成电路成本更低。
Excelsys公司的发展小趣事

人才是企业发展的核心驱动力。Excelsys公司高度重视人才培养和团队建设。公司建立了完善的人才培养机制,为员工提供系统的培训和学习机会;同时,公司还注重团队文化的建设,营造积极向上、团结协作的工作氛围。这些措施为公司的持续发展提供了有力的人才保障。

Defender Security公司的发展小趣事

随着勒索软件的日益猖獗,Defender Security公司迅速调整战略,成立了专门的研究小组来对抗这种威胁。他们深入分析了勒索软件的传播方式和攻击手段,开发出了高效的检测和防御系统。通过不断的技术创新和优化,Defender Security成功帮助多家企业抵御了勒索软件的攻击,赢得了市场的广泛认可。

GarrettCom公司的发展小趣事

布局:随着全球化进程的加速推进,GarrettCom(现为Belden的一部分)积极实施全球化战略。公司在全球范围内设立了多个分支机构和服务中心,以便更好地服务全球客户。同时,公司还加强了与国际知名企业的合作与交流,共同推动电子行业的发展和进步。

成果:通过全球化战略的实施和市场拓展的努力,GarrettCom(现为Belden的一部分)在全球市场上取得了显著的成绩。公司的产品和解决方案被广泛应用于全球各地的工业项目中,赢得了广泛的好评和认可。同时,公司还积极参与国际竞争与合作,不断提升自身的品牌影响力和市场竞争力。

问答坊 | AI 解惑

发现论坛bug

在点击进入电路图后,最下面有不对齐的…

查看全部问答>

陶显芳老师的开关电源设计资料

开关电源原理与设计—陶显芳…

查看全部问答>

MC33996的一个问题,高手进。。。

请问,用MC33996和S08单片机做开关量输出时,那个AND/OR到底是怎么用的?谁来解释下。。…

查看全部问答>

历届电子设计优秀作品

本帖最后由 paulhyde 于 2014-9-15 09:17 编辑 继续啊  …

查看全部问答>

各位前辈们 谁用过 sc32442这系列的芯片?很想知道这系列的不同型号有什么区别? 怎么命名的?

各位前辈们 你们谁用过 sc32442这系列的芯片?小弟要用这颗料做个手持设备 发现有很多型号 SC32442BL-33 SC32442B43-7080 SC32442B54 SC32442AL-43S SC32442AL-45 SC32442XL-31 SC32442X33-7080 SC32442X31-7080 SC32442AL-33 SC32442A45 ...…

查看全部问答>

版本移植问题请教大家???

     感谢helenhf的回复我上个问题,那个问题已经解决。是MPC8280的PCI内部空间和外部空间有一个转换关系,即outwindow地址,PCI设备的基地址应设置为0x50000000,此时 d 0x80000000 就可以看到PCI设备的寄存器了。   &nb ...…

查看全部问答>

在一个程序里面,不能在主窗体里面给弹出的各个子窗体依次发关闭消息,叫他们自己关闭自己?

在一个程序里面,不能在主窗体里面给弹出的各个子窗体依次发关闭消息,叫他们自己关闭自己?…

查看全部问答>

不同PIC单片机的C语言语法是一样的吗?

基本的C指令是一样的吗?哪儿有常用的语法资料?…

查看全部问答>

wince 部署的问题

我通过vs2005 部署到wince板子上  但是重启又没了 我新建的文件夹也没了. 现在有一个 sd存储卡, 要不就写入到卡里 ,让他开机自动运行,但是 不知道怎么弄?…

查看全部问答>

NIOSII编译出现很诡异的问题,求大侠帮帮忙

最近在学NIOSII编程,参考别人的,写了一个很简单的程序定时器程序,编译老是出错。一直找不出原因,老是出现这个错误 multiple definition of `main\' 快疯了。现把程序贴上,求高手指点。 #include\"system.h\"#include \"altera_avalon_timer ...…

查看全部问答>