对于任何微控制器项目,将显示单元与它连接将使项目更容易,并吸引用户与之交互。微控制器最常用的显示单元是 16×2 字母数字显示器。这些类型的显示器不仅可用于向用户显示重要信息,还可以在项目的初始开发阶段充当调试工具。因此,在本教程中,我们将学习如何将16×2 LCD显示器与STM32F103C8T6STM32开发板连接,并使用Arduino IDE对其进行编程。
所需材料
STM32蓝丸开发板
16×2 液晶显示屏
FTDI 程序员
连接线
液晶显示器
16×2 点阵 LCD 显示屏简介
如前所述,Energia IDE提供了一个漂亮的库,使接口变得轻而易举,因此不一定要了解显示模块的任何信息。但是,展示我们正在使用的东西不是很有趣吗!!
名称 16×2 意味着显示器有 16 列和 2 行,它们一起 (16*2) 形成 32 个框。一个盒子在下图中看起来像这样
单个框有 40 个像素(点),矩阵顺序为 5 行 8 列,这 40 个像素共同构成一个字符。同样,可以使用所有框显示 32 个字符。现在让我们看一下引脚排列。
LCD共有16个引脚,如上图所示,它们可以分为四组,如下所示
源引脚(1、2 和 3):这些引脚为显示器提供功率和对比度水平
控制引脚(4、5 和 6):这些引脚设置/控制LCD接口IC中的寄存器(更多信息可在下面的链接中找到)
数据/命令引脚(7 至 14):这些引脚提供LCD上应显示哪些信息的数据。
LED 引脚(15 和 16):如果需要,这些引脚用于照亮LCD的背光(可选)。
电路图和连接
16*2点阵LCD与STM32F103C8T6 STM32蓝色药丸板接口的电路图如下所示。它是使用弗里辛软件制作的。
如您所见,完整的连接是通过面包板进行的。我们需要一个FTDI板来对STM32微控制器进行编程。因此,与我们之前的教程类似,我们将FTDI板连接到STM32,FDTI编程器的Vcc和接地引脚分别连接到STM32的5V引脚和接地引脚。这用于为STM32板和LCD供电,因为两者都可以接受+5V。FTDI 板的 Rx 和 Tx 引脚连接到 STM9 的 A10 和 A32 引脚,因此我们可以直接对电路板进行编程,而无需引导加载程序。
接下来,液晶屏必须连接到STM32板。我们将在4位模式下使用LCD,因此我们必须将4个数据位引脚(DB4至DB7)和两个控制引脚(RS和EN)连接到STM32板,如上面的STM32F103C8T6 LCD接口电路图所示。此外,下表将帮助您建立连接。
液晶屏引脚编号 | 液晶屏引脚名称 | STM32 引脚名称 |
1 | 地面(锭) | 地面 (G) |
2 | 可变资本公司 | 5V |
3 | 维伊 | 地面 (G) |
4 | 寄存器选择 (RS) | PB11 |
5 | 读/写 (RW) | 地面 (G) |
6 | 启用 (英文) | PB10 |
7 | 数据位 0 (DB0) | 无连接(常闭) |
8 | 数据位 1 (DB1) | 无连接(常闭) |
9 | 数据位 2 (DB2) | 无连接(常闭) |
10 | 数据位 3 (DB3) | 无连接(常闭) |
11 | 数据位 4 (DB4) | PB0 |
12 | 数据位 5 (DB5) | PB1 |
13 | 数据位 6 (DB6) | 电脑13 |
14 | 数据位 7 (DB7) | 电脑14 |
15 | 正极指示灯 | 5V |
16 | 负极指示灯 | 地面 (G) |
连接完成后,我们可以打开Arduino IDE并开始编程。
使用 Arduino 对 LCD 的 STM32 进行编程
如本教程所述,我们将使用Arduino IDE对STM32微控制器进行编程。但是,默认情况下,Arduino IDE不会安装STM32板,因此我们必须下载一个软件包并为此准备Arduino IDE。
一旦STM32板卡安装在Arduino IDE中,我们就可以开始编程了。该程序与Arduino板非常相似,唯一会改变的是引脚名称,因为STM32和Arduino的符号不同。完整的程序在本页末尾给出,但为了解释该程序,我将其拆分为有意义的小片段,如下所示。
使用Arduino对我们的微控制器进行编程的一个显着优势是Arduino为几乎所有著名的传感器和执行器提供了现成的库。因此,在这里,我们通过包含LCD库来启动我们的程序,这使编程变得更加容易。
#include // include the LCD library
在下一行中,我们必须指定已将LCD显示控件和数据线连接到STM32的GPIO引脚。为此,我们必须检查我们的硬件,为方便起见,您还可以参考顶部给出的表格,其中列出了 LCD 与 STM32 的 GPIO 引脚的引脚名称。提到引脚后,我们可以使用液晶功能初始化LCD。我们还将我们的LCD命名为“LCD”,如下所示。
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; //mention the pin names to with LCD is connected to
LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //Initialize the LCD
接下来,我们进入设置功能。在这里,我们首先提到我们使用的LCD类型。由于它是 16*2 LCD,我们使用 lcd.begin(16,2) 行。void 设置函数中的代码只执行一次。因此,我们使用它来显示一个介绍文本,该文本在屏幕上显示 2 秒钟,然后被清除。要提及文本必须出现的位置,我们使用函数lcd.setcursor,并使用lcd.print函数打印文本。例如,lcd.setCursor(0,0) 会将光标设置在我们打印“接口 LCD”的第一行和第一列,函数 lcd.setCursor (0,1) 将光标移动到第二行第一列,我们在其中打印“CircuitDigest”行。
void setup() { lcd.begin(16, 2);//We are using a 16*2 LCD lcd.setCursor(0, 0); //At first row first column lcd.print("Interfacing LCD"); //Print this lcd.setCursor(0, 1); //At secound row first column lcd.print("-CircuitDigest"); //Print this delay(2000); //wait for two secounds lcd.clear(); //Clear the screen }
显示介绍文本后,我们通过创建延迟来保持程序 2 秒,以便用户可以阅读介绍消息。此延迟由行延迟 (2000) 创建,其中 2000 是以磨机秒为单位的延迟值。延迟后,我们使用lcd.clear()函数清除LCD,该函数通过删除LCD上的所有文本来清除LCD。
最后在空循环中,我们在第一行显示“STM32 – Blue Pill”,在第二行显示秒值。秒的值可以从 millis() 函数中获得。millis() 是一个计时器,从 MCU 通电时开始递增。该值以毫秒的形式出现,因此我们在将其显示在LCD上之前将其除以1000。
void loop() {
lcd.setCursor(0, 0); //At first row first column
lcd.print("STM32 -Blue Pill"); //Print this
lcd.setCursor(0, 1); //At secound row first column
lcd.print(millis() / 1000); //Print the value of secounds
}
将程序上传到STM32F103C8T6板
按照电路图中所示进行连接,并在Arduino IDE上使用下面给出的代码。转到工具并确保在入门教程中选择了正确的板。此外,在上传程序之前,请确保将启动 0 跳线设置为 1,如下图所示,然后按重置按钮。按下上传按钮时,应上传代码,消息将显示在LCD上,如下图所示。
在工作模式下验证输出
如上一段所述,您应该能够在上传代码后立即注意到输出。但是下次上电时,该程序将不起作用,因为电路板仍处于编程模式。因此,一旦程序上传,启动 0 上的跳线应更改回 0 位置,如下所示。此外,由于程序已经上传到STM32板,我们不需要FTDI板,整个设置可以通过STM32板的micro-USB端口供电,如下所示。
这只是一个简单的接口项目,以帮助将LCD显示器与STM32板一起使用,但您可以进一步使用它来构建很酷的项目。希望您理解本教程并从中学到一些有用的东西。
/*
Program to test 16*2 Alaphanumeric LCD with STM32 (Blue Pill)
The circuit:
* LCD RS pin to digital pin PB11
* LCD Enable pin to digital pin PB10
* LCD D4 pin to digital pin PB0
* LCD D5 pin to digital pin PB1
* LCD D6 pin to digital pin PC13
* LCD D7 pin to digital pin PC14
* LCD R/W pin to ground
* LCD VSS pin to ground
* LCD VCC pin to 5V
*/
#include // include the LCD library
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; //mention the pin names to with LCD is connected to
LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //Initialize the LCD
void setup() {
lcd.begin(16, 2);//We are using a 16*2 LCD
lcd.setCursor(0, 0); //At first row first column
lcd.print("Interfacing LCD"); //Print this
lcd.setCursor(0, 1); //At secound row first column
lcd.print("-CircuitDigest"); //Print this
delay(2000); //wait for two secounds
lcd.clear(); //Clear the screen
}
void loop() {
lcd.setCursor(0, 0); //At first row first column
lcd.print("STM32 -Blue Pill"); //Print this
lcd.setCursor(0, 1); //At secound row first column
lcd.print(millis() / 1000); //Print the value of secounds
}