使用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 | 电源地 | |
| 2 | VDD | 电源正极 | |
| 3 | VO | 液晶显示偏压信号 | |
| 4 | RS | 数据/命令选择端 | P3.5 |
| 5 | RW | 读写选择端 | P3.6 |
| 6 | E | 使能信号 | P3.7 |
| 7 | D0 | 数据I/O | P1.0 |
| 8 | D1 | 数据I/O | P1.1 |
| 9 | D2 | 数据I/O | P1.2 |
| 10 | D3 | 数据I/O | P1.3 |
| 11 | D4 | 数据I/O | P1.4 |
| 12 | D5 | 数据I/O | P1.5 |
| 13 | D6 | 数据I/O | P1.6 |
| 14 | D7 | 数据I/O | P1.7 |
| 15 | BLA | 背光源正极 | |
| 16 | BLK | 背光源负极 |
液晶屏内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如表3所示,
表3
这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是 01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”,如图6所示。

表6
1602型液晶屏内部的控制器共有11条控制指令,如表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型显示屏的内部显示地址。
比如第二行第一个字符的地址是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和联系电话的实验实例。
| 感动 | 同情 | 无聊 | 愤怒 | 搞笑 | 难过 | 高兴 | 路过 |
相关文章
-
没有相关内容

会员登录