stm32移植LCD2002驱动
介绍
LCD2002支持20X2个字符串显示,引脚功能和读写时序跟LCD1602都很像
-
LCD类型:字符点阵
-
点 阵 数:20×2
-
外形尺寸:116.0mm×37.0mm(长宽)
-
视域尺寸:83.0mm×18.6mm
-
点 距 离:0.05mm×0.05mm
-
点 大 小:0.65mm×0.6mm
-
控 制 器:SPLC780
-
玻璃类型:FSTN或STN
-
显示内容:20(例)×2(行)
-
背光类型:LED白光(白底黑字,蓝底白字)
-
数据传输:并口
-
工作电压:5V
LCD2002的应用场景有:
- 物联网数据采集端显示:展示传感器数值
- 工业自动化:电机控制展示信息
- 嵌入式场景:智能家居终端设备
引脚
LCD2002有16Pin引脚,每个引脚功能如下
| 管脚号 | 符号 | 功能 |
|---|---|---|
| 1 | Vss | 电源地( GND) |
| 2 | Vdd | 电源电压(+5V) |
| 3 | V0 | LCD 驱动电压(可调) |
| 4 | RS | 寄存器选择输入端,输入 MPU 选择模块内部寄存器类型信号: RS=0,当 MPU 进行写模块操作,指向指令寄存器; 当 MPU 进行读模块操作,指向地址计数器; RS=1,无论 MPU 读操作还是写操作,均指向数据寄存器 |
| 5 | R/W | 读写控制输入端,输入 MPU 选择读/写模块操作信号: R/W=0 读操作; R/W=1 写操作 |
| 6 | E | 使能信号输入端,输入 MPU 读/写模块操作使能信号: 读操作时,高电平有效;写操作时,下降沿有效 |
| 7 | DB0 | 数据输入/输出口, MPU 与模块之间的数据传送通道 |
| 8 | DB1 | 数据输入/输出口, MPU 与模块之间的数据传送通道 |
| 9 | DB2 | 数据输入/输出口, MPU 与模块之间的数据传送通道 |
| 10 | DB3 | 数据输入/输出口, MPU 与模块之间的数据传送通道 |
| 11 | DB4 | 数据输入/输出口, MPU 与模块之间的数据传送通道 |
| 12 | DB5 | 数据输入/输出口, MPU 与模块之间的数据传送通道 |
| 13 | DB6 | 数据输入/输出口, MPU 与模块之间的数据传送通道 |
| 14 | DB7 | 数据输入/输出口, MPU 与模块之间的数据传送通道 |
| 15 | A | 背光的正端+5V |
| 16 | K | 背光的负端 0V |
原装的LCD并没有焊接排针,需要自己手动焊接

移植
引脚定义,一般只需要用到以下13个Pin
#define LCD_RS_PIN GET_PIN(A, 4)
#define LCD_RW_PIN GET_PIN(A, 5)
#define LCD_E_PIN GET_PIN(A, 6)
#define LCD_D0_PIN GET_PIN(A, 7)
#define LCD_D1_PIN GET_PIN(B, 0)
#define LCD_D2_PIN GET_PIN(B, 1)
#define LCD_D3_PIN GET_PIN(B, 2)
#define LCD_D4_PIN GET_PIN(B, 10)
#define LCD_D5_PIN GET_PIN(B, 11)
#define LCD_D6_PIN GET_PIN(B, 12)
#define LCD_D7_PIN GET_PIN(B, 13)
#define LCD_V0 GET_PIN(B, 4)
#define LCD_BL GET_PIN(B, 5)
初始化LCD2002引脚
void LCD_GPIO_Init()
{rt_pin_mode(LCD_V0, PIN_MODE_OUTPUT);rt_pin_mode(LCD_BL, PIN_MODE_OUTPUT);rt_pin_mode(LCD_RS_PIN, PIN_MODE_OUTPUT);rt_pin_mode(LCD_RW_PIN, PIN_MODE_OUTPUT);rt_pin_mode(LCD_E_PIN, PIN_MODE_OUTPUT);rt_pin_mode(LCD_D0_PIN, PIN_MODE_OUTPUT);rt_pin_mode(LCD_D1_PIN, PIN_MODE_OUTPUT);rt_pin_mode(LCD_D2_PIN, PIN_MODE_OUTPUT);rt_pin_mode(LCD_D3_PIN, PIN_MODE_OUTPUT);rt_pin_mode(LCD_D4_PIN, PIN_MODE_OUTPUT);rt_pin_mode(LCD_D5_PIN, PIN_MODE_OUTPUT);rt_pin_mode(LCD_D6_PIN, PIN_MODE_OUTPUT);rt_pin_mode(LCD_D7_PIN, PIN_MODE_OUTPUT);
}
写数据
void LCD_WriteData(uint8_t data)
{rt_pin_write(LCD_RS_PIN, PIN_HIGH); rt_pin_write(LCD_RW_PIN, PIN_LOW); rt_pin_write(LCD_E_PIN, PIN_LOW); rt_pin_write(LCD_D0_PIN, (data & 0x01) ? PIN_HIGH : PIN_LOW);rt_pin_write(LCD_D1_PIN, (data & 0x02) ? PIN_HIGH : PIN_LOW);rt_pin_write(LCD_D2_PIN, (data & 0x04) ? PIN_HIGH : PIN_LOW);rt_pin_write(LCD_D3_PIN, (data & 0x08) ? PIN_HIGH : PIN_LOW);rt_pin_write(LCD_D4_PIN, (data & 0x10) ? PIN_HIGH : PIN_LOW);rt_pin_write(LCD_D5_PIN, (data & 0x20) ? PIN_HIGH : PIN_LOW);rt_pin_write(LCD_D6_PIN, (data & 0x40) ? PIN_HIGH : PIN_LOW);rt_pin_write(LCD_D7_PIN, (data & 0x80) ? PIN_HIGH : PIN_LOW);rt_pin_write(LCD_E_PIN, PIN_HIGH); rt_thread_mdelay(5); rt_pin_write(LCD_E_PIN, PIN_LOW);
}
写命令
void LCD_WriteCommand(uint8_t command)
{rt_pin_write(LCD_RS_PIN, PIN_LOW); rt_pin_write(LCD_RW_PIN, PIN_LOW); rt_pin_write(LCD_E_PIN, PIN_LOW); rt_pin_write(LCD_D0_PIN, (command & 0x01) ? PIN_HIGH : PIN_LOW);rt_pin_write(LCD_D1_PIN, (command & 0x02) ? PIN_HIGH : PIN_LOW);rt_pin_write(LCD_D2_PIN, (command & 0x04) ? PIN_HIGH : PIN_LOW);rt_pin_write(LCD_D3_PIN, (command & 0x08) ? PIN_HIGH : PIN_LOW);rt_pin_write(LCD_D4_PIN, (command & 0x10) ? PIN_HIGH : PIN_LOW);rt_pin_write(LCD_D5_PIN, (command & 0x20) ? PIN_HIGH : PIN_LOW);rt_pin_write(LCD_D6_PIN, (command & 0x40) ? PIN_HIGH : PIN_LOW);rt_pin_write(LCD_D7_PIN, (command & 0x80) ? PIN_HIGH : PIN_LOW);rt_pin_write(LCD_E_PIN, PIN_HIGH); rt_thread_mdelay(5); rt_pin_write(LCD_E_PIN, PIN_LOW);
}
设置光标位置
void LCD_SetCursor(uint8_t col, uint8_t row)
{uint8_t address = col;if (row == 1) {address += 0x40; }LCD_WriteCommand(0x80 | address);
}
绘制字符,需要配合LCD_SetCursor接口使用
void LCD_Print(char* str)
{while (*str) {LCD_WriteData(*str++);}
}
LCD初始化,设置清屏、光标位置自动累加等
void LCD_Init() {rt_pin_write(LCD_V0, PIN_HIGH);rt_pin_write(LCD_BL, PIN_HIGH);rt_thread_mdelay(15); LCD_WriteCommand(0x38);rt_thread_mdelay(5);LCD_WriteCommand(0x0c);rt_thread_mdelay(5);LCD_WriteCommand(0x06);rt_thread_mdelay(5);LCD_WriteCommand(0x01);rt_thread_mdelay(5);
}
测试用例,在屏幕第一行显示Levitation字样
static void lcd2002_entry(void* parameter)
{LCD_GPIO_Init();LCD_Init();LCD_WriteCommand( 0x80 ); LCD_SetCursor(5, 0);LCD_Print("Levitation");while(1) {rt_thread_mdelay(500);}
}int main()
{// lcd2002rt_thread_t lcd2002_thread = rt_thread_create("lcd2002", lcd2002_entry, RT_NULL, 512, 21, 20);if (lcd2002_thread != RT_NULL) {rt_thread_startup(lcd2002_thread);}while (1){rt_pin_write(LED0_PIN, PIN_HIGH);rt_thread_mdelay(10);rt_pin_write(LED0_PIN, PIN_LOW);rt_thread_mdelay(10);}return RT_EOK;
}
显示效果

总结
买的是5V供电的LCD2002,但它的数据引脚是可以兼容3.3V的GPIO的,详细可参考数据手册关于芯片引脚电气特性的说明

立创上面汉昇的LCD2002背光引脚BLK、BLA的说明是错误的

延申
BLA背光和V0对比度通过使用1KHz方波改变占空比可以实现背光和对比度的调节,可以节约硬件Bom成本,减少电位器的使用

相关文章:
stm32移植LCD2002驱动
介绍 LCD2002支持20X2个字符串显示,引脚功能和读写时序跟LCD1602都很像 LCD类型:字符点阵 点 阵 数:202 外形尺寸:116.0mm37.0mm(长宽) 视域尺寸:83.0mm18.6mm 点 距 离:0.05mm…...
RAG技术深度解析:从基础Agent到复杂推理Deep Search的架构实践
重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…...
OpenCV计算摄影学(18)平滑图像中的纹理区域同时保留边缘信息函数textureFlattening()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::textureFlattening 是 OpenCV 中用于图像处理的一个函数,旨在平滑图像中的纹理区域,同时保留边缘信息。该技术特别适…...
“此电脑”中删除WPS云盘方法(百度网盘通用)
📣此方法适用于卸载WPS云盘后,WPS云盘图标依然在此电脑中显示的问题。 原理:通过注册来进行删除 步骤: WIN键R,打开运行窗口,输入regedit命令,来打开【注册表编辑器】; 从左侧,依…...
Agent革命:Manus如何用工作流拆解掀起AI生产力革命
一、现象级产品的诞生背景 2025年3月6日,一款名为Manus的AI产品在技术圈引发地震式传播。其官方测试数据显示:在GAIA基准测试中,基础任务准确率达86.5%(接近人类水平),中高级任务完成率突破57%。这标志着A…...
四款GIS工具箱软件解析:满足企业多样化空间数据需求
概述 随着地理信息系统(GIS)在城市规划、环境监测、资源管理等领域的广泛应用,各种GIS工具箱软件不断涌现,为用户提供了强大的数据处理、空间分析和地图制图功能。本文将为大家介绍4款GIS工具箱软件,这些软件各具特色…...
nginx 配置403页面(已亲测)
问题:GET请求访问漏洞url即可看到泄露的内网ip 解决方式: 1.配置nginx 不显示真实Ip 2.限制接口只能是POST请求 具体配置: 编写一个403.html 在nginx的配置文件中,配置location参数: location /api/validationCode…...
After Effects的图钉与关键帧动画
姜 子 博 引言 在数字媒体时代,动态图形和视觉效果在信息传播和表达中扮演着越来越重要的角色。After Effects 作为行业领先的软件,提供了丰富的工具和功能,帮助用户创作出令人惊叹的视觉作品。图钉工具和关键帧动画是 AE 中实现复杂动画效…...
SAP DOI EXCEL宏的使用
OAOR里上传EXCEL模版 屏幕初始化PBO创建DOI EXCEL对象,并填充EXCEL内容 *&---------------------------------------------------------------------* *& Module INIT_DOI_DISPLAY_9100 OUTPUT *&--------------------------------------------…...
新编大学应用英语综合教程3 U校园全套参考答案
获取全套答案: 链接:https://pan.quark.cn/s/abaa0338724e...
高考數學。。。
2024上 具体来说,直线的参数方程可以写为: x1t y−t z1t 二、简答题(本大题共5小题,每小题7分,共35分。) 12.数学学习评价不仅要关注结果评价,也要关注过程评价。简要说明过程评价应关注哪几个方面。…...
STM32 子设备通过CAN发送数据到主设备
采集ADC、GPS经纬坐标、温湿度数据、大气压数据通过CAN方式发送给主设备端,帧ID按照如下定义: 我尼玛一个标准帧ID位数据是11位,扩展帧才是111829位,它说最开头的是四位是真类型,并给我如下解释: 它把帧的定…...
HCIA-IP路由动态-RIP
一、概念 动态路由是指路由器通过运行动态路由协议(RIP、OSPF等),自动学习和发现网络中的路由信息。路由器之间通过交换路由协议数据包,互相通告自己所知道的网络信息,从而构建和更新路由表。 二、RIP(路由信息协议)…...
CentOS7离线部署安装docker和docker-compose
CentOS7离线部署安装docker和docker-compose 安装包准备 docker下载地址、docker-compose下载地址 docker和docker-compose版本对应关系 注:本次安装部署选择的版本是 docker:docker-28.0.1.tgzdocker-compose:docker-compose-linux-x86_6…...
Sora与AGI的结合:从多模态模型到智能体推理的演进
全文目录: 开篇语前言前言:AGI的挑战与Sora的突破Sora的多模态学习架构:支撑智能体推理的基础1. **多模态学习的核心:信息融合与交叉理解**2. **智能体推理:从感知到决策** Sora如何推动AGI的发展:自主学习…...
Core Speech Kit(基础语音服务)
文章目录 一、Core Speech Kit简介场景介绍约束与限制二、文本转语音1. 场景介绍2. 约束与限制3. 开发步骤4. 设置播报策略设置数字播报策略插入静音停顿指定汉字发音5. 开发实例三、语音识别约束与限制开发步骤开发实例一、Core Speech Kit简介 Core Speech Kit(基础语音服务…...
VsCode 快捷键备忘
移动光标及选择文本 Ctrl ← / → :以单词为单位移动游标Home / End:光标移到行首/行位Ctrl Home / End:光标移到文件首和文件尾Ctrl Shift \:在匹配的分隔符之间跳转 配对的分隔符 是指分隔代码元素的字符,比如字…...
配置 Thunderbird 以使用 QQ 邮箱
配置 Thunderbird 以使用 QQ 邮箱 本片文章的操作系统为 windws 10 ,thunder bird 客户端版本为 128.7.1esr(64位)。注意到其他文章的图片中 thunder bird 的 ui 界面和我这个不一样,导致看起来不太方便,所以这里写一篇博客。不同版本的 thu…...
如何使用MyBatis进行多表查询
前言 在实际开发中,对数据库的操作通常会涉及多张表,MyBatis提供了关联映射,这些关联映射可以很好地处理表与表,对象与对象之间的的关联关系。 一对一查询 步骤: 先确定表的一对一关系确定好实体类,添加关…...
第六课:数据存储三剑客:CSV/JSON/MySQL
在Python的数据存储与处理领域,CSV、JSON和MySQL被广大开发者誉为“数据存储三剑客”。它们各自在不同的场景下发挥着重要作用,无论是简单的数据交换、轻量级的数据存储,还是复杂的关系型数据库管理,都能找到它们的身影。本文将详…...
Python通过SSH隧道访问数据库
本文介绍通过sshtunnel类库建立SSH隧道,使用paramiko通过SSH来访问数据库。 实现了两种建立SSH方式:公私钥验证、密码验证。 公私钥可读本地,也可读取Aws S3上的私钥文件。 本质上就是在本机建立SSH隧道,然后将访问DB转发到本地SS…...
Aws batch task 无法拉取ECR 镜像unable to pull secrets or registry auth 问题排查
AWS batch task使用了自定义镜像,在提作业后出现错误 具体错误是ResourceInitializationError: unable to pull secrets or registry auth: The task cannot pull registry auth from Amazon ECR: There is a connection issue between the task and Amazon ECR. C…...
立即释放 Mac 空间!Duplicate File Finder 8 重复文件高速清理工具
Duplicate File Finder 专业的 Mac 重复文件清理工具。查找并删除重复的文件、文件夹,甚至相似的照片。 不要让无用的文件占用磁盘上的宝贵空间。 整理你的 Mac。用最好的重复文件查找器来管理你的文件集合。 扫描任何磁盘或文件夹 主文件夹、照片/音乐库、外部磁…...
quillEditor 禁用复制粘贴图片,以及class转style等问题
<template><div><div class"search-term"><el-form :inline"true" :model"searchInfo" class"demo-form-inline"><el-form-item label"案例标题"><el-input v-model"searchInfo.titl…...
快速掌握EasyOCR应用实战指南
EasyOCR 是一个开源的、支持多语言(28种)和多文档格式(PDF/PNG/JPG/TIFF等)的 OCR(光学字符识别)工具库,由 Hugging Face 团队维护。其目标是简化 OCR 的开发流程,提供易用、高性能的…...
ubuntu22.04本地部署OpenWebUI
一、简介 Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台,旨在完全离线运行。它支持各种 LLM 运行器,如 Ollama 和 OpenAI 兼容的 API,并内置了 RAG 推理引擎,使其成为强大的 AI 部署解决方案。 二、安装 方法 …...
JavaScript(最后一个元素的索引就是数组的长度减 1)array.length - 1
在不同的编程语言中,表示数组中最后一个元素的方法略有不同,但基本思路都是利用数组的长度或索引来实现。 以下是一些常见编程语言中获取数组最后一个元素的方法: 1. JavaScript: 使用 array.length - 1 索引: 这是最常见和传统的方法。Java…...
【Leetcode 每日一题】2597. 美丽子集的数目
问题背景 给你一个由正整数组成的数组 n u m s nums nums 和一个 正 整数 k k k。 如果 n u m s nums nums 的子集中,任意两个整数的绝对差均不等于 k k k,则认为该子数组是一个 美丽 子集。 返回数组 n u m s nums nums 中 非空 且 美丽 的子集数…...
jupyter配置多个核心
CMD输入 先创建虚拟环境 "D:\Program Files\Python37\python.exe" -m venv myenv激活虚拟环境 myenv\Scripts\activate"D:\Program Files\Python37\python.exe" -m pip install ipykernel "D:\Program Files\Python37\python.exe" -m ipykern…...
【Linux系统编程】初识系统编程
目录 一、什么是系统编程1. 系统编程的定义2. 系统编程的特点3. 系统编程的应用领域4. 系统编程的核心概念5. 系统编程的工具和技术 二、操作系统四大基本功能1. 进程管理(Process Management)2. 内存管理(Memory Management)3. 文…...
