在嵌入式开发中,51单片机是一款经典的微控制器,它广泛应用于各类电子项目中。LCD1602液晶显示屏作为一种常用的显示模块,具有良好的显示效果和较低的功耗,常用于显示字符、数字、图形等信息。本篇博文将介绍如何使用51单片机进行LCD1602液晶屏的控制与编程。
1. LCD1602简介
LCD1602是常见的1602字符型液晶显示屏,其中“16”表示显示屏可以显示16列字符,而“2”表示可以显示2行字符。LCD1602通常通过I2C或并行接口与单片机连接,但为了简化本文示例,我们将使用并行接口进行控制。
LCD1602内部有8个数据线(D0-D7)和控制线(RS、RW、E),其工作原理如下:
1.RS (Register Select): 选择指令寄存器或数据寄存器。
2.RW (Read/Write): 选择读或写操作。
3.E (Enable): 启动LCD显示的时钟信号。
4.D0-D7 (Data Lines): 数据传输线,用于发送或接收数据。
2. 硬件连接
连接方式
假设我们使用51单片机(如AT89C51)和LCD1602进行连接,硬件连接如下:
VSS:接地
VDD:接电源(通常为5V)
V0:接调节电位器,用于调整对比度
RS:连接到P2.0
RW:连接到P2.1
E:连接到P2.2
D0-D7:连接到P0.0 - P0.7(数据线)
LED+:接电源(+5V)
LED-:接地
3.LCD1602液晶的控制与初始化
初始化LCD1602
初始化液晶屏需要以下步骤:
设置控制寄存器:清除显示、关闭光标、选择字符模式等。
设置显示模式:如开启显示、光标控制、显示光标等。
在编程中,我们通常会设置LCD1602为4位数据模式,以减少所需的IO口数。在4位模式下,只使用数据线D4-D7来传输数据。
4.初始化函数
#include <reg51.h>
// 定义LCD1602的引脚连接
#define LCD_RS P2_0
#define LCD_RW P2_1
#define LCD_E P2_2
#define LCD_DATA P0
// 延时函数
void delay(unsigned int time)
{
unsigned int i, j;
for(i = 0; i < time; i++)
for(j = 0; j < 120; j++);
}
// 写指令
void LCD_Write_Command(unsigned char cmd)
{
LCD_RS = 0; // 选择指令寄存器
LCD_RW = 0; // 写操作
LCD_DATA = cmd; // 发送指令
LCD_E = 1; // 使能
delay(5); // 延时
LCD_E = 0; // 关闭使能
delay(5); // 延时
}
// 写数据
void LCD_Write_Data(unsigned char data)
{
LCD_RS = 1; // 选择数据寄存器
LCD_RW = 0; // 写操作
LCD_DATA = data; // 发送数据
LCD_E = 1; // 使能
delay(5); // 延时
LCD_E = 0; // 关闭使能
delay(5); // 延时
}
// LCD初始化
void LCD_Init()
{
delay(15); // 初始化延时
LCD_Write_Command(0x33); // 进入4位模式
LCD_Write_Command(0x32); // 继续4位模式设置
LCD_Write_Command(0x28); // 选择显示模式 4位,2行,5x8点阵
LCD_Write_Command(0x0C); // 开启显示,光标不显示
LCD_Write_Command(0x06); // 输入自增,光标右移
LCD_Write_Command(0x01); // 清屏
delay(5); // 清屏延时
}
4. 显示函数
显示字符
显示字符的函数会将字符发送到数据寄存器(通过RS引脚控制),然后LCD显示该字符。
void LCD_Display_Char(char ch)
{
LCD_Write_Data(ch); // 发送字符数据
}
void LCD_Display_String(char *str)
{
while(*str) // 逐个字符发送
{
LCD_Display_Char(*str);
str++;
}
}
设置光标位置
通过控制LCD1602的地址指针,可以将光标定位到指定的行和列。
void LCD_Set_Cursor(unsigned char row, unsigned char col)
{
unsigned char address;
if(row == 0)
address = 0x80 + col; // 第一行起始地址
else if(row == 1)
address = 0xC0 + col; // 第二行起始地址
LCD_Write_Command(address); // 设置光标位置
}
5. 完整代码示例
结合以上的初始化、显示字符及光标设置函数,下面是一个简单的示例程序,显示“Hello World!”:
#include <reg51.h>
#define LCD_RS P2_0
#define LCD_RW P2_1
#define LCD_E P2_2
#define LCD_DATA P0
void delay(unsigned int time)
{
unsigned int i, j;
for(i = 0; i < time; i++)
for(j = 0; j < 120; j++);
}
void LCD_Write_Command(unsigned char cmd)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_DATA = cmd;
LCD_E = 1;
delay(5);
LCD_E = 0;
delay(5);
}
void LCD_Write_Data(unsigned char data)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_DATA = data;
LCD_E = 1;
delay(5);
LCD_E = 0;
delay(5);
}
void LCD_Init()
{
delay(15);
LCD_Write_Command(0x33);
LCD_Write_Command(0x32);
LCD_Write_Command(0x28);
LCD_Write_Command(0x0C);
LCD_Write_Command(0x06);
LCD_Write_Command(0x01);
delay(5);
}
void LCD_Set_Cursor(unsigned char row, unsigned char col)
{
unsigned char address;
if(row == 0)
address = 0x80 + col;
else if(row == 1)
address = 0xC0 + col;
LCD_Write_Command(address);
}
void LCD_Display_Char(char ch)
{
LCD_Write_Data(ch);
}
void LCD_Display_String(char *str)
{
while(*str)
{
LCD_Display_Char(*str);
str++;
}
}
void main()
{
LCD_Init();
LCD_Set_Cursor(0, 0);
LCD_Display_String("Hello World!");
while(1);
}
6. 总结
通过本篇博文,我们详细介绍了如何使用51单片机控制LCD1602液晶显示屏。我们从硬件连接、LCD1602的初始化到显示字符的函数进行了全面的讲解。在实际应用中,可以根据项目需求灵活调整显示内容、行列、光标控制等功能。希望本文能为你在嵌入式开发中的LCD显示控制提供帮助。