STM32 使用LCD1602简单显示字符
一、概述1. 功能说明本驱动适配 LCD1602 8 位并行模式完全对标原 51 单片机逻辑迁移至 STM32实现 LCD 初始化、清屏、指定坐标字符串打印硬件引脚固定 PB 组底层采用标准库 GPIO 操作不依赖 HAL 库。2. 硬件引脚映射表格LCD1602 信号 STM32 引脚 原 51 引脚 功能RS PB1 P2.6 寄存器选择0 命令1 数据RW PB2 P2.5 读写选择0 写1 读E PB0 P2.7 使能时钟上升沿锁存数据D0~D7 PB8~PB15 P0.0~P0.7 8 位并行数据总线3. 编译环境芯片STM32F10x大容量 / 中容量通用编译器Keil ARM V5驱动库STM32F10x_StdPeriph_Driver标准库通信模式默认 8 位并行可宏切换 4 位模式二、文件结构lcd1602.h宏定义、引脚配置、函数声明lcd1602.cGPIO 初始化、底层读写、业务功能实现三、头文件 lcd1602.h 说明1. 核心宏定义c运行// 接口模式 08位并口14位并口#define LCD1602_4OR8_DATA_INTERFACE 0// 控制端口GPIOB#define LCD_RS_PIN GPIO_Pin_1#define LCD_RW_PIN GPIO_Pin_2#define LCD_E_PIN GPIO_Pin_0#define LCD_CTRL_PORT GPIOB#define LCD_CTRL_RCC RCC_APB2Periph_GPIOB// 数据端口 PB8~PB15#define LCD_DATA_MASK GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15#define LCD_DATA_PORT GPIOB#define LCD_DATA_RCC RCC_APB2Periph_GPIOB2. 电平操作宏简化引脚高低电平控制替代重复GPIO_SetBits/ResetBitsc运行#define LCD_RS_H() GPIO_SetBits(LCD_CTRL_PORT, LCD_RS_PIN)#define LCD_RS_L() GPIO_ResetBits(LCD_CTRL_PORT, LCD_RS_PIN)#define LCD_RW_H() GPIO_SetBits(LCD_CTRL_PORT, LCD_RW_PIN)#define LCD_RW_L() GPIO_ResetBits(LCD_CTRL_PORT, LCD_RW_PIN)#define LCD_E_H() GPIO_SetBits(LCD_CTRL_PORT, LCD_E_PIN)#define LCD_E_L() GPIO_ResetBits(LCD_CTRL_PORT, LCD_E_PIN)3. 对外 API 声明c运行void lcd1602_gpio_init(void); // LCD引脚GPIO初始化void lcd1602_write_cmd(uint8_t cmd); // 写指令void lcd1602_write_data(uint8_t dat);// 写显示数据void lcd1602_init(void); // LCD整机初始化void lcd1602_clear(void); // LCD清屏void lcd1602_show_string(uint8_t x, uint8_t y, uint8_t *str); // 指定坐标显示字符串void delay_ms(uint32_t ms); // 毫秒延时文件内置简易循环延时四、源文件 lcd1602.c 功能详解1. 延时函数 delay_ms72MHz 系统时钟简易阻塞式毫秒延时仅用于 LCD 时序等待若工程存在全局SysTick/delay.c延时需删除本函数避免multiply defined链接报错。c运行void delay_ms(uint32_t ms){uint32_t i,j;for(i ms; i 0; i--)for(j 7200; j 0; j--);}2. GPIO 初始化 lcd1602_gpio_init开启 GPIOB 外设时钟PB0/PB1/PB2RS/RW/E配置 50MHz 推挽输出PB8~PB15 数据总线配置 50MHz 推挽输出上电默认拉低 RS、RW、E空闲状态。3. 底层数据输出静态函数 lcd_set_dataport适配硬件 D0 接 PB8、D7 接 PB15 的引脚布局将单字节 8 位数据左移 8 位输出到 PB8~PB15c运行static void lcd_set_dataport(uint8_t val){LCD_DATA_PORT-ODR ~(0xFF 8); // 清空PB8~PB15LCD_DATA_PORT-ODR | ((uint16_t)val 8); // 数据移位输出}4. 底层写指令 lcd1602_write_cmdRS0选择指令寄存器RW0 写模式E 引脚产生上升沿锁存指令8 位模式直接输出完整字节4 位模式分两次输出高 4 位、低 4 位。5. 底层写数据 lcd1602_write_dataRS1选择数据寄存器RW0 写模式时序逻辑与写命令一致用于输出 ASCII 显示字符。6. LCD 初始化 lcd1602_init上电初始化标准流程等待 20ms 稳定8 位模式指令0x382 行 5*7 点阵4 位模式0x280x0C开启显示关闭光标0x06写入字符后光标右移屏幕不滚动0x01清屏7. 清屏 lcd1602_clear发送指令0x01清空屏幕所有字符光标复位至第一行首位。8. 字符串显示 lcd1602_show_string参数规则x横向坐标 0~15y纵向坐标 0/1两行屏幕自动换行字符串超出本行 16 字符自动切换至另一行输出边界校验y1 或 x15 直接退出防止地址越界五、调用示例 main.cc运行#include lcd1602.hint main(void){lcd1602_init(); // 初始化LCD与GPIO// 第一行0坐标打印lcd1602_show_string(0,0,(uint8_t*)PB LCD1602 8bit);// 第二行1坐标打印lcd1602_show_string(1,1,(uint8_t*)StdLib No HAL);while(1){// 主循环}}六、编译报错解决方案1. L6200E delay_ms multiply defined故障lcd1602.c内置延时与工程 SysTick/delay.c 延时重定义解决删除lcd1602.c内delay_ms函数在lcd1602.h引入全局延时头文件#include Public/SysTick.h移除头文件内void delay_ms(uint32_t ms);声明。2. #1-D last line of file ends without a newline故障文件末尾无空行Keil 警告解决所有.h/.c文件末尾回车新增一行空白再保存。3. L6218E Undefined symbol delay_10us故障按键驱动调用微秒延时本驱动无该函数解决在 SysTick 驱动中补充delay_10us函数实现与声明按键头文件包含 SysTick.h。七、移植修改说明如需更换硬件引脚仅修改lcd1602.h内引脚宏控制端口LCD_CTRL_PORT、LCD_RS_PIN、LCD_RW_PIN、LCD_E_PIN数据端口LCD_DATA_PORT、LCD_DATA_MASK、LCD_DATA_RCC切换 4 位并行修改宏#define LCD1602_4OR8_DATA_INTERFACE 1八、详细代码#include lcd1602.h // 72MHz简易ms延时 void delay_ms(uint32_t ms) { uint32_t i,j; for(i ms; i 0; i--) for(j 7200; j 0; j--); } // IO初始化 void lcd1602_gpio_init(void) { GPIO_InitTypeDef gpio_cfg; RCC_APB2PeriphClockCmd(LCD_CTRL_RCC, ENABLE); // 控制脚 PB0 PB1 PB2 推挽输出 gpio_cfg.GPIO_Pin LCD_E_PIN | LCD_RS_PIN | LCD_RW_PIN; gpio_cfg.GPIO_Mode GPIO_Mode_Out_PP; gpio_cfg.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(LCD_CTRL_PORT, gpio_cfg); // 数据脚 PB8~PB15 推挽输出 gpio_cfg.GPIO_Pin LCD_DATA_MASK; gpio_cfg.GPIO_Mode GPIO_Mode_Out_PP; gpio_cfg.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(LCD_DATA_PORT, gpio_cfg); LCD_RS_L(); LCD_RW_L(); LCD_E_L(); } // 将8位数据输出到PB8~PB15D0→PB8D7→PB15 static void lcd_set_dataport(uint8_t val) { // 先清除PB8~PB15 LCD_DATA_PORT-ODR ~(0xFF 8); // val低8位移到PB8~PB15输出 LCD_DATA_PORT-ODR | ((uint16_t)val 8); } // 写命令 #if (LCD1602_4OR8_DATA_INTERFACE 0) void lcd1602_write_cmd(uint8_t cmd) { LCD_RS_L(); LCD_RW_L(); LCD_E_L(); lcd_set_dataport(cmd); delay_ms(1); LCD_E_H(); delay_ms(1); LCD_E_L(); } #else void lcd1602_write_cmd(uint8_t cmd) { LCD_RS_L(); LCD_RW_L(); LCD_E_L(); lcd_set_dataport(cmd 4); delay_ms(1); LCD_E_H(); delay_ms(1); LCD_E_L(); lcd_set_dataport(cmd 0x0F); delay_ms(1); LCD_E_H(); delay_ms(1); LCD_E_L(); } #endif // 写数据 #if (LCD1602_4OR8_DATA_INTERFACE 0) void lcd1602_write_data(uint8_t dat) { LCD_RS_H(); LCD_RW_L(); LCD_E_L(); lcd_set_dataport(dat); delay_ms(1); LCD_E_H(); delay_ms(1); LCD_E_L(); } #else void lcd1602_write_data(uint8_t dat) { LCD_RS_H(); LCD_RW_L(); LCD_E_L(); lcd_set_dataport(dat 4); delay_ms(1); LCD_E_H(); delay_ms(1); LCD_E_L(); lcd_set_dataport(dat 0x0F); delay_ms(1); LCD_E_H(); delay_ms(1); LCD_E_L(); } #endif // LCD初始化 #if (LCD1602_4OR8_DATA_INTERFACE 0) void lcd1602_init(void) { lcd1602_gpio_init(); delay_ms(20); lcd1602_write_cmd(0x38); lcd1602_write_cmd(0x0C); lcd1602_write_cmd(0x06); lcd1602_write_cmd(0x01); } #else void lcd1602_init(void) { lcd1602_gpio_init(); delay_ms(20); lcd1602_write_cmd(0x28); lcd1602_write_cmd(0x0C); lcd1602_write_cmd(0x06); lcd1602_write_cmd(0x01); } #endif // 清屏 void lcd1602_clear(void) { lcd1602_write_cmd(0x01); } // 显示字符串 x:0~15 y:0/1 void lcd1602_show_string(uint8_t x, uint8_t y, uint8_t *str) { uint8_t i 0; if(y 1 || x 15) return; if(y 0) { while(*str ! \0) { if(i 16 - x) lcd1602_write_cmd(0x80 i x); else lcd1602_write_cmd(0x80 0x40 i x - 16); lcd1602_write_data(*str); str; i; } } else { while(*str ! \0) { if(i 16 - x) lcd1602_write_cmd(0x80 0x40 i x); else lcd1602_write_cmd(0x80 i x - 16); lcd1602_write_data(*str); str; i; } } } #ifndef _LCD1602_H #define _LCD1602_H #include stm32f10x.h // 08位并口 14位并口 #define LCD1602_4OR8_DATA_INTERFACE 0 // 控制引脚映射 #define LCD_RS_PIN GPIO_Pin_1 #define LCD_RW_PIN GPIO_Pin_2 #define LCD_E_PIN GPIO_Pin_0 #define LCD_CTRL_PORT GPIOB #define LCD_CTRL_RCC RCC_APB2Periph_GPIOB // 数据引脚 PB8~PB15 对应D0~D7 #define LCD_DATA_MASK GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15 #define LCD_DATA_PORT GPIOB #define LCD_DATA_RCC RCC_APB2Periph_GPIOB // 控制电平宏 #define LCD_RS_H() GPIO_SetBits(LCD_CTRL_PORT, LCD_RS_PIN) #define LCD_RS_L() GPIO_ResetBits(LCD_CTRL_PORT, LCD_RS_PIN) #define LCD_RW_H() GPIO_SetBits(LCD_CTRL_PORT, LCD_RW_PIN) #define LCD_RW_L() GPIO_ResetBits(LCD_CTRL_PORT, LCD_RW_PIN) #define LCD_E_H() GPIO_SetBits(LCD_CTRL_PORT, LCD_E_PIN) #define LCD_E_L() GPIO_ResetBits(LCD_CTRL_PORT, LCD_E_PIN) // 函数声明 void lcd1602_gpio_init(void); void lcd1602_write_cmd(uint8_t cmd); void lcd1602_write_data(uint8_t dat); void lcd1602_init(void); void lcd1602_clear(void); void lcd1602_show_string(uint8_t x, uint8_t y, uint8_t *str); void delay_ms(uint32_t ms); #endif #include lcd1602.h int main(void) { lcd1602_init(); lcd1602_show_string(0,0,(uint8_t*)PB LCD1602 8bit); lcd1602_show_string(1,1,(uint8_t*)StdLib No HAL); while(1); }

相关新闻

coding-ethos 实战:把 AI 编码规则变成可回读的 policy 与 remediation

coding-ethos 实战:把 AI 编码规则变成可回读的 policy 与 remediation

AI 编码治理最容易漏掉的不是规则,而是规则执行后的证据。coding-ethos 把项目约束拆成 policy、agent、hooks 和 code-intel 四个可追踪部分:coding_ethos.yml 管机制,CODING_ETHOS.md 与 ETHOS.md 管规范,AGENTS.md 与 CLAUDE.m…

2026/8/7 0:29:13 阅读更多 →
Kimi正式发布首个开源2.8万亿大模型 K3, 与GPT-5.6和Fable 5处于同一梯队

Kimi正式发布首个开源2.8万亿大模型 K3, 与GPT-5.6和Fable 5处于同一梯队

7月16日晚上,月之暗面发布了Kimi K3,首个最大开源模型。2.8万亿参数,MoE架构,896个专家中每次激活16个,100万Token上下文,原生视觉理解。完整权重7月27日前开放。同一时间,WAIC 2026在上海布展完…

2026/8/4 23:40:16 阅读更多 →
免费B站视频下载工具DownKyi完整指南:从零开始掌握高效下载技巧

免费B站视频下载工具DownKyi完整指南:从零开始掌握高效下载技巧

免费B站视频下载工具DownKyi完整指南:从零开始掌握高效下载技巧 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印…

2026/8/7 18:32:17 阅读更多 →

最新新闻

HarmonyOS 7 / API 26 3DGS 重建会话卡住排查:进度、取消和后台恢复实战

HarmonyOS 7 / API 26 3DGS 重建会话卡住排查:进度、取消和后台恢复实战

HarmonyOS 7 / API 26 3DGS 重建会话卡住排查:进度、取消和后台恢复实战重建会话不是普通按钮点击 HarmonyOS 7 / API 26 的 3DGS 端侧重建属于很典型的长任务。它和普通页面请求不一样:普通请求失败了,大不了提示重试;重建任务一…

2026/8/8 14:01:22 阅读更多 →
3分钟搞定!APK Installer:Windows上安装安卓应用的终极解决方案

3分钟搞定!APK Installer:Windows上安装安卓应用的终极解决方案

3分钟搞定!APK Installer:Windows上安装安卓应用的终极解决方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想在Windows电脑上直…

2026/8/8 14:01:22 阅读更多 →
怎样从零开始组装你的Ender-3 3D打印机:5个实用步骤指南

怎样从零开始组装你的Ender-3 3D打印机:5个实用步骤指南

怎样从零开始组装你的Ender-3 3D打印机:5个实用步骤指南 【免费下载链接】Ender-3 The Creality3D Ender-3, a fully Open Source 3D printer perfect for new users on a budget. 项目地址: https://gitcode.com/gh_mirrors/en/Ender-3 如果你是3D打印新手&…

2026/8/8 14:01:22 阅读更多 →
校园IoT门禁电控一体化方案:破解高校安防漏洞与运维降本难题

校园IoT门禁电控一体化方案:破解高校安防漏洞与运维降本难题

一、前言 随着智慧校园数字化建设持续深耕,高校后勤管理逐步从人工粗放运维转向智能化、精细化、节能化管控。学生宿舍、教学教室、实训功能房作为校园核心高频场景,长期面临人员混杂、身份核验松散、用电隐患频发、运维成本居高不下等行业痛点。传统机械…

2026/8/8 14:01:22 阅读更多 →
3个核心技巧彻底解决G-Helper启动故障:从新手到专家的完整指南

3个核心技巧彻底解决G-Helper启动故障:从新手到专家的完整指南

3个核心技巧彻底解决G-Helper启动故障:从新手到专家的完整指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zen…

2026/8/8 14:01:22 阅读更多 →
5分钟学会小米手表表盘制作:免费可视化设计工具终极指南

5分钟学会小米手表表盘制作:免费可视化设计工具终极指南

5分钟学会小米手表表盘制作:免费可视化设计工具终极指南 【免费下载链接】Mi-Create Unofficial watchface creator for Xiaomi wearables ~2021 and above 项目地址: https://gitcode.com/gh_mirrors/mi/Mi-Create 厌倦了小米手表上千篇一律的默认表盘&…

2026/8/8 14:00:22 阅读更多 →

日新闻

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

当下AI应用飞速普及,无数企业下场搭建智能体系统,可落地阶段难题接踵而至:上下文无限堆积频繁爆栈、AI工具调用准确率低下、Token成本居高不下、企业数据权限混乱暗藏安全隐患……很多团队卡在架构搭建环节,空有前沿技术概念&…

2026/8/8 0:00:07 阅读更多 →
PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码 【免费下载链接】php-qrcode A PHP QR Code generator and reader with a user-friendly API. 项目地址: https://gitcode.com/gh_mirrors/ph/php-qrcode 在当今数字时代,二维码已…

2026/8/8 0:00:08 阅读更多 →
UniApp微信小程序隐私保护组件开发:从原理到实战

UniApp微信小程序隐私保护组件开发:从原理到实战

1. 项目缘起:为什么我们需要一个隐私保护通用组件?最近在维护一个基于uniapp开发的微信小程序矩阵时,我遇到了一个非常棘手的问题。随着平台对用户隐私保护的要求越来越严格,几乎每一个新版本发布,或者在某些特定机型&…

2026/8/8 0:00:08 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/8 8:58:26 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/7 23:24:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/7 17:02:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/7 23:54:54 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/7 17:02:36 阅读更多 →