LCD1602指定位置显示字符串-详细版

 本文为博主 日月同辉,与我共生,csdn原创首发。希望看完后能对你有所帮助,不足之处请指正!一起交流学习,共同进步!

> 发布人:@日月同辉,与我共生_单片机-CSDN博客

> 欢迎你为独创博主日月同辉,与我共生点赞❤❤❤+关注👍+收藏🌹+评论☺。

系列专栏: CSDN-单片机串口通信学习系列🎁

> 我的格言是:“尽最大努力,做最好的自己!💪

要转载,请提前告知!!!

版权声明:本文为CSDN博主「日月同辉,与我共生」的原创文章,CSDN独一份。

目录

一、前言

二、系统设计思路

2.1硬件设计

2.2软件设计

三、硬件设计接线

四、项目代码

4.1命令模块

4.2读忙指令

4.3写命令

4.4写数据

4.5初始化

4.6位置函数

4.7显示字符

五、结果展示

一、前言

LCD1602是一种常见的液晶显示模块,它能够显示两行字符。在实际应用中,我们经常需要使用LCD1602来显示一些信息,例如温度、湿度、时间等。为了实现这个功能,我们需要编写相应的程序来控制LCD1602的显示。本文将介绍如何控制LCD1602显示两行字符的方法。

二、系统设计思路

系统设计思路可以分为硬件设计和软件设计

LCD1602在指定位置显示字符串"hello world"

2.1硬件设计

主控芯片选择:选择STC89C51作为主控芯片,由于其较高的性能和稳定性,适合用于控制和数据处理。

显示屏选择LCD1602用于传输字符数据和控制信号。

2.2软件设计

(1)LCD1602初始化(可以在游览器中下载LCD1602数据手册,查看初始化步骤)。

(2)LCD1602读写时序,用于读写数据或数据。

(3)在LCD1602屏中显示字符。

三、硬件设计接线

RS接P2^5 口,用于选择数据/命令寄存器。RS=0时,使用命令寄存器;RS=1时,使用数据寄存器。

RW接P2^6 口,用于选择读写寄存器。RW=0时,使用写寄存器;RW=1时,使用读寄存器。

使能端E接P2^7口

传输数据/命令(8位二进制)DB0-DB7,接P0口。

Vss接+5电源,VDD接地GND,VEE先接变阻器后接到地。

四、项目代码

不懂如何看读写时序图的,可以看:LCD1602设计(3)-读写时序

4.1命令模块

LCD1602.h

对LCD1602引脚接的I/O口宏定义,并对LCD1602的所有指令进行宏定义。

#ifndef __LCD1602_H__
#define __LCD1602_H__

#include <reg51.h>
#include "lcd1602.h"

//IO口宏定义
sbit LCD1602_RS=P2^5;
sbit LCD1602_RW=P2^6;
sbit LCD1602_E=P2^7;
#define LCD1602_DB P1

//命令宏定义
#define LCD_SCREEN_CLR 0x01  //清屏
#define LCD_CURSOR_RST 0x02  //光标复位

//显示开关控制指令
#define LCD_OFF        0x08 //显示关,光标关,不闪烁
#define LCD_FLI        0x09 //显示关,光标关,闪烁开
#define LCD_CUR        0x0A //显示关,光标开,不闪烁
#define LCD_CUR_FLI    0x0B //显示关,光标开,闪烁开
#define LCD_BIS        0x0C //显示开,光标关,不闪烁
#define LCD_BIS_FLI    0x0D //显示开,光标关,闪烁开
#define LCD_BIS_CUR    0x0E //显示开,光标开,不闪烁
#define LCD_ON         0x0F //显示开,光标开,闪烁开

//显示模式控制
#define LCD_AC_ADD_MOVE    0x07 //数据读写操作后,AC自动加1,画面平移
#define LCD_AC_ADD         0x06 //数据读写操作后,AC自动加1,画面不平移
#define LCD_AC_RED_MOVE    0x05 //数据读写操作后,AC自动减1,画面平移
#define LCD_AC_RED         0x04 //数据读写操作后,AC自动减1,画面不平移


//光标移动指令
#define SUR_LEFT          0x10 //光标左移,画面显示不移动
#define SUR_RIGHT         0x14 //光标右移,画面显示不移动
#define LCD_DIS_FRA_LEFT  0x18 //光标不移动,画面显示左移,操作后AC自增
#define LCD_DIS_FRA_RIGHT 0x1C //光标不移动,画面显示右移,操作后AC自减

//功能设置
#define EDI4_DISONE_57  0x20 //4位数据接口,1行显示,5*7点阵
#define EDI4_DISONE_510 0x24 //4位数据接口,1行显示,5*10点阵
#define EDI4_DISTWO_57  0x28 //4位数据接口,2行显示,5*7点阵
#define EDI4_DISTWO_510 0x2C //4位数据接口,2行显示,5*10点阵
#define EDI8_DISONE_57  0x30 //8位数据接口,1行显示,5*7点阵
#define EDI8_DISONE_510 0x34 //8位数据接口,1行显示,5*10点阵
#define EDI8_DISTWO_57  0x38 //8位数据接口,2行显示,5*7点阵
#define EDI8_DISTWO_510 0x3C //8位数据接口,2行显示,5*10点阵

//函数声明
void LCDReadBF();//读忙检测
void LCDWriteCmd(unsigned char cmd);//写命令
void LCDWritedata(unsigned char dat);//写数据
void LCDInit();//初始化
void LCDSetPosition(unsigned char x,unsigned char y);//位置函数
void LCDShowStr(unsigned char x,unsigned char y,unsigned char *str);//字符串位置显示函数


#endif

4.2读忙指令

读时序图:

void LCDReadBF() //读忙检测(读命令)
{
	unsigned char i;
	unsigned char state;
	LCD1602_DB=0XFF;
	LCD1602_RS=0;
	LCD1602_RW=1;
	do
	{
	  LCD1602_E=1;
	  state=LCD1602_DB;//将LCD1602的数据给主机(单片机)
	  LCD1602_E=0;
	  i++;
	  if(i>200)
		break;//防止忙过头,卡死
	}
	while(state&0x80); //判断忙不忙
}

4.3写命令

写时序图:

void LCDWriteCmd(unsigned char cmd) //写命令
{
	LCDReadBF();//读忙检测,确保LCD1602此刻不在工作
	LCD1602_RS=0;
	LCD1602_RW=0;
	LCD1602_DB=cmd;//将命令dat给LCD1602
	LCD1602_E=1;
	LCD1602_E=0;
}

4.4写数据

写时序图:

void LCDWritedata(unsigned char dat) //写数据
{
	LCDReadBF();//读忙检测,确保LCD1602此刻不在工作
	LCD1602_RS=1;
	LCD1602_RW=0;
	LCD1602_DB=dat;//将数据dat给LCD1602
	LCD1602_E=1;
	LCD1602_E=0;
}

4.5初始化

初始化步骤:功能设置==>显示开关控制指令==>光标移动指令/显示模式控制

功能设置:接口位数(4位/8位)、显示多少行(1行/2行)、点阵类型(5*7点阵/5*10点阵)。

显示开关控制指令:是否显示字符、光标是否关闭、光标是否闪烁。

光标移动指令:光标不动/左移/右移、画面不动/左移/右移。

显示模式控制:光标左移/右移、画面左移/右移。

光标移动指令和显示模式控制有和区别?请关注我,下回出解析。

void LCDInit()
{
	LCDWriteCmd(EDI8_DISTWO_57);//8位数据接口,2行显示,5*7点阵
	LCDWriteCmd(LCD_BIS);//显示开,光标关,不闪烁
	LCDWriteCmd(SUR_RIGHT);//光标右移,画面显示不移动
}

4.6位置函数

每个位置对应一个DDRAM地址,LCD1602两行显示,1行最大显示16字符

第一行DDRAM地址为00H~0FH,第二行DDRAM地址为40H~4FH。

字符要在某个位置显示,并不是直接调用DDRAM地址,而是用通过写命令的方式完成。

通过LCD1602命令表格,可以看出位置显示命令:DDRAM的8个二进制的最高位为1,其他位不变。

void LCDSetPosition(unsigned char x,unsigned char y) //位置函数  y:行  0-1
{                                                    //          x:列  0-15
	if(y==0)
	{
		LCDWriteCmd(0x80|x);
	}
	else
	{
		LCDWriteCmd(0x80|(x+0x40));
	}
}

4.7显示字符

显示"hello world":

#include "lcd1602.h"

void main()
{
	unsigned char str[]="hello world";
	LCDInit();//初始化
	while(1)
	{
		LCDShowStr(0,0,str);//在第0行第0列显示"hello world"
		//LCDShowStr(0,1,"hello world");
	}
}

五、结果展示

在第0行第0列开始显示字符串"hello world",显示一切正确。

下一文将着重 LCD1602四位接口,亲爱的读者敬请期待,下一文更精彩!!!

一日不读书,胸臆无佳想。我叫不白吃,喜欢我的,可以支持我,博主名叫@日月同辉,与我共生

@日月同辉,与我共生_单片机基础,单片机串口通信-CSDN博客@日月同辉,与我共生擅长单片机基础,单片机串口通信,等方面的知识,@日月同辉,与我共生关注stm32,c语言,51单片机,proteus,单片机领域.https://blog.csdn.net/LIN___IT?spm=1000.2115.3001.5343

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值