一、关于LCD1602:在编写LCD1602程序之前,我们必须了解其手册中一些非常重要的信息。如果不能彻底理解这些信息,编程可能会遇到或多或少的问题。在此,我们
一、关于LCD1602:
在编写LCD1602程序之前,我们必须了解其手册中一些非常重要的信息。如果不能彻底理解这些信息,编程可能会遇到或多或少的问题。在此,我们总结几点。
1.引脚:
602共有16个管脚,但编程使用的主要管脚只有三个,分别是:RS(数据命令选择端)、R/W(读/写选择端)、E(使能信号);未来编程将集中在这三个管脚上进行初始化、命令写入和数据写入。
这三个引脚详细描述如下:
RS寄存器选择、高级数据寄存器选择和低级指令寄存器选择。
R/W是读写选择,高电平读,低电平写。
端子E是使能端子,其后是时序。
此外,D0至D7分别是8位双向数据线。
2.操作顺序:
标准英语
读写
处理说明
0
0
写入指令代码D0~D7
0
一个
读取D0~D7状态字
一个
0
写入数据D0~D7
一个
一个
从D0至D7读取数据
注意:对于E=H脉冲-开始时将E初始化为0,然后将E设置为1,再将其清零。
读取状态字时,注意位D7,D7=1,禁止读写操作;D7=0,允许读写操作;
所以控制器每次读写操作前,都要进行读写检测。(即下面的read busy子程序)
3.指令集:
LCD_1602初始化指令概要:
0x38设置16*2显示,5*7点阵,8位数据接口
0x01清除屏幕
0x0F在显示器上,显示光标,光标闪烁。
0x08仅显示
0x0e打开显示器,显示光标,光标不闪烁。
0x0c打开显示屏,但不显示光标。
0x06地址加1,写数据时光标右移。
0x02地址计数器AC = 0;(此时地址为0x80)光标回到原点,但DDRAM中断内容不变。
0x18光标随着显示屏向左移动。
4.显示地址:
点击下一页
LCD1602的内部RAM显示缓冲地址的映射。00 ~ 0F和40 ~ 4F分别对应LCD1602上下两行的每个字符。只要把要显示的字符的ASCII码写入相应的RAM地址,就可以显示了。
5.读写顺序:
序列图1602在手册里,这里就不引用了。时序图很重要。编程就是根据时序图设置寄存器,使LCD工作。
二、LCD1602编程过程:
知道以上信息后就可以写LCD1602了。这里,我们将程序分为以下步骤:
1.定义LCD1602管脚,包括R/W,E R/W,E,这里的定义是指这些管脚分别连接到哪些I/O端口。
以下是一些例子:
sbit en=p3^4;
sbit rs=p3^5;
sbit rw=p3^6;
2.显示初始化。在该步骤中,初始化并设置显示模式,包括以下步骤:
设置模式
耽搁
清除显示缓存
设置显示模式
建议的初始化过程如下:
15毫秒延迟
写指令38H
延迟5毫秒
写指令38H
延迟5毫秒
写指令38H
延迟5毫秒
注:以上38H指令可根据情况省略1~2步。
(以上都没有检测到占线信号)
(忙信号应该在下面检测到)
写指令38H
写入08H关闭显示。
编写指令01H以显示清晰的屏幕。
写06H光标移动设置。
写入0cH以显示on和光标设置。
3.设置显示地址(显示字符写入的位置)。
4.写入显示字符的数据。
三、LCD1602各子程序模块及主程序编写:
现在,根据上述编程的过程,给出每个子程序模块和主程序的例子。
1.头文件、宏定义、定义引脚等。:
# include & ltreg52.h & gt
# include & ltstring.h & gt
#定义uchar无符号字符
#定义uint无符号整数
sbit en=p3^4;
sbit rs=p3^5;
sbit rw=p3^6;
uchar码表0[]= { ” QQ:545699636 ” };//此语句是显示字符串时定义的字符串数组。
2.2的基本初始化子程序。液晶显示器1602:
无效液晶显示器1602()
{
EN = 0;
RS = 1;
RW = 1;
P0 = 0xff//这里P0是连接LCD D0~D7的I/O口。
}
3.读取忙子程序:
void read_busy()
{
P0 = 0xff
RS = 0;
RW = 1;
EN = 1;
而(P0 & amp0x 80);//P0和1000000相,如果D7不为0,就此打住。
EN = 0;//如果是0,跳出,进入下一步;该语句的目的是检测位D7。
}//如果你在这里忙着等,就不要跳出read-busy子程序来执行读写指令了。
4.写指令和数据子程序:
无效写入(uchar i,位j)
{
read _ busy();
P0 = I;//其中i=0,写指令;I=1,写数据;
RS = j;
RW = 0;
EN = 1;
EN = 0;
}
5.延迟子程序:
Void delay(uint c) //该函数用于在初始化等其他子程序中提供1xc MS的延迟。
{
uint a,b;
for(a = 0;a & ltc;a++)
for(b = 0;b & lt120;b++);
}
6.LCD1602初始化子程序:
Void init() //完全按照要求的初始化过程,省略了中间的一步写指令38H。
{
延迟(15);
写(0x38,0);
延迟(5);
写(0x38,0);
写(0x08,0);
写(0x01,0);
写(0x06,0);
写(0x0c,0);
}
7.显示单个字符子程序:
VoidDisplay _ LCD _ byte (Uchar Y,Uchar X,Uchar Z)//y = 0,1(起始行)X=0~15(起始列)Z=要写入的字符的ASCII码。
{
第二行是否显示IF(y) //如果第一行Y=0,不要输入IF语句;如果在第二行,输入if语句。
{
x+= 0x 40;//第二行的起始地址加上列数就是字符显示地址。
}
x+= 0x 80;//设置数据指针位置
写(x,0);
写(z,1);//写入数据
}
8.显示字符串子程序:
VoidDisplay _ LCD _ Text (uchar y,uchar x,uchar table[])//y,x同上面的字符显示,以及table[]字符串数组。
{
uchar z = 0;
uchar t;
t = strlen(table)+x;//查找字符串长度加上起始列位置
while(x & lt;T) //作用是LCD显示字符串的最后一个字符,防止字符串。
{//没有16个字符,所以没有足够的位数生成乱码;
display_lcd_byte(y,x,table[z]);//逐位显示数组中的字符
x++;
z++;
}
}
9.主程序:
在主程序中,除了初始化程序,还加入了自己编写的显示子程序。可以根据你想要的功能编写各种类型的显示子程序,这里就不赘述了。以下示例是显示字符和显示字符串的display子例程。
void main()
{
LCD 1602();
init();
display_lcd_byte(0,0,’ A ‘);//显示一个字符
display_lcd_text(1,3,table);//显示字符串
while(1);
}
至此,LCD1602显示的操作流程和编程思路基本可以告一段落。这里有一个完整的显示程序,可以显示两行英文:http://www.jinritoutiao.com,你可以效仿,自己修改运行,但是1602的功能远不止这些。使用1602,可以显示动态效果,除了显示一般的字符,1602还支持自定义字符等一些其他功能。下面简单介绍一下显示动态效果和自定义字符。
首先,展示动态效果:
动态效果包括闪烁字符或字符串的原始位置,或前后移动等。其实动态效果的原理很简单,就是简单的利用延时。
比如让一个字符原来的位置闪烁,可以认为是让1602先显示字符。延迟一段时间后可以显示空格子或者直接清屏可以达到让角色消失的效果。然后,让1602延迟一段时间后显示字符。
同样,来回移动字符也是如此。例如,让字符显示在第一个位置,延迟一段时间后让它们显示在第二个位置。只需在显示地址上加1,然后显示它们。字符串也是如此。
这里补充的是如何让字符串从1602年的第16个地址进入,动态前移。实际上,通过显示地址表,我们知道起始位置开始后的1602行只能显示16个字符,但一行的地址远不止16个。大家可以看到,第一行的地址是从00到27,但是在1602的可视范围内只能显示00到0f,后面的位置实际上起到了缓冲的作用。你可以让字符数据存在RAM的地址10之后,但是我们看不到。如果10之前的地址存在,我们可以看到显示。
所以我们可以先把显示起始地址设置在地址10之后的一个位置,然后让字符显示地址每次加1。当加到0F时,我们可以看到字符串的第一个字符出现在1602的最后一位,然后向前移动。
这是一个字符串移动显示的示例:
void display_lcd_byte(uchar y,uchar x,uchar z)
{
如果(y)
{
x+= 0x 40;
}
x+= 0x 80;
写(x,0);
写(z,1);
}
void display_lcd_text(uchar y,uchar x,uchar table[])
{
uchar z = 0;
uchar t;
t = strlen(table)+x;
while(x & lt;t)
{
display_lcd_byte(y,x,table[z]);
x++;
z++;
}
display_lcd_byte(y,x,’ ‘);
}
//前两个子例程是显示子例程
void main()
{
乌恰尔一世;
LCD 1602();
init();
for(I = 16;我& gt=0;I-)//这里的循环是让字符串从后向前显示。
{
display_lcd_text(0,I,table 0);//i减少一次,第一个字符前进一位。
延迟(200);
}
while(1);
}
第二,显示自定义字符:
如果要显示自定义字符,必须先获取所需图形或字符的字体数组。可以通过手动提取得到对应的字体。
如下图所示,对应一个字符显示区。每个8字节,形成一个点阵数组。
点击下一页
如果要显示一个网格,让那个位为1,每行有5个自定义位,全白为0x00全黑是0x1f。共有8行,每行一位数据。
生成的点阵数组保存在CGRAM存储器中,以生成自定义字符。602内部CGRAM用于存储自定义字符点阵,共64字节。根据前面的点阵提取,每个字符由8个字节的数据组成。因此,64字节的CGRAM存储器可以存储8组自定义字符的点阵阵列。根据CGRAM的地址,0~7为第一组,8~15为第二组,56~63为第八组数据。
Code是数据的显示地址,范围从0到7,可以存储8位自定义字符。(可以存储八个自定义,每个字符存储)
CGRAM地址是存储数据的地址,有64个字节,从0到63。它存储64个数据。我们写的数据是0x40~0x7F,总共128位。(将字符数组中的8个数字发送到这8个地址中,每次存储一个字符的8位,下一次地址直接转移到0x48)
CGRAM数据字体的每一行有5位数据。
显示常用字符时,显示代码从0x20开始。0x00~0x0F保留用于显示自定义字符。0x00~0x07和0x08~0x0F的内容相同。例如,调用0x01位置和0x09位置时,显示的内容是相同的。
LCD1602自定义字符显示有四个步骤,如下所示:
1.将该数据设置为存储在CGRAM中。初始地址是0x40。然后存一点再加8,
总共可以存储8个自定义字符。
2.然后,您可以将自定义数据发送到LCD的CGRAM中。
3.向LCD写入指令,并将其发送到需要显示数据的地址。
4.向LCD写入指令,将显示的数据指向LCD的CGRAM中存储的位置,并显示自定义字符。
例子如下:
1.建立字符数组;
uchar LCD_Data1[]={0x01,0x03,0x1D,0x11,0x1D,0x03,0x01,0x 00 };
2.设置CGRAM地址和写指令;
Write_LCD(0x40,0);
3.将数据发送到CGRAM地址;
for(I = 0;我& lt8 ;i ++)
{
Write_LCD(LCD_Data1[i],1);
}
4.编写要显示的位置指令;
Write_LCD(0x80,0);
5.将CGRAM的0位数据发送到LCD1602,显示数据中存储的数据;
Write_LCD(0x00,1);
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。
作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/226070.html