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);
测试变量++;
}
}
这里还没有内容,您有什么问题吗?
电子电路资源推荐
- 电磁兼容原理、技术及应用(第2版)
来源:下载中心
- AD个人封装库:常用元件原理图库
来源:下载中心
- 信号完整性及高速数字电路设计
来源:大学堂
- 高频电子线路
来源:大学堂
- 戴维宁定理:概念介绍及其求解过程
来源:电路图
- 单片机运行原理的一点点总结
来源:电路图
推荐帖子 最新更新时间:2024-11-21 19:54
- 《小水电站自动控制》项目总结
- 一、项目背景 本项目是在原有的《小水电站远程控制》项目基础上实施的,远程控制是通过互联网摄像机远程查看水位情况,然后用手机 APP 通过网络继电器来控制水轮发电机组进水闸门的开大或者关小。相关的电气、机械部分是早已完成了的,本项目是在原来的基础上增加单片机控制模块,自动根
- hujjGD32 MCU
- 【RT-Thread软件包应用作品】多功能天气时钟
- 多功能天气时钟-微信小程序版 一、项目背景 在不久前的一个早晨,我被一阵闹铃叫醒后,像往常一样去上班,到公司后发现很多同事都带了伞,于是乎打开了兜里的砖块 ( 手机 ) ,晚上回去的时候果然被淋了,虽然雨不是很大,但是被淋总是不爽,于是乎开始思考是否能做一个
- 一叶孤沙实时操作系统RTOS
- 有关mw5.0,directshow中NondelegatingRelease问题
- 请问,我在debug下就出现1个问题:error LNK2001: unresolved external symbol public: virtual unsigned long __cdecl CBaseFilter::NonDelegatingRelease(void) (
- beyondaymk嵌入式系统
- 请教这个升压电路的原理
- 下面的这个电路图能实现5V升压至12V的么 什么原理呢,请教各位老师分析一下 请教这个升压电路的原理 『下面的这个电路图能实现5V升压至12V的么』 可以实现,但该电路效率较低(费电)。 此电路,L1Q2D1C2构成典型的Boost电路。 Q2Q
- kal9623287电源技术
- 恭喜自己在eeworld上总分突破3000,同时感谢广大网友的慷慨给分,特散分!
- 从2008年10月20日第一次有网友结贴给我分,实现了0的突破,也在此时我才知道有结贴给分一说,在短短两个月内,我的技术总分上升到了3000分,在这里感谢大家 由于我的可用分并不多,所以只能散200分了,下次有机会再散 希望我们的论坛人气越来越旺! 恭喜自己在eeworld上总
- ljm362430嵌入式系统
- UWB背景信息介绍(上)
- 我们可以说UWB是当今最好、最先进的定位技术,但证据呢?要回答这个问题,我们需要透过现象看本质。本文将探讨UWB技术的内部工作原理,并概述UWB和窄带定位方法之间的差异。 UWB与窄带进行比较 适用于室内和室外定位应用的技术有多种,但UWB最精确、最可靠且最具成本效益;通常
- btty038RF/无线
- 2407有没有什么指令可以用来开根号???
- EI检索
- Ram start overlaps rom binary在PB定制的时候出现的错误
- 要不要从单片机转Linux?进来看看大神怎么说
- 单片机的内部、外部结构(一)
- 求关于硬件编程方面的教材资料
- 电力拖动自动控制系统—运动控制系统(陈伯时)
- LDO的输出需不需要电容呢?
- 继电器的使用工作原理和具体应用
- 日本常用三极管
- 红外遥控
- 【DigiKey“智造万物,快乐不停”创意大赛】开箱——树莓派4B和PicoW
- PCB设计
- 废物利用充电保护板
- s3c44B0 LCD显示应用程序,汉字从右向左滚动显示时,屏幕会有明显闪烁,不明原因~~~
- Realtek蓝牙Android10.0移植结束后的基本测试和常见问题分析
- TI CC3200 WIFI实训开发套件(OURS-SDK-WFB调试2—对IAR for ARM的熟悉.
- 比赛已经结束了,但疑问还在继续......
- 建立socket失败,系统资源用完,这个是什么原因啊,如何处理?
- 对stm32f的一点期待:从32768PLL出48/72MHz主频。
- Glasgow Interface Explorer:探索数字接口的工具
- ST25R3916高性能NFC通用设备的EMVCo参考设计
- LTC2450 易于使用的超微型 16 位 Delta Sigma ADC 的典型应用
- 使用 ROHM Semiconductor 的 BU4948 的参考设计
- rtl8723bs-SD-TF扩展板
- STM32G474RE MCU的探索套件
- TAR5S46U 点稳压器(低压差稳压器)的典型应用
- LT1952EGN 36V 至 72V 输入至 12V 在 20A 无(光耦合器)同步总线转换器的典型应用电路
- EVL6562A-35WFLB,使用 L6562A 35W 宽范围高功率因数反激式转换器的评估板
- 具有反向电池和太阳能电池板保护的 LTC4367IMS8 系列迟滞太阳能充电器的典型应用