一看就会的LCD1602的使用及自定义字符显示

概要

工程文件及取模软件在文末链接领取!

在使用lcd1602的时候,经常会觉得自带的字库不够用。但是使用屏幕自带的字库能在一定程度上解决该问题!

技术细节

一,lcd1602的相关知识

我们这次使用的是普中的51开发板,lcd1602使用并口方式。主要使用到的是8根数据线,4根控制线。LCD1602的基础使用其实很简单,就是D0~D7传输数据,EN、RS、WR控制数据传输,VO调节对比度。

模块和单片机电路图连接如下

 

LCD1602的使用主要操作的就是他的DDRAM和CGRAM两个储存区域。CGRAM就是存放我们自定义字符的一个存储空间。DDRAM相当于是你屏幕的映射,你要显示什么就放在DDRAM里,屏幕会给你自动显示出来。DDRAM实际上有2行x40个字符的位置,屏幕优先显示前16列的数据。可以通过移屏的命令来看到后面的内容或者做成动画效果!

 DDRAM像上图所示,我们只要通过命令把光标位置设置到上图框内所示地址,然后把要显示的数据写入即可显示成功。

光标的设置就是下图指令集的第8条,设置的代码如下所示

/**
  * @brief  LCD1602设置光标位置
  * @param  Line 行位置,范围:1~2
  * @param  Column 列位置,范围:1~16
  * @retval 无
  */
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{
	if(Line==1)
	{
		LCD_WriteCommand(0x80|(Column-1));
	}
	else if(Line==2)
	{
		LCD_WriteCommand(0x80|(Column-1+0x40));		//因为第二行的DDRAM地址是从40开始的
	}
}

LCD1602的指令集

要把显示的数据插入进光标指定的DDRAM中,首先要了解到由于数据都是D0~D7八位的,如果要显示一个“A”,肯定要对它进行编码确定一个八位的值。编码的格式即下图中的字模表,可以发现大写的“A”就是ascll码的0x40。大部分的字模都是和ascll一样的,如果我们要传一个A到LCD1602中去,那我们可以直接写'A',编译器会自动转换为ascll码的0x40,当然也可以直接按表上的写0x40进去。

 LCD1602的字模表

 到目前为止,我们已经知道如何在LCD1602任意位置上显示一个字符了。

流程就是先把光标位置通过写命令,指向我们想显示的DDRAM的位置上。接着再通过写数据,把要显示的字符写入进去。LCD1602就能显示上面字模表里任意的数据了。详细程序编写见下:

二、LCD1602程序详细编写

通过上述说明我们知道LCD1602的简易操作其实就两种形式,一个是写命令一个是写数据。其详细时序如下图所示:

 图片看起来比较复杂,这里用文字加代码解释下就很简单了

1,写命令

让单片机的RS和RW引脚为低电平,接着把命令数据放到D0~D7端口上,再让EN引脚置高之后置低产生一个下降沿,就把数据写入lcd1602中了,是不是很简单?

其中延时函数是为了保证电平的建立,代码如下:

void LCD_Delay()	//@1ms	11.0592MHz
{
	unsigned char i, j;

	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
}
/**
  * @brief  LCD1602写命令
  * @param  Command 要写入的命令
  * @retval 无
  */
void LCD_WriteCommand(unsigned char Command)
{
	LCD_RS=0;
	LCD_RW=0;
	LCD_DataPort=Command;
	LCD_EN=1;
	LCD_Delay();
	LCD_EN=0;
	LCD_Delay();
}

2,写数据

写数据和命令其实是一样的,只是把命令数据替换成你需要的数据即可,代码如下

/**
  * @brief  LCD1602写命令
  * @param  Command 要写入的命令
  * @retval 无
  */
void LCD_WriteCommand(unsigned char Command)
{
	LCD_RS=0;
	LCD_RW=0;
	LCD_DataPort=Command;
	LCD_EN=1;
	LCD_Delay();
	LCD_EN=0;
	LCD_Delay();
}

知道了这两个函数我们就已经可以灵活操作LCD1602了,例如我们要在第一行的第一列显示一个大写字母“A”,我们就应该先把光标指向第一行,然后再把'A'的字模相应编码写入即可。程序如下:

/**
  * @brief  LCD1602初始化函数
  * @param  无
  * @retval 无
  */
void LCD_Init()
{
	LCD_WriteCommand(0x38);
	LCD_WriteCommand(0x0c);
	LCD_WriteCommand(0x06);
	LCD_WriteCommand(0x01);
}

/**
  * @brief  在LCD1602指定位置上显示一个字符
  * @param  Line 行位置,范围:1~2
  * @param  Column 列位置,范围:1~16
  * @param  Char 要显示的字符
  * @retval 无
  */
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
{
	LCD_SetCursor(Line,Column);
	LCD_WriteData(Char);
}

这个函数就应这样填写LCD_ShowChar(1,1,'A')或LCD_ShowChar(1,1,0x40)

应该注意上面多了个初始化程序,这是因为要想开启显示必须进行相关的设置,不懂得可以参照第一节的指令集进行分析。其他的显示函数在链接里都有,详情查看链接工程。

三、LCD1602自定义字符显示

如果只是会上面的,那也基本够用。但有时候我们想显示除了字模表里的字符,那就要使用到CGRAM来自定义字符了。

那如何进行自定义呢?我们看到指令集的第7条

 CGRAM的格式为0 1 x x x  x x x x刚好就是0~3F的64个字节,接着看到字模表的CGRAM列

他是只有8个位置可以自定义字符的,64/8的话刚好就是8个字符,每个字符占8个字节

知道这些后,我们要显示一个自定义字符也简单了,首先写命令指向CGRAM的一个位置,然后连续写8次数据,即可把我们的自定义字符写入字模表的0x00~0x08的位置上。显示的话就按其他字模显示的方式一样就可以了。

 写自定义字符到字模表函数如下:

/**
  * @brief  LCD1602自定义字符
  * @param  Position 位置,范围:1~8
  * @param  Table 要显示的字符的数组名
  * @retval 无
  */
void LCD_SetCustomChar(unsigned char Position,char *Table)
{
	unsigned char i;
	switch (Position)
	{
		case 1:
			LCD_WriteCommand(0x40);
			for(i=0;i<8;i++)
			{
				LCD_WriteData(Table[i]);	
			}
		break;
		case 2:
			LCD_WriteCommand(0x48);
			for(i=0;i<8;i++)
			{
				LCD_WriteData(Table[i]);	
			}
		break;
		case 3:
			LCD_WriteCommand(0x50);
			for(i=0;i<8;i++)
			{
				LCD_WriteData(Table[i]);	
			}
		break;
		case 4:
			LCD_WriteCommand(0x58);
			for(i=0;i<8;i++)
			{
				LCD_WriteData(Table[i]);	
			}
		break;
		case 5:
			LCD_WriteCommand(0x60);
			for(i=0;i<8;i++)
			{
				LCD_WriteData(Table[i]);	
			}
		break;
		case 6:
			LCD_WriteCommand(0x68);
			for(i=0;i<8;i++)
			{
				LCD_WriteData(Table[i]);	
			}
		break;
		case 7:
			LCD_WriteCommand(0x70);
			for(i=0;i<8;i++)
			{
				LCD_WriteData(Table[i]);	
			}
		break;
		case 8:
			LCD_WriteCommand(0x78);
			for(i=0;i<8;i++)
			{
				LCD_WriteData(Table[i]);	
			}
		break;
	}
}

显示自定义字符的函数如下:

/**
  * @brief  在LCD1602指定位置上显示自定义字符
  * @param  Line 行位置,范围:1~2
  * @param  Column 列位置,范围:1~16
  * @param 	Num 要显示的字符编号,范围:1~8
  * @retval 无
  */
void LCD_ShowCustomChar(unsigned char Line,unsigned char Column,unsigned char Num)
{
	LCD_SetCursor(Line,Column);
	LCD_WriteData(Num-1);
}

例如:在屏幕任意位置显示我自定义的字符

#include <STC89C5xRC.H>
#include "LCD1602.h"

unsigned char table1[]={0x04,0x1F,0x04,0x1F,0x11,0x1F,0x0A,0x1B};//克
unsigned char table2[]={0x0A,0x1F,0x0A,0x0A,0x1F,0x0A,0x0A,0x1B};//共
unsigned char table3[]={0x04,0x0A,0x11,0x04,0x04,0x04,0x04,0x04};//个

void main()
{
	LCD_Init();
	
	LCD_SetCustomChar(1,table1);//table1字模放CGROM1
	LCD_SetCustomChar(2,table2);//table2字模放CGROM2
	LCD_SetCustomChar(3,table3);//table3字模放CGROM3
	
	LCD_ShowCustomChar(1,1,1);//在第1行第1列开始显示CGROM1
	LCD_ShowCustomChar(2,3,2);//在第2行第3列开始显示CGROM2
	LCD_ShowCustomChar(2,5,3);//在第2行第5列开始显示CGROM3
	LCD_ShowString(1,4,"Hello World!");
	while(1)
	{
		
	}
}

实际效果:

 

 四、字模取模相关步骤

 上面的字模通过table1[]等的数组进行储存,是因为我直接使用取模软件生成的,链接内自带相关软件,过程如下:

1,新建一个文字

 2、点击选项进行相关设置,在格子内画上你想要的字符,(左键点亮,右键清除)最后点击生成字模即可复制到你的table[]数组中

注:严格参照该设置 

 总结:

相信通过该教程你已经学会了如何使用LCD1602的基础功能了。希望对你有所帮助,欢迎交流指正!

工程文件链接:

链接:https://pan.baidu.com/s/1e89qeOBmqtNZnGRnS1z1MQ 
提取码:d1gm

  • 10
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 我可以回答这个问题。要实现动态的LCD1602图形显示,需要使用51单片机的GPIO口控制LCD1602的各个引脚,同时使用定时器断来控制图形的刷新。具体实现方法可以参考51单片机的开发文档和LCD1602的数据手册。 ### 回答2: 动态LCD1602图形显示程序可以通过控制51单片机的GPIO口来实现。具体步骤如下: 首先,需要连接51单片机LCD1602模块。将51单片机的P0口连接到LCD1602的D0-D7数据口,将P2口的P2.0和P2.1引脚连接到LCD1602的RS和EN控制口,将P3口的P3.4引脚连接到LCD1602的RW控制口。 接下来,需要初始化LCD1602模块。首先设置LCD1602为8位数据接口模式,设置显示为两行,设置光标不闪烁,并清屏。 然后,可以编写显示程序。我们可以使用汇编或C语言编写程序。程序的主要思路是编写一组自定义字符,并按一定的时间间隔在LCD1602显示这些字符,实现动态显示的效果。 下面是一个示例C语言程序的伪代码: ``` c #include <reg51.h> void delay(unsigned int ms) { unsigned int i, j; for(i = 0; i < ms; i++) for(j = 0; j < 1275; j++) // 延时一毫秒 } void init_lcd() { // 初始化LCD1602 // 设置8位数据接口模式 // 设置两行显示 // 设置光标不闪烁 // 清屏 } void display_graphics() { // 编写一组自定义字符 // 将这些字符存储到LCD1602的CGRAM // 按一定的时间间隔在LCD1602显示这些字符 } void main() { init_lcd(); // 初始化LCD1602 while(1) { display_graphics(); // 显示自定义字符 delay(1000); // 延时一秒 } } ``` 在display_graphics函数,可以使用LCD1602的指令来设置指定位置显示自定义字符,例如`LCD1602_set_pos(row, col)`和`LCD1602_write_char(data)`函数。 以上是一个简单的动态LCD1602图形显示程序的实现思路,根据具体的需求可以进行个性化的修改和优化。 ### 回答3: 51单片机是一种常用的单片机,可以用来实现各种系统控制和显示功能。要实现一个动态的LCD1602图形显示程序,首先需要了解LCD1602的工作原理和基本操作。 LCD1602是一种16×2字符LCD模块,可以显示2行16列的字符。要动态地显示图形,可以利用LCD1602自定义字符功能。 首先,需要将要显示的图形转换为LCD1602可识别的自定义字符LCD1602可以自定义8个5×8像素的字符。可以使用相关工具将图形转换为8个字符的点阵数据,然后将数据写入LCD1602字符发生器RAM。 接下来,需要使用51单片机控制LCD1602显示。可以通过设置对应端口的电平或者发送特定的指令,来控制LCD1602显示内容和光标位置。可以使用51单片机提供的IO口,通过设置为输出模式和高低电平来控制LCD的RS、RW、E和数据线。 首先,需要初始化LCD1602,包括设置工作模式、显示模式、光标位置等参数。然后,将自定义字符的数据写入LCD1602字符发生器RAM。接着,就可以根据需要,通过控制51单片机的IO口,将自定义字符写入LCD1602显示数据RAM。 在代码可以设定一个循环,每次循环改变显示的图形。可以通过控制51单片机的IO口,实现不同图形的切换和显示。 总结一下,可以通过51单片机控制LCD1602实现动态的图形显示程序。首先需要将要显示的图形转换为LCD1602自定义字符数据,然后通过设置51单片机的IO口,将数据写入LCD1602字符发生器RAM和显示数据RAM,实现动态的图形显示。这个程序可以根据需要改变图形,实现不同的显示效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SFR-小曾

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

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

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

打赏作者

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

抵扣说明:

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

余额充值