16x2字母数字LCD显示屏是爱好者和发烧友中最常用的显示屏。当您想向用户显示基本信息时,该显示非常有用,并且还可以帮助测试或调试我们的代码。这种特殊的16x2 LCD模块很容易获得,并且已经流行了很长时间。您可以在链接的文章中了解有关16x2 LCD模块基础知识的更多信息。
为了继续我们的STM8 Microcontroller系列教程,在本教程中,我们将学习如何将LCD与STM8 Microcontroller接口 。我们之前也已经将16x2 LCD与许多其他微控制器连接在一起,这些教程在下面列出,如果您感兴趣,可以进行检查。
如果您不熟悉STM8,请查阅STM8微控制器入门指南,了解控制器板和编程环境的基础知识。我们不会在本教程中介绍基础知识。
16x2 LCD显示器的工作
顾名思义,一个16x2的LCD将具有16列和2行。因此,总共,我们将能够在该显示器上显示32个字符,这些字符可以是字母,数字甚至符号。下面显示了我们在本教程中使用的一个简单的16x2 LCD引脚:
如您所见,显示器有16个引脚,我们可以将其分为五类,电源引脚,对比引脚,控制引脚,数据引脚和背光引脚,如下表所示。在讨论本教程的电路图时,我们将详细介绍每个引脚。
类别 | 销号 | 引脚名称 | 功能 |
电源引脚 | 1个 | VSS | 接地引脚,接地 |
2 | VDD或Vcc | 电压引脚+ 5V | |
对比针 | 3 | V0或VEE | 对比度设置,通过可变电阻连接至Vcc。 |
控制销 | 4 | RS | 寄存器选择引脚,RS = 0指令模式,RS = 1数据模式 |
5 | 读写器 | 读/写引脚,RW = 0,写模式,RW = 1,读模式 | |
6 | Ë | 启用,从高到低脉冲需要启用LCD | |
数据引脚 | 7-14 | D0-D7 | 数据引脚,存储要在LCD上显示的数据或命令指令 |
背光针 | 15 | LED +或A | 为背光+ 5V供电 |
16 | LED或K | 背光地 |
如下图所示,在LCD的背面,您会发现两个黑点,其中有HD44780 LCD驱动器IC(红色圆圈)。我们的微控制器应与此IC进行通信,后者又将控制LCD上显示的内容。如果您想知道所有这些功能的工作原理,请查看16x2 LCD显示器的工作原理,我们已经详细讨论了LCD的工作原理。
在本教程中,我们将讨论使用简单的 LCD_print _char和 LCD_print_string 命令在16x2 LCD显示器上显示字母数字字符(字母和数字)的电路图和代码。包含我们的头文件后,这些命令可以直接在程序中使用。头文件为您处理了所有大部分内容,因此不必强制要求了解显示器或HD44780驱动器IC的工作方式。
连接STM8微控制器LCD的电路图
下图提供了完整的STM8 LCD电路。如您所见,带LCD的STM8S103F3P6控制器的连接非常简单,我们将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的头文件
在开始电路图之前,让我们使用以下链接从GitHub获取STM8 LCD头文件:
STM8S 16x2 LCD头文件
您可以下载完整的存储库并获取 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_2 #define LCD_DB5 GPIOD,GPIO_PIN_2 #define LCD_DB6 GPIOD,GPIO_PIN_3 #define LCD_DB7 GPIOD,包括GPIO_st_4_st_LCD_b
接下来,在主程序中,我们声明了此示例代码所需的变量。我们有一个名为 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)表示第一行和第一Colum,类似地(2,12)表示第二行12列。请注意,如前所述,这里有2行16列。
Lcd_Begin(); Lcd_Clear(); 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”); delay_ms(5000);
延迟5秒后,我们再次清除LCD并在第一行中显示“ Circuit Digest”,在第二行中显示“ Test:”。
Lcd_Clear(); Lcd_Set_Cursor(1,1); Lcd_Print_String(“ Circuit Digest”); Lcd_Set_Cursor(2,1); Lcd_Print_String(“ Test:”);
在 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),因为我们已经在第二行中写了6个字符的“ Test:”。如果我们覆盖,则现有字符将在LCD上替换为新字符。我们还添加了1秒的延迟,并增加了变量。
Lcd_Set_Cursor(2,6); Lcd_Print_Char(d1); Lcd_Print_Char(d2); Lcd_Print_Char(d3); Lcd_Print_Char(d4); delay_ms(1000); test_var ++;
带有LCD的STM8 –工作
要测试我们的程序,只需将代码上传到我们的控制器,然后使用micro-USB端口为其加电。请注意,LCD需要5V的工作电压,因此必须通过USB端口为开发板供电。之前我们已经直接从ST-link为其供电,因为我们不需要5V电源。
如您所见,LCD正常工作,测试变量值大约每秒钟递增一次。另外,请注意,我们没有使用计时器,仅使用了延迟功能来创建此延迟,因此不要期望延迟持续时间是准确的,我们稍后将在另一个教程中使用计时器来实现此目的。
您可以在下面的视频中找到该项目的完整工作。希望您喜欢本教程并学到了一些有用的东西。如果您有任何疑问,请将其留在评论部分,或使用我们的论坛进行其他技术查询。