ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:487.93KB ,
资源ID:7604618      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7604618.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(1602显示.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

1602显示.docx

1、1602 显示显示 1602字符液晶详细资料和实例 时间:2010-10-11 来源:作者:点击:6134 字体大小:【大 中 小】1602字符液晶在实际的产品中运用的也比较多了,前几天留意了一下,发现宿舍门前的自动售水机就是采用的 1602 液晶进行显示的。而且对于单片机的学习而言,掌握 1602的用法是每一个学习者必然要经历的过程。在此,我将使用 1602过程中遇到的问题以及感受记录下来,希望能够给初学者带来一点指导,少走一点弯路。所谓 1602是指显示的内容为 16*2,即可以显示两行,每行 16 个字符。目前市面上字符液晶绝大多数是基于 HD44780 液晶芯片的,控制原理是完全相同的

2、,因此基于HD44780 写的控制程序可以很方便地应用于市面上大部分的字符型液晶。1602 液晶的正面(绿色背光,黑色字体)1602 液晶背面(绿色背光,黑色字体)另一种 1602液晶模块,显示屏是蓝色背光白色字体 字符型 LCD1602 通常有 14 条引脚线或 16条引脚线的 LCD,多出来的 2条线是背光电源线 VCC(15 脚)和地线 GND(16脚),其控制原理与 14 脚的 LCD完全一样,引脚定义如下表所示:HD44780 内置了 DDRAM、CGROM 和 CGRAM。DDRAM 就是显示数据 RAM,用来寄存待显示的字符代码。共 80个字节,其地址和屏幕的对应关系如下表:也就

3、是说想要在 LCD1602 屏幕的第一行第一列显示一个A字,就要向 DDRAM 的 00H地址写入“A”字的代码(指 A的字模代码,0 x200 x7F为标准的 ASCII 码,通过这个代码,在 CGROM 中查找到相应的字符显示)就行了。但具体的写入是要按 LCD模块的指令格式来进行的,后面我会说到的。那么一行可有 40个地址呀?是的,在 1602中我们就用前 16个就行了。第二行也一样用前 16 个地址。对应如下:DDRAM 地址与显示位置的对应关系 (事实上我们往 DDRAM 里的 00H地址处送一个数据,譬如 0 x31(数字 1的代码,见字模关系对照表)并不能显示 1出来。这是一个令

4、初学者很容易出错的地方,原因就是如果你要想在 DDRAM 的 00H地址处显示数据,则必须将 00H加上 80H,即 80H,若要在 DDRAM 的 01H处显示数据,则必须将 01H加上 80H即 81H。依次类推。大家看一下控制指令的的 8条:DDRAM 地址的设定,即可以明白是怎么样的一回事了),1602液晶模块内部的字符发生存储器(CGROM)已经存储了 160个不同的点阵字符图形(无汉字),如下表所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是 01000001B(41H),显示时模块把地址 41

5、H中的点阵字符图形显示出来,我们就能看到字母“A”上表中的字符代码与我们 PC 中的字符代码是基本一致的。因此我们在向 DDRAM写 C51字符代码程序时甚至可以直接用 P1A这样的方法。PC在编译时就把“A”先转为 41H代码了。字符代码 0 x000 x0F为用户自定义的字符图形 RAM(对于 5X8点阵的字符,可以存放 8组,5X10点阵的字符,存放 4组),就是 CGRAM 了。后面我会详细说的。0 x200 x7F为标准的 ASCII 码,0 xA00 xFF为日文字符和希腊文字符,其余字符码(0 x100 x1F及 0 x800 x9F)没有定义。那么如何对 DDRAM 的内容和地

6、址进行具体操作呢,下面先说说 HD44780 的指令集及其设置说明,请浏览该指令集,并找出对 DDRAM 的内容和地址进行操作的指令。共 11条指令:HD44780 的指令集 1.清屏指令 功能:清除液晶显示器,即将 DDRAM 的内容全部填入空白的 ASCII 码 20H;光标归位,即将光标撤回液晶显示屏的左上方;将地址计数器(AC)的值设为 0。2.光标归位指令 功能:把光标撤回到显示器的左上方;把地址计数器(AC)的值设置为 0;保持 DDRAM 的内容不变 3.进入模式设置指令 功能:设定每次定入 1位数据后光标的移位方向,并且设定每次写入的一个字符是否移动。参数设定的情况如下所示:位

7、名 设置 I/D 0=写入新数据后光标左移 1=写入新数据后光标右移 S 0=写入新数据后显示屏不移动 1=写入新数据后显示屏整体右移 1 个字 4.显示开关控制指令 功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。参数设定的情况如下:位名 设置 D 0=显示功能关 1=显示功能开 C 0=无光标 1=有光标 B 0=光标闪烁 1=光标不闪烁 5.设定显示屏或光标移动方向指令 功能:使光标移位或使整个显示屏幕移位。参数设定的情况如下:S/C R/L 设定情况 0 0 光标左移 1格,且 AC值减 1 0 1 光标右移 1格,且 AC值加 1 1 0 显示器上字符全部左移一格,但光标不动

8、 1 1 显示器上字符全部右移一格,但光标不动 6.功能设定指令 功能:设定数据总线位数、显示的行数及字型。参数设定的情况如下:位名 设置 DL 0=数据总线为 4位 1=数据总线为 8位 N 0=显示 1行 1=显示 2行 F 0=5 7点阵/每字符 1=5 10点阵/每字符 7.设定 CGRAM 地址指令 功能:设定下一个要存入数据的 CGRAM 的地址。8.设定 DDRAM地址指令 功能:设定下一个要存入数据的 CGRAM 的地址。(注意这里我们送地址的时候应该是 0 x80+Address,这也是前面说到写地址命令的时候要加上 0 x80的原因)9.读取忙信号或 AC地址指令 功能:读

9、取忙碌信号 BF的内容,BF=1 表示液晶显示器忙,暂时无法接收单片机送来的数据或指令;当 BF=0 时,液晶显示器可以接收单片机送来的数据或指令;读取地址计数器(AC)的内容。10.数据写入 DDRAM 或 CGRAM 指令一览 功能:将字符码写入 DDRAM,以使液晶显示屏显示出相对应的字符;将使用者自己设计的图形存入 CGRAM。11.从 CGRAM 或 DDRAM 读出数据的指令一览 功能:读取 DDRAM 或 CGRAM 中的内容。基本操作时序:读状态 输入:RS=L,RW=H,E=H 输出:DB0DB7=状态字 写指令 输入:RS=L,RW=L,E=下降沿脉冲,DB0DB7=指令码

10、 输出:无 读数据 输入:RS=H,RW=H,E=H 输出:DB0DB7=数据 写数据 输入:RS=H,RW=L,E=下降沿脉冲,DB0DB7=数据 输出:无 呵呵,看到这么多的控制指令希望你没有头晕。其实这么多的指令刚开始的时候没有必要全部掌握,随着学习的深入可以再尝试去用更复杂的控制指令。下面让我们一起驱动 1602的液晶吧。下面是我的液晶的连接图,用的是那种蓝底白字的液晶,其实蓝底白字和那种绿底黑字的液晶唯一的区别就是颜色的问题,至于用哪种液晶,就看各位自己的喜好咯。这就是我做测试用的最小系统,单片机是 STC89C516,晶振为 12M。液晶为蓝底白字的那种 1602。当我们硬件连接错

11、误,或者程序错误时就会出现下图这种情况,就是上排显示 16的白色的块(蓝底黑字的液晶则显示的是 16个黑块)。下面我们来驱动 1602吧在 1602 的上排显示“LCD1602 check ok”下排显示“study up”程序中没有用到忙检测,而是用的是延时函数来替代忙检测#include /包含头文件,这个嘛,就不用多说了#define uint unsigned int /预定义一下#define uchar unsigned char sbit rs=P35;/1602的数据/指令选择控制线 sbit rw=P36;/1602 的读写控制线 sbit en=P37;/1602 的使能控

12、制线 /*P2 口接 1602的 D0D7,注意不要接错了顺序,我以前可在这上面吃过亏*/uchar code table=LCD1602 check ok;/要显示的内容 1 放入数组 table uchar code table1=study up;/要显示的内容 2放入数组 table1 void delay(uint n)/延时函数 uint x,y;for(x=n;x0;x-)for(y=110;y0;y-);/*/void lcd_wcom(uchar com)/1602写命令函数(单片机给 1602写命令)/1602接收到命令后,不用存储,直接由 HD44780 执行并产生相应动

13、作 rs=0;/选择指令寄存器 rw=0;/选择写 P2=com;/把命令字送入 P2 delay(5);/延时一小会儿,让 1602准备接收数据 en=1;/使能线电平变化,命令送入 1602的 8位数据口 en=0;void lcd_wdat(uchar dat)/1602写数据函数 rs=1;/选择数据寄存器 rw=0;/选择写 P2=dat;/把要显示的数据送入 P2 delay(5);/延时一小会儿,让 1602准备接收数据 en=1;/使能线电平变化,数据送入 1602的 8位数据口 en=0;void lcd_init()/1602 初始化函数 lcd_wcom(0 x38);/

14、8 位数据,双列,5*7字形 lcd_wcom(0 x0c);/开启显示屏,关光标,光标不闪烁 lcd_wcom(0 x06);/显示地址递增,即写一个数据后,显示位置右移一位 lcd_wcom(0 x01);/清屏 void main()/主函数 uchar n,m=0;lcd_init();/液晶初始化 lcd_wcom(0 x80);/显示地址设为 80H(即 00H,)上排第一位(也是执行一条命令)for(m=0;m16;m+)/将 table中的数据依次写入 1602显示 lcd_wdat(tablem);delay(200);lcd_wcom(0 x80+0 x44);/重新设定显

15、示地址为 0 xc4,即下排第 5位 for(n=0;n8;n+)/将 table1中的数据依次写入 1602显示 lcd_wdat(table1n);delay(200);while(1);/动态停机 程序写好后烧写进单片机,现在让我们看看效果吧 这就是显示的效果。下面让我们来看看如何显示一个自定义的字符吧 我们从 CGROM 表上可以看到,在表的最左边是一列可以允许用户自定义的CGRAM,从上往下看着是 16 个,实际只有 8个字节可用。它的字符码是 0000000000000111 这 8 个地址,表的下面还有 8个字节,但因为这个 CGRAM 的字符码规定 02位为地址,3 位无效,4

16、7全为零。因此 CGRAM 的字符码只有最后三位能用也就是 8个字节了。等效为 0000X111,X为无效位,最后三位为 000111共 8个。如果我们要想显示这 8个用户自定义的字符,操作方法和显示 CGROM 的一样,先设置 DDRAM 位置,再向 DDRAM 写入字符码,例如“A”就是 41H。现在我们要显示 CGRAM 的第一个自定义字符,就向 DDRAM 写入 00000000B(00H),如果要显示第 8个就写入 00000111(08H),简单吧!好!现在我们来看怎么向这八个自定义字符写入字模。有个设置 CGRAM 地址的指令大家还记得吗?赶快再找出来看看。从这个指令可以看出指令

17、数据的高 2位已固定是 01,只有后面的 6位是地址数据,而这 6位中的高 3 位就表示这八个自定义字符,最后的 3位就是字模数据的八个地址了。例如第一个自定义字符的字模地址为 0100000001000111 八个地址。我们向这 8个字节写入字模数据,让它能显示出“”地址:01000000 数据:00010000 图示:01000001 00000110 01000010 00001001 01000011 00001000 01000100 00001000 01000101 00001001 01000110 00000110 01000111 00000000 下面我们写一段程序让这

18、8个自定义字符显示出一个心的图案:(由于上面那个显示程序已经有很详细的注释了,因此这个程序只对与上个程序不同的地方写注释)#include#define uint unsigned int#define uchar unsigned char sbit rs=P35;sbit rw=P36;sbit en=P37;uchar code table=0 x03,0 x07,0 x0f,0 x1f,0 x1f,0 x1f,0 x1f,0 x1f,0 x18,0 x1E,0 x1f,0 x1f,0 x1f,0 x1f,0 x1f,0 x1f,0 x07,0 x1f,0 x1f,0 x1f,0 x1f

19、,0 x1f,0 x1f,0 x1f,0 x10,0 x18,0 x1c,0 x1E,0 x1E,0 x1E,0 x1E,0 x1E,0 x0f,0 x07,0 x03,0 x01,0 x00,0 x00,0 x00,0 x00,0 x1f,0 x1f,0 x1f,0 x1f,0 x1f,0 x0f,0 x07,0 x01,0 x1f,0 x1f,0 x1f,0 x1f,0 x1f,0 x1c,0 x18,0 x00,0 x1c,0 x18,0 x10,0 x00,0 x00,0 x00,0 x00,0 x00;/心图案 /*uchar code table1=0 x10,0 x06,0 x0

20、9,0 x08,0 x08,0 x09,0 x06,0 x00;/字符*/void delay(uint n)uint x,y;for(x=n;x0;x-)for(y=110;y0;y-);void lcd_wcom(uchar com)rs=0;rw=0;P2=com;delay(5);en=1;en=0;void lcd_wdat(uchar dat)rs=1;rw=0;P2=dat;delay(5);en=1;en=0;void lcd_init()lcd_wcom(0 x38);lcd_wcom(0 x0c);lcd_wcom(0 x06);lcd_wcom(0 x01);void m

21、ain()char m=0;lcd_init();lcd_wcom(0 x40);/设定 CGRAM 地址 for(m=0;m64;m+)/将心型代码写入 CGRAM 中 lcd_wdat(tablem);lcd_wcom(0 x85);/设定上排的显示位置 for(m=0;m4;m+)/显示心型图案的上半部分 lcd_wdat(m);lcd_wcom(0 xc5);/将显示坐标转移到下排和上排相对应的地方 for(m=4;m8;m+)/显示心型图案的下半部分 lcd_wdat(m);while(1);让我们一起来看看显示的效果吧 在绿底黑字液晶模块和蓝底白字液晶模块上分别显示的效果。下面再为

22、大家展示几种可能出现的问题 1:通电之后,程序也烧写进去了,但是 1602就是不显示,只显示一排黑块(一般都是在上排 8个小黑块,记得刚开始用 1602 液晶的时候,被这个整怕了),怎么样,你郁闷了吧,其实出现这种问题的原因无非以下几种:硬件连线上的错误,这种错误一般用万用表仔细检查后很容易找出来。第二种情况就是硬件连接上是正确的,那么此时出问题最大的就是程序上了,如果你用的是忙检测,看一下忙检测函数写对了没,如果用的是延时函数,那么看看延时的时间是否够长。再就是看看时序图,这点很重要的哦。如果硬件和软件都没有错,那么就要考虑 1602是否坏了,但是出现这种情况的几率很小,如果遇到这种情况,你

23、可以考虑去买彩票了 下面这种情况你遇到过吗?我遇到过了的,搞得我很是郁闷 我做的实验是要液晶显示 ABC 这三个字母,并且开光标,光标闪烁。大家可以在第一排的最后几位看到 ABC和光标都已经显示出来了。但是为什么其它位会显示这么多 8呢?嘿嘿郁闷吧。出现这种情况的原因就是在初始化液晶的时候,要把清屏指令放在最后面,否则就会出现上图这种情况。怎么样,第一次听说吧不过,我不知道其它的液晶是否也有这个问题出现,至少我用的这块就有这种情况,但是我的另一个液晶则没有这种情况出现,不管是在一开始就清屏还是最后清屏。大家注意下就可以了,万一出现了这种情况,就会处理了 上面这张图是用 1602作为显示的温度电子钟上面的年月日三个字就是用自定义字符的方法显示的。呵呵,怎么样到此 1602的驱动基本上结束了,剩下的就靠大家自己去发挥了

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

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