说明:此文章仅是我学习过程中的一些记录,如有侵权,请联系我删除,文章中难免有遗漏错误之处,欢迎指出。
一、1602液晶介绍
液晶属于扩展内容,但是,很多时候都会用到,毕竟需要一个可视化的结果提供给用户,所以我们需要掌握液晶的使用。
1602型号的液晶,其中16表示1行可以显示16个字符,02表示共有2行。
类似的,还有1601、0801、0802...
还有一些型号是12864、12232这种图形液晶,例如12864就是横的有128个点,竖的有64个点,由这些点构成一个图形。而前面提到的是字符液晶,只能显示字符。这些都可以在说明文档里了解到。
注:老师说,既然已经学会液晶了,那么能用液晶就尽量不用数码管了,因为相比较而言,液晶更简单,并且更有趣。
二、通过文档学习如何操作1602液晶
1.老师发的资料里有一个中文的文档,先看液晶的引脚功能:
再看开发板的连接图:
可以看到第5引脚直接连接着地,因为这里我们仅需往液晶里写数据,并不需要读数据。所以只需操纵第4和第6引脚即可。
2.接着再往下看详细的接口说明:
之所以要确保STA7 = 0,是因为STA7是读写操作使能,只有处于允许位了,才能进行读写操作。在单片机中由于晶振的频率不是很高,因此也不需要太过考虑。主要是液晶写数据是需要一定时间的,而在使用DSP、嵌入式芯片等高速运行时,有时候上一次液晶还没显示完全,下一次显示请求就到来了,而如果不管读写操作使能,则可能导致显示数据的丢失。因此我们要通过读写检测来进行相应处理。
注:
高脉冲:由低到高到低就是一个高脉冲。
低脉冲:反过来,高低高则是一个低脉冲。
3.接着我们详细看写操作时序:
由前面的文档说明知道,RS的不同代表的是写指令以及写数据的不同。
而R/W我们已经默认接地。所以通过对RS、E的操作可以实现指令或者数据的写入。
因此我们编写两个函数,分别用来写指令以及写数据:
写指令函数如下:
void write_com(uchar com)//写指令/命令
{
lcdrs = 0;
//RW = 0;//开发板已经默认接地了
P0 = com;//com代表指令
delay(5);
lcden = 1;
delay(5);
lcden = 0;
}
写数据函数如下:
void write_data(uchar date)//写数据
{
lcdrs = 1;
//RW = 0;//开发板已经默认接地了
P0 = date;//date代表数据
delay(5);
lcden = 1;
delay(5);
lcden = 0;
}
因为对实时性的要求不高,所以时序参数只用简单的delay函数替代即可,实际开发过程可能需要注意。
还有就是上面提到的读写检测,在简单的单片机程序中也可以不进行,我们仅需简单的delay函数延时,延时的时间大于液晶写的速度即可。
4.RAM地址映射图
其中每一格代表一个地址,往该地址中写数据内容,则内容会显示到该地方。而后面的第一行的10到27以及第二行的50到67不属于显示内容,但是我们可以选择先把内容写在这后面,然后进行整屏移动,把这后面的内容移动到屏幕上。
5.指令说明:
在开始前要先送指令,来设置显示模式。在中文文档中只有这一个模式,应该在详细的英文文档中会有其他的指令,实际开发中我们应尽量按照原文档来写程序。
然后是显示开关及光标设置。
注意上面的N=1时的当读或写一个字符后地址指针加一,是因为后面将要提到的数据指针,我们需要设置数据指针,然后内容会显示在该数据指针指向的位置,当我们想要写一行数据时,我们需要设置多次数据指针,而如果地址指针会自动加1,我们就不用设置了,只要把数据写进行就好了。
数据指针的设置,写数据前的准备工作。
其他的一些设置,还有很多很多设置,可以在文档中找到。
三、使用1602液晶,第一行显示“I AM hong!”,第二行显示“I LIKE MCU!”
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit lcden = P3^4;
sbit lcdrs = P3^5;
sbit dula = P2^6;
sbit wela = P2^7;
void delay(uint z);
uchar num;
uchar code table[]="I AM hong!";
uchar code table1[]="I LIKE MCU!";
void write_com(uchar com)//写指令/命令
{
lcdrs = 0;
//RW = 0;//开发板已经默认接地了
P0 = com;
delay(5);
lcden = 1;
delay(5);
lcden = 0;
}
void write_data(uchar date)//写数据
{
lcdrs = 1;
//RW = 0;//开发板已经默认接地了
P0 = date;
delay(5);
lcden = 1;
delay(5);
lcden = 0;
}
void init()
{
dula = 0;
wela = 0;//关闭数码管
lcden = 0;
write_com(0x38);//显示模式设置
write_com(0x0c);//显示开/关及光标设置
write_com(0x06);//地址指针加1,N=1,S=0
write_com(0x01);//显示清屏,因为默认有个数据在里面,屏幕有个黑块
write_com(0x80);//数据指针设置
}
void main()
{
init();
for(num = 0;num < 10;num++)
{
write_data(table[num]);
delay(200);
}
write_com(0x80+0x40);//第二行
for(num = 0;num < 11;num++)
{
write_data(table1[num]);
delay(200);
}
while(1);
}
void delay(uint z) //延时函数,z的取值为这个函数的延时ms数,如delay(200);大约延时200ms.
{ //delay(500);大约延时500ms.
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}