手把手教你使用PIC单片机控制1602液晶屏(C语言版)——站长原创,如需引用请注明出处
看到这里,我们已经学完了数码管理论与应用,相信你已经可以用它来显示任何数字了吧。下面,我们再来学一下更高层的显示方式——液晶屏显示,与数码管相比,它显得更为专业,漂亮。液晶显示屏以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在袖珍式仪表和低功耗应用系统中得到越来越广泛的应用,增强型51实验板所配带的是1602型液晶屏,它是工控系统中使用最为广泛的液晶屏之一,相信你学会了对它的控制,那你对其它的液晶屏的控制也能得心应手,毕竟基本原理都差不多。
1602型液晶屏是一种用5x7点阵图形来显示字符的液晶显示器,根据显示的容量可以分为1行16个字、2行16个字、2行20个字等等,常用的为2行16个字,我们也以此为例来介绍一下相应的编程方法。
如表2所示,整个液晶屏采用标准的16脚接口,其中VSS为电源地,VDD接5V正电源,V0为液晶显示屏对比度调整端,直接接电源正极时对比度最弱,接地时对比度最高。RS为寄存器选择端,高电平时选择数据寄存器、低电平时选择指令寄存器。RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。E端为使能端,当E端由低电平跳变成高电平时,液晶屏执行命令。D0——D7为8位双向数据线。
编号 |
符号 |
引脚说明 |
与单片机接口 |
编号 |
符号 |
引脚说明 |
与单片机接口 |
1 |
VSS |
电源地 |
|
9 |
D2 |
数据I/O |
P1.2 |
2 |
VDD |
电源正极 |
|
10 |
D3 |
数据I/O |
P1.3 |
3 |
V0 |
液晶显示偏压信号 |
|
11 |
D4 |
数据I/O |
P1.4 |
4 |
RS |
数据/命令选择端 |
P3.5 |
12 |
D5 |
数据I/O |
P1.5 |
5 |
RW |
读写选择端 |
P3.6 |
13 |
D6 |
数据I/O |
P1.6 |
6 |
E |
使能信号 |
P3.7 |
14 |
D7 |
数据I/O |
P1.7 |
7 |
D0 |
数据I/O |
P1.0 |
15 |
BLA |
背光源正极 |
|
8 |
D1 |
数据I/O |
P1.1 |
16 |
BLK |
背光源负极 |
|
表2
液晶屏内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如表3所示,
表3
这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”,如图6所示。

图6
1602型液晶屏内部的控制器共有11条控制指令,如表4所示,
序号 |
指令 |
RS |
RW |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
1 |
清显示 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
2 |
光标返回 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
* |
3 |
置输入模式 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
I/D |
S |
4 |
显示开/关控制 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
D |
C |
B |
5 |
光标或字符移位 |
0 |
0 |
0 |
0 |
0 |
1 |
S/C |
R/L |
* |
* |
6 |
置功能 |
0 |
0 |
0 |
0 |
1 |
DL |
N |
F |
* |
* |
7 |
置字符发生存储器地址 |
0 |
0 |
0 |
1 |
字符发生存储器地址(AGG) |
8 |
置数据存储器地址 |
0 |
0 |
1 |
显示数据存储器地址(ADD) |
9 |
读忙标志或地址 |
0 |
1 |
BF |
计数器地址(AC) |
10 |
写数到CGRAM或DDRAM |
1 |
0 |
要写的数 |
11 |
从CGRAM或DDRAM读数 |
1 |
1 |
读出的数据 |
表4
它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明: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的点阵字符。
指令7:字符发生器RAM地址设置。
指令8:DDRAM地址设置。
指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:写数据。
指令11:读数据。
由于液晶显示屏是个慢显示器件,所以在执行每条指令之前一定要确认液晶屏的“忙标志”为低电平,表示不忙,否则指令失效。要显示字符时要先输入显示字符地址,也就是告诉液晶屏在哪里显示字符,表5是1602型显示屏的内部显示地址.
00 |
01 |
02 |
03 |
04 |
05 |
06 |
07 |
08 |
09 |
0A |
0B |
0C |
0D |
0E |
0F |
10 |
… |
27 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
4A |
4B |
4C |
4D |
4E |
4F |
50 |
… |
67 |
表5
比如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?答案是不可以这样,因为从指令表中我们可以看到,写入显示地址时要求最高位D7恒定为高电平1,所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)
以下是在液晶屏的第二行第一个字符的位置显示字母“A”的程序,效果如图6所示:
#include<pic.h>
void _delay_ms(char a) //毫秒级延时子函数
{
unsigned char i,j;
for(i=0;i<a;i++)
for(j=0;j<40;j++);
}
void enable(void) //控制命令的子函数
{
PORTA=PORTA&0xFD;
PORTA=PORTA&0xFB;
PORTA=PORTA&0xF7;
_delay_ms(9);
PORTA=PORTA|0x08;
}
void main()
{
_delay_ms(9); //调用延时子程序
ADCON1=0x07; //设置RA口全部为普通数字IO口
TRISA=0x00; //定义RA口为输出
TRISC=0x00; //定义RC口为输出
_delay_ms(9);
PORTC=0x01; //清屏
enable();
PORTC=0x38; //设置8位2行5x7点阵
enable();
PORTC=0x0F; //设置显示器开、光标开、闪烁开
enable();
PORTC=0x06; //设置文字不动,光标自动右移
enable();
PORTC=0x0C; //设置写入显示起始地址
enable();
PORTC=0x41; //字母"A"的代码
PORTA=PORTA|0x02;
PORTA=PORTA&0xFB;
PORTA=PORTA&0xF7;
_delay_ms(9);
PORTA=PORTA|0x08;
while(1); //while死循环
}
增强型PIC实验的1602液晶显示部分原理图如上所示。PIC单片机芯片与1602液晶屏对应接口如下:
RA1——RS端 RA2——RW端 RA3——E端 RC口——液晶屏数据端
现在我们已经知道如何来显示自己要显示的字符了,可以从表3查表计算后得出。因此,我们可以由此改写出各种各样的显示程序。
 |
大家可以看到,程序的前半部分主要是完成1602液晶屏的内部初始化及配置工作,和实际显示字符相关的程序代码主要由以下这几句完成:
PORTC=0x41; //字母"A"的代码
PORTA=PORTA|0x02;
PORTA=PORTA&0xFB;
PORTA=PORTA&0xF7;
_delay_ms(9);
PORTA=PORTA|0x08;
因此,我们要更改液晶显示内容,也可以从这几句话来下手,讲到这里,相信你对其显示原理已经有所了解了,可以自己发挥自己的想象来修改一下程序代码,看看显示结果会有什么变化,有没有达到你所需要的目标。
左图中,更改显示部分程序代码后,1602液晶屏分两行显示本站网址URL和联系电话的实验实例。 |
|