lcd0602使用说明_第1页
lcd0602使用说明_第2页
lcd0602使用说明_第3页
lcd0602使用说明_第4页
lcd0602使用说明_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、5.自制单片机之五LCD1602的驱动LCD1602已很普遍了,具体介绍我就不多说了,市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的, 因此HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。字符型 LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC (15脚)和地线GND (16脚),其控制原理与14脚的LCD完全一样,定义如下表 所示:字符型LCD的引脚定义引脚号引脚名电平输入#输出作用1Uss电源地2Ucc电源C+5U)3Uee对比调整电压4RS8/1输入图入数据5R/w0/1输入”向LCD写入指今或数据“从 L

2、CD谏取信息6E1输入使能信号,寸谖取信息.一毗 下降沿)龄指令1Dsa0/1输入#输出数据总线lirw肌最低位)8DB10/1输入禽出数据总线9DB20/1输入#输出数据总线HneZ1Q0/1输入#输出数据总线lines11DE即0/1输入#输出数据总线lineH120/1输入#输出数据总线lines13DBG0/1输入#输出数据总线140/1输入#输出数据总线Iine7 (最高位)15(I+UccLCD背光电源正极16K接地LCD背光电源员极HD44780 内置了 DDRAMCGRO 和 CGRAMDDRA就是显示数据RAM用来寄存待显示的字符代码。共80个字节,其地址和屏幕的对应关系如下

3、表:显示位置1234567DDRAM地址第一行D1H03H0UH05H06 H27H第二行40HMH42HH3H44H屿H昨H67H也就是说想要在LCD1602屏幕的第一行第一列显示一个“A”字,就要向DDRA的00H地址写入“ A”字的代码就行了。但具体的写入是要按LCD模块的指令格式来进行的,后面我会说到的。那么一行可有40个地址呀?是的,在1602中我们就用前16个就行了。第二行也一样用前16个地 址。对应如下:DDRAM地址与显示位置的对应关系OOH05H 06H Q7H 08H 09H 0 仙 OBH OCH ODH OEH 6FH40H 41H >I2H 43H ”耳 H 4

4、5H 46H 47H49H 4AH 4BH UCH 4DH 4EH 4FH我们知道文本文件中每一个字符都是用一个字节的代码记录的。一个汉字是用两个字节的代码记录。在PC上我们只要打开文本文件就能在屏幕上看到对应的字符是因为在操作系统里和BIOS里都固 化有字符字模。什么是字模?就代表了是在点阵屏幕上点亮和熄灭的信息数据。例如“ A”字的字模:0111010001100011000111111 10001 10001上图左边的数据就是字模数据,右边就是将左边数据用代表°,用代表1。看出是个“A”字了吗?在文本文件中“ A”字的代码是41H,PC收到41H的代码后就去字模文件中将代表A字

5、的这一组数据送到显卡去点亮屏幕上相应的点,你就看到“A”这个字了。刚才我说了想要在LCD1602屏幕的第一行第一列显示一个”A“字,就要向DDRAii的00H地址写 入“A”字的代码41H就行了,可41H这一个字节的代码如何才能让LCD模块在屏幕的阵点上显示“A”字呢?同样,在LCD模块上也固化了字模存储器,这就是 CGRO和CGRAM HD44780内置了 192个常用字符的字模,存于字符产生器CGROM(Character Generator ROM)中,另外还 有8个允许用户自定义的字符产生RAM称为CGRAM(Character Generator RAM。卜图说明了 CGROM和CG

6、RA与字符的对应关系。CGMM中字符诃与字字符字关系对胆表0000 0001 001Q 00110101 0110 0111 1000 load1010 1011 1100 vi ui me 11111xx txaooi (JixjtxxODIO :.t.x.i.ODJ1cxoO'DC:<?ooc0l 10XJCXXWOC -1'xxxxWOI<xxxl01C (3)X30CX1D11 (4)ooocHOOXXXX1101(7)(S1! IIIRIQIal-Bi#|3|C|S|c|s| $l4|D|T|d|t| K|5|E|U|e|u| &|6|F|U|fM

7、 tu?ie) ww <|8|H|X|h|A >l9|l|V|i|y|1 : |J|Z|j|z| FTKICTO AKIL|¥|IIO 至 MIIH 习 n?INnn|->| Al?|0|_|oWwras中j C厅磺an iziaAr 7厅BTTAmukx工 hWCT*才如日口声wentao rogramfBii con呵叨副“叵匾bio?从上图可以看出,“A”字的对应上面高位代码为0100,对应左边低位代码为0001,合起来就是01000001,也就是41 H。可见它的代码与我们PC中的字符代码是基本一致的。因此我们在向DDRAM写C51字符代码程序时甚至可以直接

8、用 P1二A这样的方法。PC在编译时就把 “A”先转为41H代码了。字符代码0x000x0F为用户自定义的字符图形RAM对于5X8点阵的字符,可以存放8组,5X10点阵的字符,存放4组),就是CGRAMT。后面我会详细说的。0x200x7F为标准的ASCII码, 0xA0OxFF为日文字符和希腊文字符, 其余字符码(0x10Ox仆及0x800x9F)没有定义。那么如何对DDRAM勺内容和地址进行具体操作呢,下面先说说HD44780的指令集及其设置说明,请浏览该指令集, 并找出对DDRA 口的内容和地址进行操作的指令。共11条指令:1 .清屏指令指q功月匕指令编码时IW /nsRSDB7DB6D

9、BSDBU063DB2DD1DBS清屏0000000011.64功能:1清除液晶显示器,即将DDRA的内容全部填入“空白”的ASCII码20H; V2光标归位,即将光标撤回液晶显示屏的左上方3将地址计数器(AC)的值设为0。2.光标归位指令指令功能指令编码理%0寸I /msRSR/UDB7DB6DBSDBMDB3DB2DB1DBO光标归位000000001器1A04功能:1 把光标撤回到显示器的左上方 ;2把地址计数器(AC)的值设置为0;3保持DDRA的内容不变。3.进入模式设置指令才旨令功能指令编码时向 /USRSR/WD87DB6DB4DB3DB20B1进入模式设置000E)00*41I

10、/DS功能:设定每次定入1位数据后光标的移位方向,并且设定每次写入的一个字符是否移动。参数设定的情况如下所示:位名设置1/D0=写入新数据后光标左移1 =写入新数据后光标右移s0=写入新数据后显示屏不移动1 =写入新数据后显示屏整体右移1个字符4 .显示开关控制指令指令功能指令编码牖 /USRSR/WDB7DB6DBS jDBUDB3DB2DB1DBO显示开关控制00Q091D:cB40功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。参数设定的情况如卜': 位名设置D。=显不功能关1=显示功能开C0=无光标仁有光标B0=光标闪烁1=光标不闪烁5 .设定显示屏或光标移动方向指令指

11、令功能指令编码/usRSR/WDB7DB6DBSDB4DB3DB2DB1DBO00g00|1S/CR/LXX功能:使光标移位或使整个显示屏幕移位。参数设定的情况如下:S/CR/L设定情况00光标左移1格,且AC值减101光标右移1格,且AC值加110显示器上字符全部左移一格,但光标不动11显示器上字符全部右移一格,但光标不动6 .功能设定指令指令功能指令编码牖 /USRSR/WDB7DB6DB5DBU |DB3DB2DB1DB0功能设定00091 |DLNF f XX40功能:设定数据总线位数、显示的行数及字型。参数设定的情况如下:位名设置DL0=数据总线为4位N行F字符1 =数据总线为8位0

12、=显示1显示2行0=5X7点阵/每1=5X10点阵/每字符7.设定CGRABf业址指令指令功能指令编码/SRSR/WDB7DB6DBSDB4DB3DB2DB1DBO设定CGRAI4地址0g1地址位)40功能:设定下一个要存入数据的CGRAI的地址。8.设定DDRA地址指令指7功月匕拒令编码/usRSR/UDB7DB6DBIi DB3 082 DB1 DB0设定DDRAM地址001CGRAM的地址“位)3功能:设定下一个要存入数据的CGRAI的地址。9.读取忙信号或AC地址指令当BF=O时,液晶显示器可以接收单片机送来的数据或指令;V2读取地址计数器(AC)的内容。I 。.数据写入DDRA或CG

13、RAI指令一览2将使用者自己设计的图形存入 CGRAMII .从CGRAM或DDRA读出数据的指令一览指令功能?自令编码/usKSR/UDB7 DB6 DBS DB4 DB3 DB2 DB1 DBO从仙RAH或DDRAMi咚出数一11要读出的数据,DO功能:读取DDRAM或CGRAI中的内容。基本操作时序:读状态输入:RS=L RW=HE=H输出:DBA DB7=犬态字写指令码读数据E=H输出:DBA DB7=八据写数据据输入:RS=L RW=L E=下降沿脉冲,DBO- DB7=旨令输出:无输入:RS=H RW=,H输入:RS=H RW=L E=下降沿脉冲,DBZ DB7=A输出:无看了那么

14、多是不是有些晕?我也是啊,不过慢慢理解还是没问题的。实际 上面说了那么多具体怎么操作我还是没会啊?好!咱就简单点。举个实例,就在LCD1602屏幕上第一行第一列显示个“ A”字。1 .先初始化。(老大!好像上面没初始化这条指令啊!)先定义接口# include <AT89x51 .h>先别拿东西扔我,说明书上是这么说的。也就先写入些指 令。* t人P1DB0 DB7P2.0 - RSP2.1- RWP2.2-E*/# define LCD_DBsbitsbitsbitLCD_RS=P2A0;LCD_RW=P2A1;LCD_E=P2A2;定义函数# define uchar unsi

15、gned char# define uint unsigned intvoid LCD_init(void);初始化函数void LCD_write_command(uchar command);/ 写指令函数void LCD_write_data(uchar dat);/写数据函数void LCD_disp_char(uchar x,uchar y,uchar dat);/ (0-16),y(1-2)在某个屏幕位置上显示一个字符,X/void LCD_check_busy(void);/检查忙函数。我没用到此函数,因为通过率极低。void delay_n40us(uint n);/ 延时函数

16、 *初始化函数*void LCDJnit(void)LCD_write_command(0x38);/LCD_write_command(0x0c);/LCD_write_command(0x06);/LCD_write_command(0x01);/设置8位格式,2行,5x7 整体显示,关光标,不闪烁 设定输入方式.,增量不移位 清除屏幕显示delay_n40us(100); / 令。实践证明,我的LCD1602上,用for循环200次就能可靠完成清屏指*人山l */与指令函数void LCD_write_command(uchar dat) (LCD_DB=dat;LCD_RS=0; /

17、指令LCD_RW=0; / 写入LCD_E=1; 允许LCD_E=0;delay_n40us(1); 实践证明,我的LCD1602上,用for循环1次就能完成普通写指令。 * *-z 小入 */与数据函数void LCD_write_data(uchar dat) (LCD_DB=dat;LCD_RS=1;/ 数据LCD_RW=0; / 写入LCD_E=1; 允许LCD_E=0;delay_n40us ; ) */*显示一个字符函数*void LCD_disp_char(uchar x,uchar y,uchar dat) (uchar address;if(y=i)address=0x80+

18、x;elseaddress=0xc0+x;LCD_write_command(address);LCD_write_data(dat);) */*木令杳忙函来攵 *void LCD_check_busy()实践证明,在我的LCD1602上,检查忙指令通过率极低,以至于不能正常使用LCD因此我没有再用检查忙函数。而使do/用了延时的方法,延时还是非常好用的。我试了一下,用 LCD_E=O; 普通指令只要1次循就可完成。清屏指令LCD_RS=O;能完成。LCD_RW=1;LCD_DB=Oxff;LCD_E=1;while(LCD_DBA7=1);/for循环作延时,/要用200次循环便*3*延时函

19、数*void delay_n40us(uint n) uint i;uchar j;for(i=n;i>0;i-)for(j=0;jv2;j+); 在这个延时循环函数中我只做了 2次循环,/实践证明我的LC D 1 602上普通的指令只需1次循环就能可靠完成。*/*P 西来攵 *void main(void)LCDJnit();LCD_disp_char(0,1,"AH);while(1);*具体电路的制作是很简单的,就接了两个电阻,一个是10欧姆的背光限流电阻,另一个是 2K的LCD极板电压调节电阻。这两个电阻的阻值怎么定呢?背光比较简单,它就相当于在 后面接 了几个发光二极

20、管,任何时候你只要在15、16脚串上个1 00欧的电位器接上电源,调节电位器,觉得亮度合适。此时的阻值便可。LCD液晶极板驱动电压调节电阻的确定就稍微麻烦一点。在各数据线,控制线接好关通上电源的前提下在第3脚(VEE)和地之间接一个10K的电位器。调节电位器。当3脚电压高时为全亮,电压为。时为全暗(液晶全显示为黑 块)。 你用电位器把屏幕从全暗刚好调到变亮。这时便可调试程序。待屏幕能正确显示后再细调电位器, 使对比度合适。这时的阻值便可确定,然后换成等值的固定电阻焊上便可。我们接着上次的系统板制做:新买的1602LCD,20元,贵不?反面:组装后:具体电路图:_o自己选择号ATT招51 , 依

21、1 dc_R 口垃.自己迤择与Areaesi的三幄珥0 口接R10K接口说明:R 10DS0 « DBTESe/f LCD t1602UL1UBLA运行:用户自定义字符的应用:我们从CGRO表上可以看到,在表的最左边是一列可以允许用户自定义的CGRAM从上往下看着是16个,实际只有8个字节可用。它的字符码是00000000 00000111这8个地址,表 的下面还有8个字节,但 因为这个CGRA的字符码规定02位为地址,3位无效,4 7全为零。因此CGRA的字符码只有最后三位能用也就 是8个字节了。等效为0000X111, X为无 效位,最后三位为000 111共8个。如果我们要想显

22、示这8个用户自定义的字符,操作方法和显示CGROM的一样,先设置DDRAM位置,再向DDRAMI入字符码,例如“ A”就是41H。现在我们要显示CGRAI的第一个自定义字符、就向DDRA写入OOOOOOOOB(OOH),如果要显示第8个就写入00000111 (08H),简单吧!好!现在我们来看怎么向这八个自定义字符写入字模。有个设置CGRAI地址的指令大家还记得吗?赶快再找出来看看。九设定CGRftlflte址指令指令功能指令编码/<J5RSR/WDB7DB6BB5 DM D83 DB2 DB1设定CGRAM地0001CGRfIM的地址“位)J 10功能:设定下a个要存入数据的WR删的

23、地址。从这个指令可以看出指令数据的高2位已固定是01,只有后面的6位是地址数据,而这6位中的高3位就表示这八个自 定义字符,最后的3位就是字模数据的八个地址了。例如第一个自定义字符的字模地址为 0100000。- 01000111八个地址。我们向这8个字节写入字模数 据让它能图示:OOO八OOOO显示出“C地址:01000000数据:00010000OOOO-OOOOOO.OOO OOOO-OOO OOOO-OO.01000001010000100100001101000100000001100000100100001000000010000100010100001001OOOOOHO ooo

24、ooooo010001100000011001000111而甜们空一的程总计汶000000008个自定义字符显示出一个心的图案:# include <reg51 .h> unsigned chartablel =0x03,0x07,OxOf,0x1 f,0x1 f,0x1 f,0x1 f,0x1f,0x18,0x1 E,0x1f,0x1f,0x1f,0 x1f,0x1f,0x1f,0x07,0x1 f,0x1 f,0x1f,0x1f,0 x1f,0x1f,0x1f,0x10,0x18,0x1 c,0x1 E,0x1 E,0 x1E,0x1E,0x1E,OxOf,0x07,0x03,

25、0x01,0x00,0xOO,0x00,0x00,0x1f,0x1f,0x1f,0x1f,0x1f,0xOf,0x07,0x01,0x1 f,0x1 f,0x1 f,0x1 f,0x1f,0 x1c,0x18,0x00,0x1 c,0x18,0x10,0x00,0x00,0xOO,0x00,0x00; 心图案un sig ned char table=0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00; 字符 C#define/*#defineCLEARSCREEN定义接口LCDIOLCD_write_command(0x01)*P2*/sbit LCD1602_R

26、S=P3P;sbit LCD1602_RW=P3A1;sbit LCD1602_EN=P3A2;*义函"攵 * /void LCD_write_command(unsigned char command);/ 写入指令函数void LCD_write_dat(unsigned char dat);/写入数据函数void LCD_set_xy( unsigned char x, unsigned char y );/设置显示位置函数void LCD_dsp_char( unsigned x,unsigned char y,unsigned char dat);/显示一个字符函数void

27、 LCD_dsp_string(unsigned char X,unsigned char Y,unsigned char *s);/显示字符串函数延时函数void LCDJnit(void);初始化函数 void delay_nms(unsigned int n);/ .* void LCDJnit(void)*初始化函数 * */CLEARSCREEN;/clear screenLCD_write_command(0x38);/set 8 bit data transmission mode LCD_write_command(0x0c);/open display (enable led

28、 display) LCD_write_command(0x80);/set led first display addressCLEARSCREEN;/clear screen/* f人函讣殳 * */void LCD_write_command(unsigned char command)LCDIO=command; LCD1602_RS=0;LCD1602_RW=0;LCD1602_EN=0;LCD1602_EN=1; delay_nms(10);/*/* f人函讣殳 * */void LCD_write_dat(unsigned char dat)LCDIO=dat;LCD1602_RS=1;LCD1602_RW=0;LCD1602_EN=0; delay_nms(1);LCD1602_EN=1;/* t人Fyjf* */void LCD_set_xy( unsigned char x, unsigned char y )unsigned char address; if (y = 1)address = 0x80 + x;elseaddress =0xc0+ x;LCD_write_command(address);/*I八字符:* */void LCD_dsp_c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论