第八讲:1602液晶(郭天祥)

说明:此文章仅是我学习过程中的一些记录,如有侵权,请联系我删除,文章中难免有遗漏错误之处,欢迎指出。

一、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--);	
}

 

 

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值