使用单片机控制LCD显示屏

数字化生活设计师 2021-07-12 ⋅ 15 阅读

在嵌入式系统领域,使用单片机控制LCD显示屏是非常常见的应用之一。本文将介绍如何通过单片机控制LCD显示屏,并提供一个实例教程。

硬件准备

在开始之前,我们需要准备以下硬件设备:

  1. 单片机:这里我们以STM32F103系列为例,但其他单片机也可以使用相似的方法进行控制。
  2. LCD显示屏:这里我们选择一个常见的16×2字符LCD显示屏,但不同类型的LCD显示屏也可以使用相同的方法进行控制。
  3. 连接线:用于将单片机和LCD显示屏连接起来。

连接示意图

下图展示了单片机和LCD显示屏之间的连接方式:

            +---------------------------+
      VCC -| 1 Vcc                      |
      GND -| 2 GND                      |
       D7 -| 3 Vo                       |
       D6 -| 4 RS (Register Select)     |
       D5 -| 5 RW (Read/Write)           |
       D4 -| 6 E (Enable)                |
            |                            |
      D0-D3 -| 7-10 Data (DB0-DB3)        |
     D11-D14 -| 11-14 Data (DB4-DB7)      |
       LED +| 15 LED (Backlight)          |
            |                            |
            +----------------------------+

软件编程

在开始软件编程之前,我们需要先了解LCD显示屏的控制规则。这里我们选择的LCD显示屏使用4位数据总线,也就是只需要4根数据线进行数据传输。

在单片机的编程中,我们需要实现以下功能:

  1. 初始化LCD显示屏。
  2. 发送指令给LCD显示屏。
  3. 发送字符给LCD显示屏。

首先,我们需要在程序中定义控制引脚和数据引脚的GPIO端口和引脚号。然后,我们可以编写一个初始化函数来初始化LCD显示屏。

void LCD_Init(void)
{
    // 初始化控制引脚和数据引脚的GPIO端口和引脚号

    // 等待一段时间

    // 发送初始化指令给LCD显示屏
}

接下来,我们可以编写一个发送指令函数来向LCD发送指令。

void LCD_SendCommand(uint8_t command)
{
    // 将RS引脚设置为低电平,表示发送指令

    // 将数据分成高4位和低4位,然后分别发送

    // 发送使能信号

    // 再次发送使能信号,使LCD响应指令
}

最后,我们可以编写一个发送字符函数来向LCD发送字符。

void LCD_SendData(uint8_t data)
{
    // 将RS引脚设置为高电平,表示发送字符

    // 将数据分成高4位和低4位,然后分别发送

    // 发送使能信号

    // 再次发送使能信号,使LCD响应字符
}

现在,我们可以在主函数中调用这些函数来控制LCD显示屏。

int main(void)
{
    // 初始化单片机和LCD显示屏

    // 发送指令和字符给LCD显示屏

    while (1)
    {
        // 程序主循环
    }
}

实例教程

下面以一个实例来演示如何使用单片机控制LCD显示屏。假设我们需要在LCD显示屏上显示“Hello, World!”。

首先,我们需要定义连接引脚的GPIO端口和引脚号。这里假设我们使用的引脚分别是PC0、PC1、PC2、PC3和PB0、PB1、PB2、PB10,其中PC0-PC3用于控制引脚,PB0-PB10用于数据引脚。

#define LCD_RS_PORT GPIOC
#define LCD_RS_PIN GPIO_PIN_0

#define LCD_RW_PORT GPIOC
#define LCD_RW_PIN GPIO_PIN_1

#define LCD_EN_PORT GPIOC
#define LCD_EN_PIN GPIO_PIN_2

#define LCD_D4_PORT GPIOC
#define LCD_D4_PIN GPIO_PIN_3

#define LCD_D5_PORT GPIOB
#define LCD_D5_PIN GPIO_PIN_0

#define LCD_D6_PORT GPIOB
#define LCD_D6_PIN GPIO_PIN_1

#define LCD_D7_PORT GPIOB
#define LCD_D7_PIN GPIO_PIN_2

然后,我们可以编写一个初始化函数来初始化LCD显示屏。

void LCD_Init(void)
{
    // 初始化控制引脚和数据引脚的GPIO端口和引脚号
    HAL_GPIO_WritePin(LCD_RS_PORT, LCD_RS_PIN, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(LCD_RW_PORT, LCD_RW_PIN, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(LCD_EN_PORT, LCD_EN_PIN, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(LCD_D4_PORT, LCD_D4_PIN, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(LCD_D5_PORT, LCD_D5_PIN, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(LCD_D6_PORT, LCD_D6_PIN, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(LCD_D7_PORT, LCD_D7_PIN, GPIO_PIN_RESET);

    // 等待一段时间
    HAL_Delay(100);

    // 发送初始化指令给LCD显示屏
    LCD_SendCommand(0x28);  // 设置4位数据总线、2行显示、5×8点阵
    LCD_SendCommand(0x0C);  // 开启显示、光标不显示、光标闪烁
    LCD_SendCommand(0x06);  // 光标右移、字符不移动
    LCD_SendCommand(0x01);  // 清屏
}

接下来,我们可以编写一个发送指令函数来向LCD发送指令。

void LCD_SendCommand(uint8_t command)
{
    // 将RS引脚设置为低电平,表示发送指令
    HAL_GPIO_WritePin(LCD_RS_PORT, LCD_RS_PIN, GPIO_PIN_RESET);

    // 将数据分成高4位和低4位,然后分别发送
    HAL_GPIO_WritePin(LCD_D4_PORT, LCD_D4_PIN, (command >> 4) & 0x01);
    HAL_GPIO_WritePin(LCD_D5_PORT, LCD_D5_PIN, (command >> 5) & 0x01);
    HAL_GPIO_WritePin(LCD_D6_PORT, LCD_D6_PIN, (command >> 6) & 0x01);
    HAL_GPIO_WritePin(LCD_D7_PORT, LCD_D7_PIN, (command >> 7) & 0x01);

    // 发送使能信号
    HAL_GPIO_WritePin(LCD_EN_PORT, LCD_EN_PIN, GPIO_PIN_SET);
    HAL_Delay(1);
    HAL_GPIO_WritePin(LCD_EN_PORT, LCD_EN_PIN, GPIO_PIN_RESET);

    // 再次发送使能信号,使LCD响应指令
    HAL_GPIO_WritePin(LCD_EN_PORT, LCD_EN_PIN, GPIO_PIN_SET);
    HAL_Delay(1);
    HAL_GPIO_WritePin(LCD_EN_PORT, LCD_EN_PIN, GPIO_PIN_RESET);
}

最后,我们可以编写一个发送字符函数来向LCD发送字符。

void LCD_SendData(uint8_t data)
{
    // 将RS引脚设置为高电平,表示发送字符
    HAL_GPIO_WritePin(LCD_RS_PORT, LCD_RS_PIN, GPIO_PIN_SET);

    // 将数据分成高4位和低4位,然后分别发送
    HAL_GPIO_WritePin(LCD_D4_PORT, LCD_D4_PIN, (data >> 4) & 0x01);
    HAL_GPIO_WritePin(LCD_D5_PORT, LCD_D5_PIN, (data >> 5) & 0x01);
    HAL_GPIO_WritePin(LCD_D6_PORT, LCD_D6_PIN, (data >> 6) & 0x01);
    HAL_GPIO_WritePin(LCD_D7_PORT, LCD_D7_PIN, (data >> 7) & 0x01);

    // 发送使能信号
    HAL_GPIO_WritePin(LCD_EN_PORT, LCD_EN_PIN, GPIO_PIN_SET);
    HAL_Delay(1);
    HAL_GPIO_WritePin(LCD_EN_PORT, LCD_EN_PIN, GPIO_PIN_RESET);

    // 再次发送使能信号,使LCD响应字符
    HAL_GPIO_WritePin(LCD_EN_PORT, LCD_EN_PIN, GPIO_PIN_SET);
    HAL_Delay(1);
    HAL_GPIO_WritePin(LCD_EN_PORT, LCD_EN_PIN, GPIO_PIN_RESET);
}

现在,我们可以在主函数中调用这些函数来控制LCD显示屏。

int main(void)
{
    // 初始化单片机和LCD显示屏
    HAL_Init();
    LCD_Init();

    // 发送指令和字符给LCD显示屏
    LCD_SendCommand(0x80);  // 设置光标位置为第一行第一列
    for (int i = 0; i < 13; i++)
    {
        LCD_SendData("Hello, World!"[i]);
    }
    
    while (1)
    {
        // 程序主循环
    }
}

通过以上代码,我们可以将字符串“Hello, World!”显示在LCD显示屏上。

总结

本文介绍了如何使用单片机控制LCD显示屏,并提供了一个通过单片机向LCD显示屏发送指令和字符的实例教程。通过这个实例,读者可以更好地理解LCD显示屏的控制原理和具体操作方法。希望这篇教程对使用单片机控制LCD显示屏的读者们有所帮助。


全部评论: 0

    我有话说: