1.原理:
?1602 液晶也叫 1602 字符型液晶,它能显示 2 行字符信息,每行又能显示 16 个字符。 ?它是一种专门用来显示字母、数字、符号的点阵型液晶模块。它是由若 干个 5x7 或者? ?5x10 的点阵字符位组成,每个点阵字符位都可以用显示一个字符, 每位之间有一个点 ?距的间隔,每行之间也有间隔,起到了字符间距和行间距的作 用,正因为如此,所以它 ?不能很好的显示图片
? ?(1)引脚:
(2)其地址 和屏幕的对应关系如下:
? ? ??
?
要显示字符时 要先输入显示字符地址,也就是告诉模块在哪里显示字符,例如第二行第一个字 符的地址是 40H,那么是否直接写入 40H 就可以将光标定位在第二行第一个字
符的位置呢?这样不行,因为写入显示地址时要求最高位 D7 恒定为高电平 1
所以实际写入的数据应该是 01000000B(40H)+10000000B(80H)=11000000B(C0H)
也就是说:第一行地址为:0x40? ?第二行地址为:0xC0
(3)常用指令:
? ?清屏置零:0x01
1.清除液晶显示器,即将 DDRAM 的内容全部填入"空白"的 ASCII 码 20H;
2.光标归位,即将光标撤回液晶显示屏的左上方;
3.将地址计数器(AC)的值设为 0。
?
? 模式设置指令 :
功能:设定每次写入 1 位数据后光标的移位方向,并且设定每次写入的一个字符是否移动。
I/D:0=写入新数据后光标左移? ? ? ? 1=写入新数据后光标右移
S:? 0=写入新数据后显示屏不移动? ?1=写入新数据后显示屏整体右移 1 个字符
?显示开关控制指令
功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。
D:0=显示功能关? ?1=显示功能开
C:0=无光标? ? 1=有光标
B:0=光标闪烁 1=光标不闪
功能设定指令
功能: 设定数据总线位数、显示的行数及字型。
DL:0=数据总线为 4 位? ?1=数据总线为 8 位
N:? 0=显示 1 行? ? ? ? ? ? ? 1=显示 2 行
F:? 0=5×7 点阵/每字符? ?1=5×10 点阵/每字符
(4) 写指令与写数据:
① 当要写指令字,设置 LCD1602 的工作方式时:需要把
RS 置为低电平
,
RW
? ? 置为低电平
,然后将
数据送到数据口 D0~D7
,最后
E 引脚一个高脉冲
将数据写入。
/*写指令函数*/ void write_con(u8 con){ ? ? ? P0=con; ? ? ? ? ? //送出指令 ?? ? ?RS=0;RW=0;EN=1; ?//写指令时序 ?? ? ?delay(200); ?? ? ?EN=0; }
?
② 当要写入数据字,在 1602 上实现显示时:需要把
RS 置为高电平
,
RW 置
为低电平
,然后将
数据送到数据口 D0~D7
,最后
E 引脚一个高脉冲
将数据写入
/*写数据函数*/ void write_dat(u8 dat){ ? ? ?P0=dat;?? ??? ? ? ? //送出数据 ?? ? RS=1;RW=0;EN=1;//写数据时序 ?? ? delay(200); ?? ? EN=0; }
?2.电路原理图(普中A2开发板):
?3.程序说明:
? ?利用LCD1602显示"Hello World"字符
?4.源程序:
#include <reg51.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit RW=P2^5;
sbit RS=P2^6;
sbit EN=P2^7;
u8 code table[15]="Hello World";
/*延时函数*/
void delay(u16 i)
{
while(i--);
}
/*写指令函数*/
void write_con(u8 con){
P0=con; //送出指令
RS=0;RW=0;EN=1; //写指令时序
delay(200);
EN=0;
}
/*写数据函数*/
void write_dat(u8 dat){
P0=dat; //送出数据
RS=1;RW=0;EN=1;//写数据时序
delay(200);
EN=0;
}
/*LCD初始化函数*/
void LcdInit(){
write_con(0x01);//清屏
write_con(0x38);//设置16*2显示
write_con(0x0c);//开显示
write_con(0x06);//写入数据时光标右移1位
}
/*LCD显示函数*/
void LcdDisplay(u8 table[]){
u8 i=0;
write_con(0x80); //起点为第一行
while(table[i]!='\0'){
write_dat(table[i]);
delay(100);
i++;
}
/*
i=0;
write_con(0xc0); //起点为第二行
while(table[i]!='\0'){
write_dat(table[i]);
delay(100);
i++;
}
i=0;
*/
}
/*主函数*/
void main()
{
LcdInit();
while(1)
{
LcdDisplay(table);
}
}
5.开发板运行结果:
?
以上就是51单片机的LCD1602实验了?
想要了解更多的单片机实验,请查看我的51单片机专栏。
?
|