本文为博主 日月同辉,与我共生,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