16x2 字母数字 LCD 显示屏是爱好者和爱好者中最常用的显示屏。当您想向用户显示基本信息时,显示非常有用,并且还可以帮助测试或调试我们的代码。这种特殊的 16x2 LCD 模块很容易获得,并且已经流行了很长时间。您可以在链接文章中了解有关16x2 LCD模块基础知识的更多信息。
为了继续我们的STM8 微控制器系列教程,在本教程中,我们将学习如何将 LCD 与 STM8 微控制器连接。
16x2 LCD 显示器的工作原理
顾名思义,16x2 LCD 将有 16 列和 2 行。所以总的来说,我们将能够在这个显示器上显示 32 个字符,这些字符可以是字母或数字,甚至是符号。我们在本教程中使用的一个简单的16x2 LCD 引脚如下所示 -
如您所见,显示器有 16 个引脚,我们可以将其分为五类,电源引脚、对比度引脚、控制引脚、数据引脚和背光引脚,如下表所示。在讨论本教程的电路图时,我们将详细介绍每个引脚。
在 LCD 的背面,如下图所示,你会发现两个黑点,里面是HD44780 LCD 驱动 IC(红色圈出)。我们的微控制器应该与这个 IC 通信,这反过来将控制 LCD 上显示的内容。如果您想知道这一切究竟是如何工作的,您应该查看16x2 LCD 显示器的工作原理,我们已经详细讨论了 LCD 的工作原理。
在本教程中,我们将讨论使用简单的 LCD_print_char和LCD_print_string命令在 16x2 LCD 显示器上显示字母字符(字母和数字)的电路图和代码。这些命令在包含我们的头文件后可以直接在程序中使用。头文件为您处理所有大部分内容,因此不必了解显示器或 HD44780 驱动 IC 的工作原理。
将 LCD 与 STM8 微控制器连接的电路图
完整的STM8 LCD 电路如下图所示。如您所见,STM8S103F3P6 控制器与 LCD的连接非常简单,我们将 LCD 显示器直接连接到我们的开发板,并且还连接了 ST-link 以对开发板进行编程。
电源管脚Vss和Vcc接STM8S板上的5V管脚,注意LCD的工作电压为5V,接上工作在3.3V。因此,即使 STM8S103F3P6 微控制器在 3.3V 上运行必须为 LCD 提供 5V 电源,您可以通过使用充电控制器 IC 来避免这种情况,但我们不会在本教程中讨论这个问题。
接下来,我们有用于设置 LCD 对比度的对比度引脚,我们将其连接到电位器,以便我们可以控制对比度。我们使用了 10k 电位器,但您也可以使用其他附近的值,电位器充当分压器,为对比度引脚提供 0-5 V,通常您也可以直接使用电阻器提供 2.2V 左右的合理对比度价值。然后我们有复位 (RS)、读/写 (RW) 和启用 (E) 引脚。读写引脚接地,因为我们不会从 LCD 读取任何内容,我们只会执行写入操作。另外两个控制引脚 Rs 和 E 分别连接到 PA1 和 PA2 引脚。
然后我们有数据引脚 DB0 到 DB7。16x2 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 欧姆的电阻作为限流电阻。ST-Link 编程器的连接方式与我们之前的教程一样。我在面包板上完成了完整的连接,我的设置如下图所示。
STM8 LCD 库——STM8S103F3P6 的头文件
您可以下载完整的 repo 并获取stm8s103_LCD_16x2.h文件,也可以简单地从上面的链接中获取代码。在设置项目时,请确保在 inc 目录中包含所有必需的头文件以及此头文件。
如果您不确定如何添加头文件和编译程序,请按照本页底部的视频进行操作。如果您对头文件中的代码如何工作感到好奇,您可以查看带有 LCD 教程的 PIC。这个项目中使用的头文件与那里解释的非常相似,所以我们不会详细介绍。
STM8S微控制器的LCD程序
为了演示,我们将对 STM8S 控制器进行编程以显示一个简单的字符串,例如“Circuit Digest”,然后我们将在第二行中每隔一秒增加一个“Test”值。完整的程序可以在本页底部找到。说明如下。
我们通过定义引脚并像往常一样添加所需的头文件来启动我们的程序。在我们上面讨论的电路图中,我们已将LCD_RS连接到 PA1,因此我们将其定义为LCD_RS GPIOA、GPIO_PIN_1。 同样,我们对其他引脚也做了同样的事情。如果它们遵循不同的电路,请确保相应地更改这些值。
#define LCD_RS GPIOA,GPIO_PIN_1
#define LCD_EN GPIOA, GPIO_PIN_2
#define LCD_DB4 GPIOD,GPIO_PIN_1
#define LCD_DB5 GPIOD,GPIO_PIN_2
#define LCD_DB6 GPIOD,GPIO_PIN_3
#define LCD_DB7 GPIOD,GPIO_PIN_4
#包括“STM8S.h”
#include “stm8s103_LCD_16x2.h”
接下来在我们的主程序中,我们声明了此示例代码所需的变量。我们有一个名为test_var 的测试变量,它被初始化为零,我们将增加变量并将其显示在 LCD 上。d1 到 d4 字符代表测试变量的 4 位,因为我们的 LCD 不能直接显示 int 值,我们必须将它们转换为字符。
//变量声明
int test_var = 0;
字符 d4,d3,d2,d1;
LCD_Begin () 函数用于初始化 LCD。该函数将初始化所有需要的 GPIO 引脚并将 LCD 设置为 16x2 LCD 模式。然后我们有LCD_Clear()函数,用于清除 LCD 上的所有值,这将擦除 LCD 上的所有内容,以便写入新值是干净的。然后我们有LCD_Set_Cursor(x,y)函数,其中 x 和 y 是我们需要写入新字符的位置。例如,(1,1) 表示第一行和第一列,同样,(2,12) 表示第二行 12 列,同样。请注意,如前所述,我们在这里有 2 行和 16 列。
液晶开始();
液晶清除();
Lcd_Set_Cursor(1,1);
现在,LCD 已设置、清除,并且光标在该位置。接下来是在屏幕上打印一些东西。我们可以使用LCD_Print_String(“Sample String”) 将字符串打印到 LCD 并使用 LCD_Print_Char(a)将字符值打印到 LCD。在我们的程序中,我们打印了“STM8S103F3P3 LCD”并使用以下代码创建了 5 秒的延迟。
Lcd_Print_String(“STM8S103F3P3 LCD”);
延迟毫秒(5000);
5 秒延迟后,我们再次清除 LCD,第一行显示“Circuit Digest”,第二行显示“Test:”。
液晶清除();
Lcd_Set_Cursor(1,1);
Lcd_Print_String(“电路文摘”);
Lcd_Set_Cursor(2,1);
Lcd_Print_String(“测试:”);
在while循环中,我们将整数变量test_var上的值拆分为单个字符,以便可以使用简单的除法和模数运算符将其显示在 LCD 上。我们还添加了“0”来将 ASCII 值转换为字符。
d4 = test_var%10 + ‘0’;
d3 = (test_var/10)%10 + ‘0’;
d2 = (test_var/100)%10 + ‘0’;
d1 = (test_var/1000) + ‘0’;
然后我们将光标设置为 (2,6),因为我们已经在第二行写了“Test:”,即 6 个字符。如果我们覆盖,现有字符将被 LCD 上的新字符替换。我们还添加了 1 秒的延迟并增加了变量。
Lcd_Set_Cursor(2,6);
Lcd_Print_Char(d1);
Lcd_Print_Char(d2);
Lcd_Print_Char(d3);
Lcd_Print_Char(d4);
延迟毫秒(1000);
测试变量++;
带 LCD 的 STM8 – 工作
要测试我们的程序,只需将代码上传到我们的控制器并使用微型 USB 端口为其供电。请注意,LCD 需要 5V 才能工作,因此必须从 USB 端口为电路板供电。我们之前直接从 ST-link 为其供电,因为我们不需要 5V 电源。
如您所见,LCD 按预期工作,测试变量值大约每秒递增一次。另外,请注意,我们没有使用计时器,只使用了延迟函数来创建此延迟,因此不要期望延迟持续时间是准确的,我们稍后将在另一个教程中使用计时器来实现此目的。
/*LCD --> STM8s
* LCD_RS --> PA1
* LCD_EN --> PA2
* LCD_DB4 --> PD1
* LCD_DB5 --> PD2
* LCD_DB6 --> PD3
* LCD_DB7 --> PD4
*/
#define LCD_RS GPIOA,GPIO_PIN_1
#define LCD_EN GPIOA, GPIO_PIN_2
#define LCD_DB4 GPIOD,GPIO_PIN_1
#define LCD_DB5 GPIOD,GPIO_PIN_2
#define LCD_DB6 GPIOD,GPIO_PIN_3
#define LCD_DB7 GPIOD,GPIO_PIN_4
#包括“STM8S.h”
#include “stm8s103_LCD_16x2.h”
主要的()
{
//变量声明
int test_var = 0;
字符 d4,d3,d2,d1;
液晶开始();
液晶清除();
Lcd_Set_Cursor(1,1);
Lcd_Print_String("STM8S103F3P3 LCD");
延迟毫秒(5000);
液晶清除();
Lcd_Set_Cursor(1,1);
Lcd_Print_String("电路文摘");
Lcd_Set_Cursor(2,1);
Lcd_Print_String("测试:");
而 (1)
{
d4 = test_var%10 + '0';
d3 = (test_var/10)%10 + '0';
d2 = (test_var/100)%10 + '0';
d1 = (test_var/1000) + '0';
Lcd_Set_Cursor(2,6);
Lcd_Print_Char(d1);
Lcd_Print_Char(d2);
Lcd_Print_Char(d3);
Lcd_Print_Char(d4);
延迟毫秒(1000);
测试变量++;
}
}
全部0条评论
快来发表一下你的评论吧 !