16X2字符型液晶显示模块Word格式文档下载.docx
《16X2字符型液晶显示模块Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《16X2字符型液晶显示模块Word格式文档下载.docx(10页珍藏版)》请在冰豆网上搜索。
(说明:
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地址设置
指令8:
DDRAM地址设置
指令9:
读忙信号和光标地址BF:
为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:
写数据
指令11:
读数据
DM-162液晶显示模块可以和单片机AT89C51直接接口,电路如图1所示。
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。
要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,表3是DM-162的内部显示地址.
比如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?
这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)
以下是在液晶模块的第二行第一个字符的位置显示字母“A”的程序:
ORG0000H
RSEQUP3.7;
确定具体硬件的连接方式
RWEQUP3.6;
确定具体硬件的连接方式
EEQUP3.5;
MOVP1,#00000001B;
清屏并光标复位
ACALLENABLE;
调用写入命令子程序
MOVP1,#00111000B;
设置显示模式:
8位2行5x7点阵
ACALLENABLE;
MOVP1,#00001111B;
显示器开、光标开、光标允许闪烁
调用写入命令子程序
MOVP1,#00000110B;
文字不动,光标自动右移
MOVP1,#0C0H;
写入显示起始地址(第二行第一个位置)
MOVP1,#01000001B;
字母A的代码
SETBRS;
RS=1
CLRRW;
RW=0;
准备写入数据
CLRE;
E=0;
执行显示命令
ACALLDELAY;
判断液晶模块是否忙?
SETBE;
E=1;
显示完成,程序停车
AJMP$
ENABLE:
CLRRS;
写入控制命令的子程序
CLRRW
CLRE
ACALLDELAY
SETBE
RET
DELAY:
MOVP1,#0FFH;
判断液晶显示器是否忙的子程序
CLRRS
SETBRW
NOP
JBP1.7,DELAY;
如果P1.7为高电平表示忙就循环等待
RET
END
程序在开始时对液晶模块功能进行了初始化设置,约定了显示格式。
注意显示字符时光标是自动右移的,无需人工干预,每次输入指令都先调用判断液晶模块是否忙的子程序DELAY,然后输入显示位置的地址0C0H,最后输入要显示的字符A的代码41H。
1602字符液晶驱动函数库
关键词:
1602字符液晶驱动函数库
/**************************************************************************
THE1602CHARLCDLIB
COPYRIGHT(c)
2005BYJJJ.
--
ALLRIGHTSRESERVED
--
FileName:
LCD.h
Author:
JiangJianJun
Created:
2005/4/3
Modified:
NO
Revision:
1.0
***************************************************************************/
#ifndefLCD_CHAR_1602_2005_4_9
#defineLCD_CHAR_1602_2005_4_9
#include<
REGX51.H>
intrins.h>
//PortDefinitions**********************************************************
sbitLcdRs
=P3^0;
sbitLcdRw
=P3^1;
sbitLcdEn
=P3^2;
sfr
DBPort
=0xA0;
//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
sbitLcdLight
=DBPort^4;
voidDelay1ms(unsignedintcount)
{
unsignedinti,j;
for(i=0;
i<
count;
i++)
for(j=0;
j<
120;
j++);
}
//内部等待函数**************************************************************************
unsignedcharLCD_Wait(void)
LcdRs=0;
LcdRw=1;
_nop_();
LcdEn=1;
while(DBPort&
0x80);
//或do{ACC=DBPort;
}while(ACC_7==1);
LcdEn=0;
Delay1ms
(1);
returnACC;
//向LCD写入命令或数据************************************************************
#defineLCD_COMMAND
0x00
//Command
#defineLCD_DATA
0x01
//Data
#defineLCD_CLEAR_SCREEN
//清屏
#defineLCD_HOMING
0x02
//光标返回原点
voidLCD_Write(unsignedcharstyle,unsignedcharinput)
LcdRs=style;
LcdRw=0;
DBPort=input;
LCD_Wait();
//设置显示模式************************************************************
#defineLCD_SHOW
0x04
//显示开
#defineLCD_HIDE
//显示关
#defineLCD_CURSOR
0x02
//显示光标
#defineLCD_NO_CURSOR
//无光标
#defineLCD_FLASH
//光标闪动
#defineLCD_NO_FLASH
//光标不闪动
voidLCD_SetDisplay(unsignedcharDisplayMode)
LCD_Write(LCD_COMMAND,0x08|DisplayMode);
//设置输入模式************************************************************
#defineLCD_AC_UP
0x02
#defineLCD_AC_DOWN
//default
#defineLCD_MOVE
//画面可平移
#defineLCD_NO_MOVE
//default
voidLCD_SetInput(unsignedcharInputMode)
LCD_Write(LCD_COMMAND,0x04|InputMode);
//移动光标或屏幕************************************************************
#defineLCD_SCREEN
0x08
#defineLCD_LEFT
0x00
#defineLCD_RIGHT
0x04
voidLCD_Move(unsignedcharobject,unsignedchardirection)
if(object==LCD_CURSOR)
LCD_Write(LCD_COMMAND,0x10|direction);
if(object==LCD_SCREEN)
LCD_Write(LCD_COMMAND,0x18|direction);
//初始化LCD************************************************************
voidLCD_Initial()
Delay1ms(80);
LCD_Write(LCD_COMMAND,0x38);
//8位数据端口,2行显示,5*7点阵
Delay1ms(10);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);
//开启显示,无光标
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);
//清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);
//AC递增,画面不动
//************************************************************************
voidGotoXY(unsignedcharx,unsignedchary)
if(y==0)
LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));
voidPrint(unsignedchar*str)
while(*str!
='
\0'
)
LCD_Write(LCD_DATA,*str);
str++;
voidLCD_LoadChar(unsignedcharuser[8],unsignedcharplace)
unsignedchari;
LCD_Write(LCD_COMMAND,0x40|(place*8));
i<
8;
i++)
LCD_Write(LCD_DATA,user[i]);
#endif