1.基础知识介绍
1.1、为什么叫1602
因为可以显示两行,一行16个
1.2、LCD1602管脚认识
编号 | 符号 | 引脚说明 |
---|---|---|
1 | VSS | 电源地 |
2 | VDD | 电源正极 |
3 | VEE | 液晶显示偏压信号 |
4 | RS | 数据/命令选择(H/L) |
5 | R/W | 读/写选择(H/L) |
6 | E | 使能端 |
7 | D0 | 数据 |
8 | D1 | 数据 |
9 | D2 | 数据 |
10 | D3 | 数据 |
11 | D4 | 数据 |
12 | D5 | 数据 |
13 | D6 | 数据 |
14 | D7 | 数据 |
1.3、LCD1602关键性指令设置
1.3.1、清屏指令
管脚 | 对应二进制 |
---|---|
RS | 0 |
R/W | 0 |
DB7 | 0 |
DB6 | 0 |
DB5 | 0 |
DB4 | 0 |
DB3 | 0 |
DB2 | 0 |
DB1 | 0 |
DB0 | 1 |
功能:
<1> 清除液晶显示器,即将 DDRAM 的内容全部填入"空白"的 ASCII
码 20H;
<2> 光标归位,即将光标撤回液晶显示屏的左上方;
<3> 将地址计数器(AC)的值设为 0。
1.3.2、模式选择指令
管脚 | 对应二进制 |
---|---|
RS | 0 |
R/W | 0 |
DB7 | 0 |
DB6 | 0 |
DB5 | 0 |
DB4 | 0 |
DB3 | 0 |
DB2 | 1 |
DB1 | I/D |
DB0 | S |
功能:
设定每次定入 1 位数据后光标的移位方向 , 并且设定每次写入的一个字符是否移动。参数设定的情况如下所示:
位名 | 设置 |
---|---|
I/D | 0=写入新数据后光标左移 |
I/D | 1=写入新数据后光标右移 |
S | 0=写入新数据后显示屏不移动 |
S | 1=写入新数据后显示屏整体右移 1 个字符 |
1.3.3、显示开关控制指令
管脚 | 对应二进制 |
---|---|
RS | 0 |
R/W | 0 |
DB7 | 0 |
DB6 | 0 |
DB5 | 0 |
DB4 | 0 |
DB3 | 1 |
DB2 | D |
DB1 | C |
DB0 | B |
功能:
功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。参数设定的情况如下:
位名 | 设置 |
---|---|
D | 0=显示功能关 |
D | 1=显示功能开 |
C | 0=无光标 |
C | 1=有光标 |
B | 0=光标闪烁 |
B | 1=光标不闪烁 |
设置完成之后,要判断液晶模块是否处于忙状态。
1.3.4功能设置指令
管脚 | 对应二进制 |
---|---|
RS | 0 |
R/W | 0 |
DB7 | 0 |
DB6 | 0 |
DB5 | 1 |
DB4 | DL |
DB3 | N |
DB2 | F |
DB1 | X |
DB0 | X |
功能:设定数据总线位数、显示的行数及字型。参数设定的情况如下:
位名 | 设置 |
---|---|
DL | 0=数据总线为 4 位 |
DL | 1=数据总线为 8 位 |
N | 0=显示 1 行 |
N | 1=显示 2 行 |
F | 0=5×7 点阵/每字符 |
F | 1=5×10 点阵/每字符 |
0x38:00111000,就是数据总线8位,显示两行,以5×7 点阵/每字符 进行显示。
2、程序解释
2.1、宏定义
头文件,宏定义,根据连接定义端口
#include <reg52.h>
#include <intrins.h>
//定义端口
sbit duan=P2^6;
sbit wei=P2^7;
sbit RS=P1^0;
sbit RW=P1^1;
sbit E=P2^5;
#define uchar unsigned char
#define uint unsigned int
#define Data P0 // 数据接在P0
#define RS_commad RS=0 //命令
#define RS_data RS=1 //数据
#define RS_write RW=0 //写
#define RS_read RW=1 //读
#define E_close E=0 //使能关
#define E_open E=1 //使能开
2.2 、延时部分(具体解释见之前的博客)
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<113;j++)
{
;
}
}
}
2.3、数码管关闭程序
在1602程序中需要调用数码管的程序,是因为其中的cmg函数用于关闭数码管,在LCD控制时需要先关闭数码管,避免两者的干扰。
void cmg ()
{
duan=1;
wei=1;
P0=0x00;
duan=0;
wei=0;
}
2.4、写命令
2.4.1、程序里面用到了延时,原因是在写命令时,需要给液晶一定的响应时间。如果没有延时,液晶可能无法正确地接收到指令,从而无法正常显示。一般情况下,液晶的响应时间为几微秒至几毫秒不等,具体时间取决于液晶型号和工作状态。这里的5毫秒延时是为了确保液晶能够正确地接收到指令。
2.4.2、nop
nop(); 是汇编指令,表示“空操作(no operation)”,也就是不执行任何操作,只是占用一个CPU周期。在这个代码中,可能是为了等待指令执行完毕,延长执行时间,确保程序的正确性。
void writecom (uchar command)
{
delay(10)
RS_command;
RW_write;
E_open;
Data=data;
_nop_();
E_close;
}
2.5、写数据
与上面写命令逻辑是相同的
void writedata (uchar da)
{
delay(10);
RS_data;
RW_write;
E_open;
Data=da;
_nop_();
E_close;
}
2.6、写字符
先进行写命令,让它写在哪一行,之后写入数据。x,y代表横纵坐标
void writechar(uchar x,uchar y,uchar c)
{
if (y==0)
{
writecom(0x80+x);//10000000,写在第一行
}
else
{
writecom(0xc0+x);
}
writedata(c);
}
2.7、写字符串
与写字符的区别在于,字符串是很多构成的所以说要进行循环,不断写,直到写完,跳出循环。
void writestring(uchar x,uchar y,uchar *s)
{
if (y==0)
{
writecom(0x80+x);//10000000,写在第一行
}
else
{
writecom(0xc0+x);
}
while(*s)
{
writedata(*s);
s++;
}
}
2.8、初始化
主要参照我上面列出的表格,确定LCD的显示模式,例如设置光标,以及光标移不移动,等等。
设置显示模式需要发送三次指令0x38,每次发送可以确保指令被正确接收。0x38表示设置显示模式为8位数据总线,2行显示,5x7点阵字符,这是一种常用的基本显示模式。
void Init()
{
cmg();
delay(10);
writecom(0x38); //设置显示模式
writecom(0x38);
writecom(0x38);
writecom(0x0e); //显示开关控制,显示功能开,有光标, 光标不闪烁
writecom(0x06); // 写入数据光标右移,显示屏不移动
writecom(0x01); //清屏
}
2.9、主函数
进行初始化,调用写字符和字符串进行写入显示
void main()
{
Init();
while(1)
{
writechar(1,0,'d'); //第一行1位置上写字符d
writechar(2,0,'a'); // 第一行位2置上写字符a
writestring(3,0,"npianji");
writestring(1,1,"tainanle");
}
}
3、完整代码文章来源:https://www.toymoban.com/news/detail-468800.html
#include <reg52.h>
#include <intrins.h>
//定义端口
sbit duan=P2^6;
sbit wei=P2^7;
sbit RS=P1^0;
sbit RW=P1^1;
sbit E=P2^5;
#define uchar unsigned char
#define uint unsigned int
#define Data P0 // 数据接在P0
#define RS_command RS=0 //命令
#define RS_data RS=1 //数据
#define RW_write RW=0 //写
#define RW_read RW=1 //读
#define E_close E=0 //使能关
#define E_open E=1 //使能开
//延时部分
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<113;j++)
{
;
}
}
}
//数码管部分,注意是关数码管
void cmg ()
{
duan=1; //段开启
wei=1;
P0=0x00;
duan=0;
wei=0;
}
//写命令
void writecom (uchar command)
{
delay(10);
RS_command;
RW_write;
E_open;
Data=command;
_nop_();
E_close;
}
//写数据
void writedata (uchar da)
{
delay(10);
RS_data;
RW_write;
E_open;
Data=da;
_nop_();
E_close;
}
//写字符 (确定坐标)
void writechar(uchar x,uchar y,uchar c)
{
if (y==0)
{
writecom(0x80+x);//10000000,写在第一行
}
else
{
writecom(0xc0+x);
}
writedata(c);
}
//写字符串
void writestring(uchar x,uchar y,uchar *s)
{
if (y==0)
{
writecom(0x80 + x);//10000000,写在第一行
}
else
{
writecom(0xc0+x);
}
while(*s)
{
writedata(*s);
s ++;
}
}
//初始化
void Init()
{
cmg();
delay(15);
writecom(0x38); //设置显示模式
writecom(0x38);
writecom(0x38);
writecom(0x0e); //显示开关控制,显示功能开,有光标, 光标不闪烁
writecom(0x06); // 写入数据光标右移,显示屏不移动
writecom(0x01); //清屏
}
//主函数
void main()
{
Init();
while(1)
{
writestring(1,0,"danpianji");
writestring(1,1,"tainanle");
}
}
4、运行结果
猜猜运行结果是什么
文章来源地址https://www.toymoban.com/news/detail-468800.html
到了这里,关于单片机——LCD1602的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!