还剩11页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
16x2字符型带背光液晶显示模块 液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在袖珍式仪表和低功耗应用系统中得到越来越广泛的应用 这里介绍的字符型液晶模块是一种用5x7点阵图形来显示字符的液晶显示器,根据显示的容量可以分为1行16个字、2行16个字、2行20个字等等,这里以常用的2行16个字的1602液晶模块来介绍它的编程方法 标准型16X2带背光液晶显示字符模块,邮购__26元一个外形尺寸PCB外形
36.4*80毫米液晶屏金属黑框
34.2*72毫米 1602采用标准的16脚接口,其中:第1脚VSS为地电源第2脚VDD接5V正电源第3脚V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度第4脚RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器第5脚RW为读写__线,高电平时进行读操作,低电平时进行写操作当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙__,当RS为高电平RW为低电平时可以写入数据第6脚E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令第7~14脚D0~D7为8位双向数据线第15~16脚空脚 1602液晶模块内部的字符发生存储器(CGROM已经存储了160个不同的点阵字符图形,如表1所示,这些字符有___数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是0_____01B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A” 1602液晶模块内部的控制器共有11条控制指令,如表2所示, 它的读写操作、屏幕和光标的操作都是通过指令编程来实现的(说明1为高电平、0为低电平)指令1清显示,指令码01H光标复位到地址00H位置指令2光标复位,光标返回到地址00H指令3光标和显示模式设置I/D光标__方向,高电平右移,低电平左移S:屏幕上所有文字是否左移或者右移高电平表示有效,低电平则无效指令4显示开关控制D控制整体显示的开与关,高电平表示开显示,低电平表示关显示C控制光标的开与关,高电平表示有光标,低电平表示无光标B控制光标是否闪烁,高电平闪烁,低电平不闪烁指令5光标或显示移位S/C高电平时__显示的文字,低电平时__光标指令6功能设置命令DL高电平时为4位总线,低电平时为8位总线N低电平时为单行显示,高电平时双行显示F:低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符(有些模块是DL高电平时为8位总线,低电平时为4位总线)指令7字符发生器RAM地址设置指令8DDRAM地址设置指令9读忙__和光标地址BF为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙指令10写数据指令11读数据 DM-162液晶显示模块可以和单片机AT89C51直接接口,电路如图1所示 液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,表3是DM-162的内部显示地址. 比如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是0_____00B(40H+_____000B80H=1_____00BC0H----直接输入80H+**H即可 以下是在液晶模块的第二行第一个字符的位置显示字母“A”的程序ORG0000HRSEQUP
3.7;确定具体硬件的连接方式RWEQUP
3.6;确定具体硬件的连接方式EEQUP
3.5;确定具体硬件的连接方式MOVP1#00000001B;清屏并光标复位ACALLENABLE;调用写入命令子程序MOVP1#00111000B;设置显示模式:8位2行5x7点阵ACALLENABLE;调用写入命令子程序MOVP1#00001111B;显示器开、光标开、光标允许闪烁ACALLENABLE;调用写入命令子程序MOVP1#00000110B;文字不动,光标自动右移ACALLENABLE;调用写入命令子程序MOVP1#0C0H;写入显示起始地址(第二行第一个位置)ACALLENABLE;调用写入命令子程序MOVP1#0_____01B;字母A的代码SETBRS;RS=1CLRRW;RW=0;准备写入数据CLRE;E=0;执行显示命令ACALLDELAY;判断液晶模块是否忙SETBE;E=1;显示完成程序停车AJMP$ENABLE:CLRRS;写入控制命令的子程序CLRRWCLREACALLDELAYSETBERETDELAY:MOVP1#0FFH;判断液晶显示器是否忙的子程序CLRRSSETBRWCLRENOPSETBEJBP
1.7DELAY;如果P
1.7为高电平表示忙就循环等待RETEND 程序在开始时对液晶模块功能进行了初始化设置,约定了显示格式注意显示字符时光标是自动右移的,无需人工干预,每次输入指令都先调用判断液晶模块是否忙的子程序DELAY,然后输入显示位置的地址0C0H,最后输入要显示的字符A的代码41HTO:无聊的键盘,1602LCD的C程序//******************************************************************************// *// FileName :实验板1602lcd.c ICC__RV
6.31A编译 *// Function :1602字符型LCD的显示8位数据方式 *// Date :2006-12-11 *// Version :
1.0 *// *// Author :开关电源 hongtusy@
163.com__ilto:hongtusy@
163.com\t_blank *// Company :电子信息技术__网 http://___.itsn.cnhttp://___.itsn.cn\t_blank *// *//***************************描述与记事*****************************************//实验板的__R程序,驱动1602LCM可显示2行,每行16个字符)模块显示实验练习//说明RS高显示/低指令输入 RW高读/低写 EN高读数据/下降沿写数据//具体电路可参照使用指南里的说明每个字符为5×7或5×8的点阵,共16×2个字符//使用器件ATMEGA8535,可更换 使用默认的片内RC振荡器,1MHz//接线定义PD456为RSR/WEA数据位为PC口//使用的开关SW2-
123.SW1-
12345678.SW2-5为背光开关 SW3-8为系统复位端//记事//******************************************************************************#includeiom8535v.h //头文件,ATmega8535单片机的寄存器定义#include__cros.h //可以使用NOP以及SEI等指令.typedefunsignedchar uchar; //宏typedefunsignedint uint;/************************************************函数名 DelaymS功 能 毫秒级延时函数输入参数: 延迟时间/系统晶体输出参数 做相应的延迟处理描 述 /***********************************************/voidDelaymSuinti //延时函数,参数i为延时时间{ uintjk; //双重延时 forj=0;ji;j++ { fork=0;k=50;k++; }}/************************************************函数名 init_mcu功 能 单片机初始化函数输入参数: /输出参数 /描 述 相关口方向的设置等***********************************************/voidinit_mcuvoid{ DDRC=0xff; //PC口为推挽1输出,数据位 DDRD=0xff; //PD口为推挽1输出,控制__}/******************************************************** 子程序名 write_data 功 能 写入一字节数据 输入参数 / 输出参数 / 描 述 /********************************************************/voidwtite_dataucharh{ PORTC=h; //先将数据送出 PORTD|=1PD4; //RS=1数据 PORTD=~1PD5; //R/W=0写 PORTD=~1PD6; //EN=0使能,产生一个下降沿 DelaymS1; PORTD|=1PD6; //EN=1除能}/******************************************************** 子程序名 write_code 功 能 写入一字节指令/地址 输入参数 / 输出参数 / 描 述 /********************************************************/voidwtite_codeucharh{ PORTC=h; //先将地址送出 PORTD=~1PD4; //RS=0命令或数据 PORTD=~1PD5; //R/W=0写 PORTD=~1PD6; //EN=0使能,产生一个下降沿 DelaymS1; PORTD|=1PD6; //EN=1除能}/******************************************************** 子程序名 init_lcd 功 能 初始化LCD 输入参数 / 输出参数 / 描 述 /********************************************************/voidinit_lcdvoid{ wtite_code0x01; //清除屏幕 wtite_code0x38; //功能设定,8位数据口/2行/5*7的点阵 wtite_code0b00001111; //显示幕ON,光标ON,闪烁ON wtite_code0x06; //模式,加1,显示幕ON wtite_code0b00000011; //光标回到原点}/******************************************************** 子程序名 display_lcd 功 能 刷新显示一屏数据,__的LCD显示程序用户将显存内容更新后,只要调用此程序即可更新显示 输入参数 / 输出参数 / 描 述 在写一个字符前,先设定显示的位置地址,然后再写数据系统可以自动地址加一********************************************************/voiddisplay_lcduchar*p{ uchari; wtite_code0x80; //第一行起始地址,0b_____000B=0x
80. fori=0;i16;i++ { wtite_datap[i]; } wtite_code0xc0; //第二行起始地址,0b1_____00B=0xc
0. fori=16;i32;i++ { wtite_datap[i]; }}//*****************主程序**********************************void__invoid{ uchari; ucharbuf[]= welcome! ___.itsn.cnhttp://___.itsn.cn\t_blank! ; DelaymS100; init_mcu; //单片机初始化 init_lcd; //lcd初始化 display_lcdbuf; //刷新显示一屏 buf
[0]=i; //可以任意修改显示的内容 display_lcdbuf; //刷新显示 wtite_code0xC0; //光标停留在0C2H位置第1行光标位置有0x800x
81...0x8f第2行光标位置有0xc00xc
1...0xcf. while1;}1602液晶显示模块C语言程序(8位)[2006-11-2514:16:00|By:frankle] __C1602A16*2模拟口线接线方式连接线图: --------------------------------------------------- |LCM-----51 |LCM-----51 |LCM------51 | --------------------------------------------------| |DB0-----P
1.0|DB4-----P
1.4|RW-------P
2.0 | |DB1-----P
1.1|DB5-----P
1.5|RS-------P
2.1 | |DB2-----P
1.2|DB6-----P
1.6|E--------P
2.2 | |DB3-----P
1.3|DB7-----P
1.7|VLCD接1K电阻到GND| --------------------------------------------------- [注:AT__S51使用12M晶振]=============================================================*/#defineLCM_RW P2_0//定义引脚#defineLCM_RS P2_1#defineLCM_E P2_2#defineLCM_Data P1#defineBusy 0x80//用于检测LCM状态字中的Busy标识#includeat__x
51.hvoidWriteDataLCMunsignedcharWDLCM;voidWriteCom__ndLCMunsignedcharWCLCMBuysC;unsignedcharReadDataLCMvoid;unsignedcharReadStatusLCMvoid;voidLCMInitvoid;voidDisplayOneCharunsignedcharXunsignedcharYunsignedcharDData;voidDisplayListCharunsignedcharXunsignedcharYunsignedcharcode*DData;voidDelay5Msvoid;voidDelay400Msvoid;unsignedcharcodeuctech[]={uctech};unsignedcharcodenet[]={uctech.icpcn.com};void__invoid{ Delay400Ms;//启动等待,等LCM讲入工作状态 LCMInit;//LCM初始化 Delay5Ms;//延时片刻可不要 DisplayListChar05uctech; DisplayListChar00net; ReadDataLCM;//测试用句无意义 while1;}//写数据voidWriteDataLCMunsignedcharWDLCM{ ReadStatusLCM;//检测忙 LCM_Data=WDLCM; LCM_RS=1; LCM_RW=0; LCM_E=0;//若晶振速度太高可以在这后加小的延时 LCM_E=0;//延时 LCM_E=1;}//写指令voidWriteCom__ndLCMunsignedcharWCLCMBuysC//BuysC为0时忽略忙检测{ ifBuysCReadStatusLCM;//根据需要检测忙 LCM_Data=WCLCM; LCM_RS=0; LCM_RW=0; LCM_E=0; LCM_E=0; LCM_E=1;}//读数据unsignedcharReadDataLCMvoid{ LCM_RS=1; LCM_RW=1; LCM_E=0; LCM_E=0; LCM_E=1; returnLCM_Data;}//读状态unsignedcharReadStatusLCMvoid{ LCM_Data=0xFF; LCM_RS=0; LCM_RW=1; LCM_E=0; LCM_E=0; LCM_E=1; whileLCM_DataBusy;//检测忙__ returnLCM_Data;}voidLCMInitvoid//LCM初始化{ LCM_Data=0; WriteCom__ndLCM0x380;//三次显示模式设置,不检测忙__ Delay5Ms; WriteCom__ndLCM0x380; Delay5Ms; WriteCom__ndLCM0x380; Delay5Ms; WriteCom__ndLCM0x381;//显示模式设置开始要求每次检测忙__ WriteCom__ndLCM0x081;//关闭显示 WriteCom__ndLCM0x011;//显示清屏 WriteCom__ndLCM0x061;//显示光标__设置 WriteCom__ndLCM0x0C1;//显示开及光标设置}//按指定位置显示一个字符voidDisplayOneCharunsignedcharXunsignedcharYunsignedcharDData{ Y=0x1; X=0xF;//限制X不能大于15,Y不能大于1 ifYX|=0x40;//当要显示第二行时地址码+0x40; X|=0x80;//算出指令码 WriteCom__ndLCMX0;//这里不检测忙__,发送地址码 WriteDataLCMDData;}//按指定位置显示一串字符voidDisplayListCharunsignedcharXunsignedcharYunsignedcharcode*DData{ unsignedcharListLength; ListLength=0; Y=0x1; X=0xF;//限制X不能大于15,Y不能大于1 whileDData[ListLength]0x20//若到达字串尾则退出 { ifX=0xF//X坐标应小于0xF { DisplayOneCharXYDData[ListLength];//显示单个字符 ListLength++; X++; } }}//5ms延时voidDelay5Msvoid{ unsignedintTempCyc=5552; whileTempCyc--;}//400ms延时voidDelay400Msvoid{ unsignedcharTempCycA=5; unsignedintTempCycB; whileTempCycA-- { TempCycB=7269; whileTempCycB--; };}。