1602总结.docx

上传人:b****5 文档编号:3720563 上传时间:2022-11-24 格式:DOCX 页数:14 大小:250.09KB
下载 相关 举报
1602总结.docx_第1页
第1页 / 共14页
1602总结.docx_第2页
第2页 / 共14页
1602总结.docx_第3页
第3页 / 共14页
1602总结.docx_第4页
第4页 / 共14页
1602总结.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

1602总结.docx

《1602总结.docx》由会员分享,可在线阅读,更多相关《1602总结.docx(14页珍藏版)》请在冰豆网上搜索。

1602总结.docx

1602总结

LCD1602总结

济南职业学院电子工程系朱志强

 

1、LCD1602介绍

2、LCD1602常用指令

3、LCD操作直通车

4、LCD大提速

 

2010年7月28日

 

1、LCD1602介绍

LCD1602已很普遍了,具体介绍我就不多说了,市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的。

图1LCD160216脚

图2LCD1602字符集

 

2、LCD1602常用指令

(1)功能设定和字符格式指令

功能:

设定数据总线位数、显示的行数及字型。

位名设置

DL0=数据总线为4位1=数据总线为8位

N0=显示1行1=显示2行

F0=5×7点阵/每字符1=5×10点阵/每字符

我一般就用0X38,5×7的就够用了啊……

(2)显示开关控制指令

功能:

控制显示器开/关、光标显示/关闭以及光标是否闪烁。

位名设置

D0=显示功能关1=显示功能开

C0=无光标1=有光标

B0=光标闪烁1=光标不闪烁

我一般就用0x0c,整体显示,无光标,不闪烁。

(3)输入方式设置

功能:

设定每次定入1位数据后光标的移位方向,并且设定每次写入的一个

字符是否移动。

位名设置

I/D0=写入新数据后光标左移1=写入新数据后光标右移

S0=写入新数据后显示屏不移动1=写入新数据后显示屏整体右移1个字符

我一般都是使用的0X06,屏幕不用移动。

(4)清屏指令

功能:

<1>清除液晶显示器,即将DDRAM的内容全部填入"空白"的ASCII码20H;

<2>光标归位,即将光标撤回液晶显示屏的左上方;

<3>将地址计数器(AC)的值设为0。

我们这个就不用争了,这个没什么选的了,用的都是0X01了。

 

3、LCD操作直通车

由图1我们可以知道,RS=0写入的是指令,RS=1写入的是数据。

RW=0是写入,我们对LCD进行一般的操作,就是让她显示,这个步骤一般用不到忙检测,所以在上面的指令中我们也没有提到。

那我们所用的也只是RW=0。

E是使能信号,也有人喜欢用EN,不过都是一样的啦。

从图表中可以看出是下降沿有效。

通过对LCD指令的观察,我们可以知道,一般的指令执行的时间都是40us,这个是一个重点哦!

指令(4)清屏指令的执行时间是1.64ms,我一般都是当做2ms来处理。

在这里我要说一下我一般常用的延时函数。

(1)延时ms级函数

voiddelayms(unsignedcharms)

{

unsignedinti;

while(ms--)

{

for(i=0;i<125;i++)

;

}

}

(2)延时us级函数

voiddelayus(unsignedintus)

{

while(us--);//执行时间t=us×2毫秒

}

下面是对操作的讲解了:

首先我们要能够给1602写入指令。

写指令之前要知道LCD1602的连接。

如图3所示。

图3LCD1602接线图

/*************************************

给LCD1602写函数

变量:

data1:

0为指令1为数据

data2是要写入的数据。

*************************************/

voidLCD_WByte(unsignedchardata1,unsignedchardata2)

{

P0=data2;

RS=data1;

RW=0;

E=1;

E=0;//下降沿有效

delayus(20);//延时40us

}

有了这个函数我们就可以对LCD进行初始化了。

下面是她的初始化函数。

里面用到的一些数据,我们上面都提到了。

初始化使用的都是指令,所以写函数的第一变量都是‘0’!

/***************************************

LCD初始化函数

无变量

***************************************/

voidLCD_chushihua()

{

LCD_WByte(0,0x38);

LCD_WByte(0,0x0c);

LCD_WByte(0,0x06);

LCD_WByte(0,0x01);//清屏

delayms

(2);//等待2毫秒到清屏结束

}

LCD初始化完毕之后我们就可以让她显示我们要显示的数据了。

但是,我的LCD还是有一个大家需要注意的地方。

我的LCD后面的型号是HS1602AV1.0,她有个小问题,就是写函数的时候必须是RS在RW的前面,否则就不能工作了。

我反过来后添加延时也不行。

网上的资料也没有提到这个问题,希望大家注意这个地方!

下面我们就要让她显示字符了,显示一个字符是最简单的了。

我们可以给她ASCII码,也可以直接写字符。

我个人比较喜欢直接写字符,多方便啊……

网上有一个比较不错的在LCD任意位置写一个字符A的函数,抄下来分享一下了。

/***************************************

在任意位置显示字符的函数

变量:

X横坐标(在0和15直间的数据)

Y竖坐标(1或2,表示行号)

data3为要显示的数据

***************************************/

voidLCD_disp(unsignedcharx,unsignedintdata2,unsigneddata3)

{

unsignedcharadd;

if(y==1)add=0x80+x;

elseadd=0xc0+x;

LCD_WByte(0,add);//先写地址

LCD_WByte(1,data3);//在写要显示的数据

}

我们随便写一个主函数就完成了对LCD的基本显示操作了。

顺便把主函数也写出来吧。

voidmain()

{

LCD_chushihua();

LCD_disp(2,1,'A');//2说明是第三个位置哦

while

(1);

}

 

4、LCD大提速

只显示一个字符时不可取的,那不能从根本上解决LCD的应用问题,我们主要是显示字符串,可是一个一个的显示显然不可取啊。

我们就需要直接让她显示一个字符串。

显示字符串需要到指针,指针我认为方便啊。

我们需要回过头去复习一下了,LCD初始化后,使用了清屏指令0x01,清屏之后,光标归位,地址计数器AC为零。

此时光标的位置也就是第一行第0个位置了。

在LCD初始化之后,我们可以直接使用下面的函数显示字符串,但是显示的位置是第一行第0个位置开始的。

voidLCD_disps(unsignedchar*dat4)

{

unsignedchar*p;

p=dat4;

//LCD_WByte(0,0X86);

while(*p!

='\0')

{

LCD_WByte(1,*p++);

}

}

使用的方法就是LCD_disps("LCD1602");这句添加到主函数里面。

这个的显示起点是固定的,我们可以考虑怎样让它可以在任意的位置上显示。

指定位置的办法就是先写入需要显示的首地址。

第一行的首地址是0x80,第二行的首地址是0xc0。

在这里,这个同单个字符显示的地址。

将上面函数中注释掉的那句话恢复就可以了。

字符型LCD的优点还有一个就是给我们留下了8个自己设置字符的空间。

这使得我们可以在LCD上显示出我们自己想要的字符。

与这个相关的指令就是CGRAM指令。

功能:

设定下一个要存入数据的CGRAM的地址。

DB5DB4DB3为字符号,也就是你将来要显示该字符时要用到的字符地址。

(000~111)(能定义八个字符)

DB2DB1DB0为行号。

(000~111)(八行)

我们可以看出DB5~DB3是我们要自定义的字符的地址。

若是设我们的地址是unsignedcharadd,那么我需要做的是:

add=add<<3;(在C中移位就补零)

最后的三位就是我们每一个自定义字符的8位码。

一行是一个,是一个8×5的字符。

字符的定义方法如下:

一一

0x04

一一

一一

一一

0x0e

、、

、、

、、

、、

、、

0x1f

0x00

、、

、、

、、

、、

、、

0x1f

、、

、、

、、

0x0e

、、

0x04

0x00

(最后一行我们选择留空,你也可以加上的)

最后我们得到的表格如下:

unsignedchartable[]={

0x04,0x0e,0x1f,0x00,0x1f,0x0e,0x04,0x00

};

我们就通过下面这个函数实现存储自定义的字符:

/*****************************************

实现存储及显示自定义字符

变量:

add自定义字符地址(0~7之间)

*p是我们上面定义好的表格的首地址

*****************************************/

voidLCD_zidingyi(unsignedcharadd,unsignedchar*p)

{

unsignedinti;

add=add<<3;

for(i=0;i<8;i++)

{

LCD_WByte(0,0x40|add+i);

LCD_WByte(1,*p++);

}

}

在主函数中使用的方法如下:

LCD_zidingyi(7,table);//7是自定义字符的地址

LCD_disp(14,1,7);//7是上面我们自定义的字符的地址

下面是显示的效果:

最后是我们还一直没有提到的一个LCD的指令——设定显示屏或光标移动方向指令

功能:

使光标移位或使整个显示屏幕移位。

参数设定的情况如下:

S/CR/L设定情况

00光标左移1格,且AC值减1

01光标右移1格,且AC值加1

10显示器上字符全部左移一格,但光标不动

11显示器上字符全部右移一格,但光标不动

对于这个指令的用法,当然是用在主函数里了。

假如是右移的话,那么指令为:

LCD_WByte(0,0X1F);最后两位是×,这个可以不用考虑。

每调用一次这个指令,LCD显示屏的所有显示都会右移一位。

我只是做了一下测试,感觉这个占用了太多的CPU,实用性不是很强。

如果能够把等待的时间用于处理别的函数上,这样就解放CPU,这样的话还是比较可取的。

 

#include

#defineuintunsignedint

#defineucharunsignedchar

//uchartable[]={

//"0123456789"

//};

unsignedchartable[]={

0x04,0x0e,0x1f,0x00,0x1f,0x0e,0x04,0x00

};

sbitRS=P2^7;

sbitRW=P2^6;

sbitEN=P2^5;

voiddelayms(ucharms)

{

uinti;

while(ms--)

{

for(i=0;i<125;i++)

;

}

}

voiddelayus(uintus)

{

while(us--)

;

}

/****************

lcd写字节子函数

data0=0写指令data=1写数据

不读取数据

**************/

voidLCD_wirtebyte(uchardata0,uchardata1)

{

RS=data0;

RW=0;

P0=data1;

EN=1;

delayus

(2);

EN=0;

}

voidLCD_chushihua()

{

LCD_wirtebyte(0,0x38);//5×7字符两行

LCD_wirtebyte(0,0x0c);//显示数据无光标不闪烁

LCD_wirtebyte(0,0x06);//光标右移

LCD_wirtebyte(0,0x01);//清屏指令

delayms

(2);//延时两毫秒,等待清屏结束。

}

/**********************************

lcd写数据子函数

data2行号(必须为1或者2!

data3位置

data4是数据

*************************************/

voidLCD_write(uchardata2,uchardata3,uchardata4)

{

ucharadd;

if(data2==1)

add=0x80+data3;

elseif(data2==2)

add=0xc0+data3;

LCD_wirtebyte(0,add);

LCD_wirtebyte(1,data4);

}

voidLCD_wstr(uchardata5,uchardata6,uchar*data7)

{

ucharadd;

if(data5==1)

add=0x80+data6;

elseif(data5==2)

add=0xc0+data6;

LCD_wirtebyte(0,add);

while(*data7!

='\0')

LCD_wirtebyte(1,*data7++);

}

/*****************************************

实现存储及显示自定义字符

变量:

add自定义字符地址(0~7之间)

*p是我们上面定义好的表格的首地址

*****************************************/

voidLCD_zidingyi(unsignedcharadd,unsignedchar*p)

{

unsignedinti;

add=add<<3;

for(i=0;i<8;i++)

{

LCD_wirtebyte(0,0x40|add+i);

LCD_wirtebyte(1,*p++);

}

}

voidmain()

{

LCD_chushihua();

LCD_zidingyi(0,table);

while

(1)

{

LCD_wstr(1,1,"ilovesijinli!

");

LCD_write(1,0,0);

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 视频讲堂

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1