woshi_ziyu
发表于: 2021-1-5 09:20:18 | 显示全部楼层

1602字符型LCD显示屏是电子爱好者和发烧友中最常用的显示屏。当您想向用户显示基本信息时,该显示屏非常有用,并且还可以帮助测试或调试我们的代码。这种特殊的16x2 LCD模块很容易获得,并且已经流行了很长时间。在本篇文章中,我们将学习如何将LCD与STM8单片机连接。


1602 LCD显示屏的工作原理

顾名思义,一个1602的LCD具有16列和2行。因此,总共,我们可以在该显示屏上显示32个字符,这些字符可以是字母、数字甚至符号。下面显示了我们在本文中使用的一个简单的1602 LCD的引脚:

16x2-LCD-Display.png


如您所见,显示器有16个引脚,我们可以将其分为五类,电源引脚、对比度引脚、控制引脚、数据引脚和背光引脚。


在下图中,您会在LCD的背面发现两个黑点,这些IC是HD44780 LCD驱动器。我们的微控制器应与此IC进行通信,后者又将控制LCD上显示的内容。

HD44780-LCD-driver-IC.jpg


在本篇文章中,我们将讨论连接电路图,以及使用LCD_print_char和LCD_print_string命令在1602 LCD显示屏上显示字母和数字的代码。在包含我们的头文件后,这些命令可以直接在程序中使用。头文件为您处理了所有大部分内容,因此不必强制要求了解显示屏或HD44780驱动器IC的工作方式。


STM8微控制器连接LCD的电路图

下图提供了完整的STM8 LCD电路。如您所见,STM8S103F3P6控制器与LCD的连接非常简单,我们将LCD显示屏直接连接到了面包板上,还连接了ST-link进行编程。

STM8-LCD-Circuit.png


电源引脚Vcc连接至STM8S开发板上的5V引脚,请注意LCD的工作电压为5V,并连接至工作电压为3.3V。

接下来,我们连接一个对比度引脚,用于设置LCD的对比度,我们已将其连接到电位器,以便我们可以控制对比度。我们使用了一个10k的电位器,该电位器充当一个分压器,向对比引脚提供0-5 V,通常您还可以直接使用一个电阻器提供2.2V左右的电压以获得合理的对比值。然后我们连接复位(RS)、读/写(RW)和使能(E)引脚。读写引脚接地,是因为我们不会从LCD读取任何内容,我们只会执行写操作。其他两个控制引脚Rs和E分别连接到PA1和PA2引脚。

然后,我们连接数据引脚DB0至DB7。 1602 LCD可以在两种模式下操作,一种是8位操作模式,其中我们必须使用LCD上的所有8个数据引脚(DB0-DB7),另一种是4位操作模式,我们只需要4种数据引脚(DB4-DB7)。通常使用4位模式,因为它需要来自控制器的GPIO引脚更少,因此我们在本教程中也使用了4位模式,并且仅将DB4、DB5、DB6和DB7引脚连接到PD1、PD2、PD3和PD4。

最后两个引脚BLA和BLK用于为内部背光LED供电,我们使用了560欧姆电阻作为限流电阻。我在面包板上建立了完整的连接,设置如下图所示。

Interface-LCD-with-STM8-Microcontroller.jpg


STM8 LCD库– STM8S103F3P6的头文件

在开始电路图之前,我们使用以下链接从GitHub获取STM8 LCD头文件:STM8S 16x2 LCD头文件


您可以下载完整的存储库并获取stm8s103_LCD_16x2.h文件,也可以通过上面的链接简化代码。设置项目时,请确保将所有必需的头文件以及此头文件都包含在inc目录中。

STM8-LCD-Header-File.png


STM8S单片机的LCD程序

为了演示,我们将对STM8S控制器进行编程,以显示一个简单的字符串,例如“ Circuit Digest”,然后在第二行中每隔一秒钟增加一次“ Test”值。


首先我们在代码中包含所需的头文件,并定义相关的引脚。在上面讨论的电路图中,我们已将LCD_RS连接到PA1,因此我们将其定义为LCD_RS GPIOA, GPIO_PIN_1。同样,我们对其他引脚也做了相同的操作。

  1. #define LCD_RS     GPIOA, GPIO_PIN_1
  2. #define LCD_EN      GPIOA, GPIO_PIN_2
  3. #define LCD_DB4    GPIOD, GPIO_PIN_1
  4. #define LCD_DB5    GPIOD, GPIO_PIN_2
  5. #define LCD_DB6    GPIOD, GPIO_PIN_3
  6. #define LCD_DB7    GPIOD, GPIO_PIN_4
  7. #include "STM8S.h"
  8. #include "stm8s103_LCD_16x2.h"
复制代码

接下来,在主程序中,我们声明了此示例代码所需的变量。我们有一个称为test_var的测试变量,该变量已初始化为零,我们将对该变量进行递增并将其显示在LCD上。字符d1至d4代表测试变量的4位数字,因为我们的LCD无法直接显示int值,因此必须将它们转换为字符。

  1. //Variable declarations
  2. int test_var = 0;
  3. char d4,d3,d2,d1;
复制代码

LCD_Begin()函数用于初始化LCD。此函数将初始化所有必需的GPIO引脚,并将LCD设置为16x2 LCD模式。然后,我们使用了LCD_Clear()函数,该函数用于清空LCD上的所有内容。然后,使用LCD_Set_Cursor(x,y)函数,其中x和y是我们需要写入新字符的位置。例如,(1,1)表示第一行和第一Colum,类似地(2,12)表示第二行12列。

  1. Lcd_Begin();
  2. Lcd_Clear();
  3. Lcd_Set_Cursor(1,1);
复制代码

现在,已经设置、清除LCD,并且光标位于该位置。接下来的事情是在屏幕上打印一些东西。我们可以使用LCD_Print_String(“Sample String”)在LCD上打印字符串,以及使用LCD_Print_Char(a) 在LCD上打印字符。在本文中,我们打印输出了“ STM8S103F3P3 LCD”,并创建了5秒的延迟。

  1. Lcd_Print_String("STM8S103F3P3 LCD");
  2. delay_ms(5000);
复制代码

延迟5秒后,我们再次清除LCD并在第一行中显示“ Circuit Digest”,在第二行中显示“ Test:”。

  1. Lcd_Clear();              
  2. Lcd_Set_Cursor(1,1);
  3. Lcd_Print_String("Circuit Digest");            
  4. Lcd_Set_Cursor(2,1);
  5. Lcd_Print_String("Test: ");
复制代码

在while循环内,我们将整数变量test_var上的值拆分为单个字符,以便可以使用简单的除法和模运算符将其显示在LCD上。我们还添加了“ 0”以将ASCII值转换为字符。

  1. d4 = test_var%10 + '0';
  2. d3 = (test_var/10)%10 + '0';
  3. d2 = (test_var/100)%10 + '0';
  4. d1 = (test_var/1000) + '0';
复制代码

然后,将光标设置为(2,6),因为我们已经在第二行中写了6个字符的“ Test:”。如果我们覆盖,则现有字符将在LCD上替换为新字符。我们还添加了1秒的延迟,然后增加变量。

  1. Lcd_Set_Cursor(2,6);
  2. Lcd_Print_Char(d1);
  3. Lcd_Print_Char(d2);
  4. Lcd_Print_Char(d3);
  5. Lcd_Print_Char(d4);                              
  6. delay_ms(1000);
  7. test_var++;
复制代码

STM8连接LCD的工作过程

要测试我们的程序,只需将代码上传到我们的控制器,然后使用micro-USB端口为其加电。请注意,LCD需要5V的工作电压,因此必须通过USB端口为开发板供电。

STM8-with-LCD.jpg


如您所见,LCD正常工作,测试变量值大约每秒钟递增一次。另外,请注意,我们没有使用计时器,仅使用了延迟函数来创建此延迟,因此不要期望延迟持续时间是准确的。


希望您喜欢本篇文章并学到了一些有用的东西。如果您有任何疑问,请随时在本帖下面进行回复。

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 12 | 回复: 16



手机版|

GMT+8, 2024-3-29 17:53 , Processed in 0.105371 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表