1602总结.docx
- 文档编号:3720563
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:14
- 大小:250.09KB
1602总结.docx
《1602总结.docx》由会员分享,可在线阅读,更多相关《1602总结.docx(14页珍藏版)》请在冰豆网上搜索。
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);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 1602 总结