51单片机接lcd1602原理图:单片机入门805189S52接入LCD
51单片机接lcd1602原理图:单片机入门805189S52接入LCDE:使能控制,实质上是相当时钟引脚。对LCD写数据和写命令,把数据或命令送到数据线后,E引脚接收到一个下降沿,才能把数据、命令送入1602。RW:这是读/写引脚,如果我们要在 LCD 上写入一些数据,我们将其设置为 0。如果我们从 LCD 模块读取,则将其设置为 1。一般设置为 0,因为我们不需要从 LCD 读取数据。我们可以将其分为五类,电源引脚、对比引脚、控制引脚、数据引脚和背光引脚。除了控制管脚外,所有管脚的名称和功能都一目了然,对于控制管脚有必要做一些说明:RS: RS 是寄存器选择引脚。如果我们要发送一些要在 LCD 上显示的数据,我们需要将其设置为 1。如果我们发送一些命令指令,例如清除屏幕(十六进制代码 01),我们会将其设置为 0。
前言显示单元是嵌入式工程和电子产品中最重要的输出设备。16x2 LCD 是最常用的显示单元之一。1602 LCD 表示有两行,每行可显示 16 个字符,每个字符在 LCD 上占用 5X7 矩阵空间。
在本文中,我们将1602 LCD 模块连接到 AT89S52单片机。AT89S52单片机接入LCD 对于新手来说可能看起来相当复杂,但在理解了这个概念之后,它就变得非常简单。这个过程需要一些时间,因为您需要了解 LCD 的 16 个引脚并将其连接到单片机。
认识1602 LCD1602管脚说明
那么首先让我们了解一下LCD模块的16个引脚。
我们可以将其分为五类,电源引脚、对比引脚、控制引脚、数据引脚和背光引脚。
除了控制管脚外,所有管脚的名称和功能都一目了然,对于控制管脚有必要做一些说明:
RS: RS 是寄存器选择引脚。如果我们要发送一些要在 LCD 上显示的数据,我们需要将其设置为 1。如果我们发送一些命令指令,例如清除屏幕(十六进制代码 01),我们会将其设置为 0。
RW:这是读/写引脚,如果我们要在 LCD 上写入一些数据,我们将其设置为 0。如果我们从 LCD 模块读取,则将其设置为 1。一般设置为 0,因为我们不需要从 LCD 读取数据。
E:使能控制,实质上是相当时钟引脚。对LCD写数据和写命令,把数据或命令送到数据线后,E引脚接收到一个下降沿,才能把数据、命令送入1602。
1602预设命令
1602 LCD 中有一些预设的命令指令,我们在下面的程序中使用它们来准备 LCD(在 lcd_init() 函数中)。下面给出一些重要的命令说明:
测试电路图及说明LCD与8051单片机接口的电路图如上图所示。
我们将 LCD 的数据引脚 (D0-D7) 连接到单片机的端口 2 (P2_0 – P2_7) 。并将控制引脚RS、RW和E分别连接到单片机的引脚12、13、14(端口3的引脚2、3、4)。
LCD的PIN 2(VDD)和PIN 15(背光电源)连接到电源(5v),PIN 1(VSS)和PIN 16(背光地)接地。
Pin 3(VEE)通过一个10k的可变电阻连接到电压(Vcc)以调节LCD的对比度。可变电阻的中间脚连接到 PIN 3,其他两个腿分别连接到电源和地。
测试程序正如前面关于命令模式和数据模式所介绍的那样,你可以看到:
在发送命令(函数 lcd_cmd)时,设置为
RS=0(RS=0 命令模式, RS=1 数据模式)
RW=0(RW=0 写模式, RW=1 读模式),
并且通过将 E 设为 1,然后将其设为 0,将高到低脉冲(下降沿)提供给 E .
此外,当向 LCD 发送数据(函数 lcd_data)时,设置为
RS=1,RW=0
并且通过将 E 设为 1 到 0 将高到低脉冲(下降沿)提供给 E。
延时函数 msdelay() 以毫秒为单位的延迟并且在程序中被频繁调用,延时函数的调用是为了让LCD模块有足够的时间来执行内部的操作和命令。
while循环打印字符串,每次调用lcd_data函数来打印一个字符,直到最后一个字符(空终止符-'\0')。
lcd_init() 函数通过预设命令(如上文所述)初始化 LCD。
//1602 LCD 与 8051 微控制器 (AT89S52) 接口的程序
#include<reg51.h>
#define display_port P2 //数据引脚连接到微控制器上的端口 2
sbit rs = P3^2; //RS 管脚连接到端口 3 的管脚 2
sbit rw = P3^3; // RW 引脚连接到端口 3 的管脚 3
sbit e = P3^4; //E管脚连接到端口3的管脚4
void msdelay(unsigned int time) // 以毫秒为单位的延迟函数。
{
unsigned i j ;
for(i=0;i<time;i )
for(j=0;j<1275;j );
}
void lcd_cmd(unsigned char command) //向LCD发送命令指令的函数
{
display_port = command;
rs = 0;
rw=0;
e=1;
msdelay(1);
e=0;
}
void lcd_data(unsigned char disp_data) //向LCD发送显示数据的函数
{
display_port = disp_data;
rs = 1;
rw=0;
e=1;
msdelay(1);
e=0;
}
void lcd_init() //初始化LCD
{
lcd_cmd(0x38); // 用于使用 2 行和 5X7 矩阵的 LCD
msdelay(10);
lcd_cmd(0x0F); // 打开显示,光标闪烁
msdelay(10);
lcd_cmd(0x01); //清屏
msdelay(10);
lcd_cmd(0x81); // 将光标移动到第 1 行的位置 1
msdelay(10);
}
void main()
{
unsigned char a[15]="Hello World!"; // 14 个字符的字符串,带有一个空终止符。
int i=0;
lcd_init();
while(a[i] != '\0') // 直到字符串中的空终止符
{
lcd_data(a[i]);
i ;
msdelay(50);
}
while(1);
}