LCD1602实验(基于C51单片机)

一、背景

        我们学习过几种显示装置,例如静态数码管、动态数码管,串口通信等。但他们的显示具有局限性,现在我们来介绍一个新的显示字符的液晶显示器 LCD1602。接下来让我们一起进入LCD1602的学习旅程。

二、LCD1602的介绍

1、简介

1)、它是字符型液晶,能显示2行字符信息,每行又能显示16个字符。它只能显示字母,数字,符号的点阵型液晶模块,不能显示图片。

2)管脚图

3)LCD1602内部含有80个字节的DDRAM,用来寄存显示字符的。

注意,在写显示程序的时候,因为最高位要求是1,所以在写程序的时候,显示需要+0x80的数值。

2、常用指令

1)清屏指令:设置为0x01。

2)模式设置指令:一般设置为0x06。

I/D:0=写入新数据后光标左移,1=写入新数据后光标右移

S:0=写入新数据后显示屏不移动,1=写入数据后显示屏整体右移1个字符

3)显示开关控制指令:一般设置为0xC0

D:0=显示功能关   1=显示功能开

C:0=无光标,1=有光标

B:0=光标闪烁,1=光标不闪烁

4)功能设定指令:一般设置为0x38

DL:0=数据总线为4位,1=数据总线为8位

N:0=显示1行,1=显示2行

F:0=5x7 点阵/每字符     1=5x10点阵/每字符

5)设定显示屏或光标移动方向指令:0x18。滚动效果可以用这个实现,但是每次在写入数据之前都要调用一次。

S/C        R/L        设定情况

0                0                光标左移1格,且AC值减1

0                1                光标右移1格,且AC值加1

1                0                显示器上字符全部左移一格,但光标不动

1                1                显示器上字符全部右移一格,但光标不动

3、写入数据时序图

4、电路图

三、实验程序

#include "lcd1602.h"

/**
	*@brief 写命令函数
	*@param 命令
	*@retval 无
	*/
void Lcd1602_WriteCmd(u8 cmd)
{
	Lcd1602_RS = 0;//数据和命令选择:0表示命令,1表示数据
	Lcd1602_WR = 0;//读写:0表示写,1表示数据
	Lcd1602_EN = 0;
	Lcd1602_DataPort = cmd;
	Delay_ms(1);
	Lcd1602_EN = 1;
	Delay_ms(1);
	Lcd1602_EN = 0;
}

/**
	*@brief 写数据函数
	*@param 数据
	*@retval 无
	*/
void Lcd1602_WriteData(u8 dat)
{
	Lcd1602_RS = 1;//数据和命令选择:0表示命令,1表示数据
	Lcd1602_WR = 0;//读写:0表示写,1表示数据
	Lcd1602_EN = 0;
	Lcd1602_DataPort = dat;
	Delay_ms(1);
	Lcd1602_EN = 1;
	Delay_ms(1);
	Lcd1602_EN = 0;
}

/**
	*@brief 初始化函数,设置初始值
	*@param 无
	*@retval 无
	*/
void Lcd1602_Init()
{
	Lcd1602_WriteCmd(0x0c);//0000 1100 显示开,游标不显示,闪烁 (显示开/关控制)
	Lcd1602_WriteCmd(0x06);//0000 0110 写入数据后光标自动右移,整屏不移动
	Lcd1602_WriteCmd(0x38);//0011 1000 数据总线8位,
	Lcd1602_WriteCmd(0x01);//清屏指令
}

/**
	*@brief 显示字符串,如果第一行显示超过范围,到第二行继续显示,如果第三行超过范围,到第三行继续显示。
	*@param x:显示行,y:显示位置
	*@retval 无
	*/
void Lcd1602_ShowString(u8 x,u8 y,u8 *str)
{
	u8 i = 0;
	if(x > 1 || y > 15) return;
	if(x == 0)
	{
		while(*str != '\0')
		{
			if(y + i < 16)
			{
				Lcd1602_WriteCmd(y + i + 0x80);
			}else{
				Lcd1602_WriteCmd(i + y-16 + 0x80 + 0x40);
			}
			Lcd1602_WriteData(*str);
			i++;
			str++;
		}			
	}else
	{
		while(*str != '\0')
		{
			if(y + i < 16)
			{
				Lcd1602_WriteCmd(y + i + 0x80 + 0x40);
			}else{
				Lcd1602_WriteCmd(y + i -16 + 0x80);
			}
			Lcd1602_WriteData(*str);
			i++;
			str++;
		}
	}
}
#include "public.h"
#include "lcd1602.h"

sbit LED1 = P2^0;

void main()
{
	Lcd1602_Init();
	while(1)
	{
		Lcd1602_WriteCmd(0x18);
		Lcd1602_ShowString(0,0,"HelloWorld");
		Lcd1602_ShowString(1,0,"I Love you");
		Delay_ms(1000);
	}
}

总结:LCD1602的实验程序已经写完了,是不是很简单,只要是对LCD1602有个了解就行了。主要的是初始化指令,写指令和写数据。

程序代码我已经上传到资源了:https://download.youkuaiyun.com/download/weixin_41392061/89944447

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_41392061

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值