51单片机与LCD1602液晶显示屏的编程实现

      在嵌入式开发中,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显示控制提供帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值