首页/新闻资讯/正文详情

STM32 使用LCD1602简单显示字符

发布时间:2026/11/14 18:09:25 来源:云帆数科 栏目:资讯中心
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/10/1 12:10:54

从“开窍”到认知觉醒:底层生命体验的社会学意义与阶层认知重构
从“开窍”到认知觉醒:底层生命体验的社会学意义与阶层认知重构

从“开窍”到认知觉醒:底层生命体验的社会学意义与阶层认知重构 -----作者:杨连江 摘要 “开窍”作为一种无法用金钱购买的认知觉醒,本质上是个体通过沉浸式底层生命体验,打破原有认知闭环、重构社会认知框架的过程。本文以短视频中列举的城管… · 2026/11/13 15:43:46

n8n + AI 自动化落地全攻略:从环境搭建到生产级部署的5步闭环
n8n + AI 自动化落地全攻略:从环境搭建到生产级部署的5步闭环

更多请点击: https://codechina.net 第一章:n8n AI 自动化落地全攻略:从环境搭建到生产级部署的5步闭环 n8n 是一款开源、可扩展、支持可视化编排的工作流引擎,结合大语言模型(LLM)API,可快速… · 2026/11/14 10:12:13

高压电工作业免费题库全国通用?手握证书才能上岗找工作的关键一步
高压电工作业免费题库全国通用?手握证书才能上岗找工作的关键一步

高压电工作业免费题库全国通用?手握证书才能上岗找工作的关键一步 你是不是也在为找不到工作发愁?是不是已经听说,没有高压电工作业证,连面试机会都没有?别急,这篇文章就是为像你一样,急需特种作业证才能上岗找工作的你量身打造的。… · 2026/11/14 18:08:54

长沙去哪考电工证 电子证书怎么拿 实操考试心里没底怕挂科
长沙去哪考电工证 电子证书怎么拿 实操考试心里没底怕挂科

长沙去哪考电工证 电子证书怎么拿 实操考试心里没底怕挂科 实操考试心里没底怕挂科,怕自己练得不够,一上考场就卡壳。这几乎是所有想考电工证的朋友的真实写照。尤其是像长沙这样的大城市,电工证的需求量大,竞争也激烈,但很多人并不知道… · 2026/11/14 18:08:54

代考高压电工证全流程办理指南
代考高压电工证全流程办理指南

高压电工证过期了不知道怎么复审延期?通过率揭秘来了 证书过期了不知道怎么复审延期?你不是一个人。高压电工证作为特种作业人员必须持证上岗的重要凭证,一旦过期或未及时复审,不仅影响工作,还可能面临违规处罚,甚至被责令停工。很多人在证书到期后才意… · 2026/11/14 18:08:54

汽车修理电工证图片怎么考,学历不高也能拿高含金量证书
汽车修理电工证图片怎么考,学历不高也能拿高含金量证书

汽车修理电工证图片怎么考,学历不高也能拿高含金量证书 你是不是也担心,自己学历不高,根本就报不上名?其实不用慌, 汽车修理电工证 并不看重学历,关键看的是你是否具备实际操作能力。而且这个证在行业里 含金量… · 2026/11/14 18:08:54

阿克苏低压电工证费用怎么报名,实操考试心里没底怕挂科?别慌!
阿克苏低压电工证费用怎么报名,实操考试心里没底怕挂科?别慌!

阿克苏低压电工证费用怎么报名,实操考试心里没底怕挂科?别慌! 你是不是正为【阿克苏低压电工证费用】怎么报名发愁?实操考试心里没底怕挂科,这几乎是每个准备报考低压电工证的学员共同的痛点。别担心,我们来帮你把关,从费用到报名流程,再到备考建议,… · 2026/11/14 18:08:54

工地太忙根本没时间复习考试?杭州考电工证地址哪里良心建议全在这
工地太忙根本没时间复习考试?杭州考电工证地址哪里良心建议全在这

工地太忙根本没时间复习考试?杭州考电工证地址哪里良心建议全在这 工地太忙根本没时间复习考试,这几乎是所有一线施工人员的共同烦恼。尤其是像电工证这类高含金量、高门槛的特种作业操作证,如果不及时报考或复审,不仅影响工资待遇,还可能面临停工待岗的… · 2026/11/14 18:06:54

电工证丢失还能补吗?千万别踩坑,丢了证等于失业
电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。… · 2026/11/13 22:30:50

电力电缆作业证直播报名入口与办理流程良心建议
电力电缆作业证直播报名入口与办理流程良心建议

电力电缆作业证直播报名入口与办理流程良心建议 你是不是也担心学历不高报不了名?别急,今天就给你讲讲 电力电缆作业证直播 的报名流程和那些你必须知道的干货, 良心建议 在这里,别错过。 电力电缆作业证直播报名需要什么条件?… · 2026/11/14 13:23:47

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑
英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 怕考不过白交培训费?英德电工证报考费多少钱,你真的了解吗?现在市面上培训机构五花八门,价格参差不齐,很多人一不小心就花了冤枉钱,结果还考不过。别急,今天就来给你说清楚英德电工证的… · 2026/11/14 13:20:59

有初级电工证怎么工作 2026河南最新政策怎么应对
有初级电工证怎么工作 2026河南最新政策怎么应对

有初级电工证怎么工作 2026河南最新政策怎么应对 之前考的证在外省能不能转过来?这个问题我每天被问上百次。2026年河南最新政策对证书跨省转移有了明确说明,特别是南阳市的从业者,需要特别关注。… · 2026/11/14 0:00:31

电工证过期了不知道怎么复审?考电工证自学书+官方报名入口全攻略
电工证过期了不知道怎么复审?考电工证自学书+官方报名入口全攻略

电工证过期了不知道怎么复审?考电工证自学书+官方报名入口全攻略 证书过期了不知道怎么复审延期?很多人遇到这种情况,要么是工作太忙没时间处理,要么是不知道具体流程,导致证书失效,影响工作和项目进展。其实复审并不难,关键是要找准官方报名入口,掌… · 2026/11/14 0:00:31

为什么要低压电工证实操考试考什么
为什么要低压电工证实操考试考什么

为什么低压电工证值不值得考?别再被中介骗了 你是不是也经常看到网上有人在问“低压电工证到底值不值得考”?或者在找报名点时,担心被中间人骗钱?这些问题,我懂,我也经历过。作为一名在应急管理行业摸爬滚打多年的从业者,我深知低压电工证不仅是一个从… · 2026/11/14 0:00:31

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/13 6:12:21

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/13 6:11:51

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/13 22:31:30

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码