1602液晶使用范例Word下载.docx
《1602液晶使用范例Word下载.docx》由会员分享,可在线阅读,更多相关《1602液晶使用范例Word下载.docx(13页珍藏版)》请在冰点文库上搜索。
![1602液晶使用范例Word下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/6/0ead5b92-8d78-4ec6-8bce-535d1efab0c8/0ead5b92-8d78-4ec6-8bce-535d1efab0c81.gif)
7
D0
15
BLK
背光源地
8
D1
16
BLA
背光源正极
注意事项:
从该模块的正面看,引脚排列从右向左为:
15脚、16脚,然后才是1-14脚(线路板上已经标明)。
第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脚:
BLA(BL1):
LED背光正极。
需要背光时,BLA串接一个限流电阻接VDD,BLK接地,实测该模块的背光电流为50mA左右,一般接一个几十欧姆的电阻,47欧、33欧等;
BLK(BL2):
LED背光地端。
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如表1所示,这些字符有:
阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(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地址设置
指令8:
DDRAM地址设置
指令9:
读忙信号和光标地址BF:
为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:
写数据
指令11:
读数据
DM-1602液晶显示模块可以和单片机AT89C51直接接口,电路如图1所示。
为了节约I/O口也可以采用6线接法,只用4根数据线,高低位分别传输,把RW接地,只写不读。
这样可以省下5根I/O口线。
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。
要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,表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。
6线范例:
//编译器:
ICC-AVR
v6.31A
日期:
2005-11-24
20:
29:
57
//目标芯片
:
M16
//时钟:
8.0000Mhz
/*-------------------------------------------------------------
LCD引脚定义
1---GND
2---VCC
3---VO
4---RS
5---RW
6---EN
7到14--D0-D7
15--背景灯+
16--背景灯-
-----------------------------------------------------------------*/
#include
<
iom16v.h>
macros.h>
/*---------------------------------------------------------------
下面是AVR与LCD连接信息
PA2
->
RS
PA3
EN
地
RW
PA4
D4
PA5
D5
PA6
D6
PA7
D7
要使用本驱动,改变下面配置信息即可
#define
LCD_EN_PORT
PORTA
//以下2个要设为同一个口
LCD_EN_DDR
DDRA
LCD_RS_PORT
LCD_RS_DDR
LCD_DATA_PORT
//以下3个要设为同一个口
LCD_DATA_DDR
DDRA
//一定要用高4位
LCD_DATA_PIN
PINA
LCD_RS
(1<
PA2)
//0x04
portA2
out
LCD_EN
PA3)
//0x08
portA3
LCD_DATA
((1<
PA4)|(1<
PA5)|(1<
PA6)|(1<
PA7))
//0xf0
portA4/5/6/7
/*------------------------------------------------------------------------------
函数说明
------------------------------------------------------------------------------*/
void
LCD_init(void);
LCD_en_write(void);
LCD_write_command(unsigned
char
command)
;
LCD_write_data(unsigned
data);
LCD_set_xy
(unsigned
x,
unsigned
y);
LCD_write_string(unsigned
X,unsigned
Y,unsigned
*s);
LCD_write_char(unsigned
delay_nus(unsigned
int
n);
delay_nms(unsigned
/*==========================================================*/
LCD_init(void)
//液晶初始化
{
LCD_DATA_DDR|=LCD_DATA;
//数据口方向为输出
LCD_EN_DDR|=LCD_EN;
//设置EN方向为输出
LCD_RS_DDR|=LCD_RS;
//设置RS方向为输出
LCD_write_command(0x28);
LCD_en_write();
delay_nus(40);
//4位显示
LCD_write_command(0x0c);
//显示开
LCD_write_command(0x01);
//清屏
delay_nms
(2);
}
LCD_en_write(void)
//液晶使能
LCD_EN_PORT|=LCD_EN;
delay_nus
(1);
LCD_EN_PORT&
=~LCD_EN;
//写指令
delay_nus(16);
LCD_RS_PORT&
=~LCD_RS;
//RS=0
LCD_DATA_PORT&
=0X0f;
//清高四位
LCD_DATA_PORT|=command&
0xf0;
//写高四位
command=command<
4;
//低四位移到高四位
=0x0f;
//写低四位
data)
//写数据
LCD_RS_PORT|=LCD_RS;
//RS=1
LCD_DATA_PORT|=data&
data=data<
LCD_set_xy(
y
)
//写地址函数
address;
if
(y
==
0)
address
=
0x80
+
x;
else
0xc0
LCD_write_command(
address);
*s)
//列x=0~15,行y=0,1
X,
Y
);
//写地址
while
(*s)
//
写显示字符
LCD_write_data(
*s
s
++;
//写地址
/*=============================================================*/
delay_1us(void)
//1us延时函数
asm("
nop"
n)
//N
us延时函数
i=0;
for
(i=0;
i<
n;
i++)
delay_1us();
delay_1ms(void)
//1ms延时函数
i;
1140;
i++);
ms延时函数
delay_1ms();
/*============================================================*/
init_devices(void)
CLI();
//disable
all
interrupts
LCD_init();
MCUCR
0x00;
GICR
TIMSK
//timer
interrupt
sources
SEI();
//re-enable
main(void)
init_devices();
LCD_write_string(1,0,"
Hi!
!
"
for(;
)
LCD_write_string(0,1,"
archeng504"
LCD_write_char(6,0,'
8'
}