当前位置: 首页 > news >正文

【51单片机】LCD1602液晶显示屏

学习使用的开发板:STC89C52RC/LE52RC
编程软件:Keil5
烧录软件:stc-isp

开发板实图:
在这里插入图片描述

文章目录

  • LCD1602
  • 存储结构
    • 时序结构
  • 编码 —— 显示字符、数字

LCD1602

LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其他的一些内置特殊字符,还可以有8个自定义字符

显示容量:16 × 2 个字符,每个字符为 5 × 7 点阵

在这里插入图片描述

引脚及应用电路

在这里插入图片描述

  • VSS:电源接地,相当于负极
  • VO:对比度调节电压,可通过该旋钮调节在这里插入图片描述
  • RS、RW、E 对应 I/O口如下在这里插入图片描述
  • D0 ~ D7 对应 I/O 口如下在这里插入图片描述
  • A、K:背光灯电源正负极在这里插入图片描述

存储结构

LCD1602能显示的字符在出厂时已经被固定好了,存储在一个字模库中。

该字模库由 CGRAM(可自定义字符) + CGROM(只读) 组成

在这里插入图片描述
红色部分为 CGROM,出厂时设置好了,不可修改
蓝色部分为 CGRAM,可由用户自定义字符

从上图可看出,“A” 字符对应的高位代码为 0100,对应左边低位代码为 0001,合起来就是 0100 0001,十六进制为 0x41。刚好与 ASCII 码相同,因此在向 LCD1602 显示字符时,可直接用 P0 = ‘A’

0x20 ~ 0x7F 为标准的 ASCII 码,0xA0 ~ 0xFF 为日文字符和希腊文字符,其余字符码(0x10 ~ 0x1F 及 0x80 ~ 0x9F)没有定义


LCD1602 的屏幕为 16 * 2,但其实 DDRAM(数据显示区) 为 40 * 2,超出范围的区域可以通过屏幕左移或右移显示。LCD1602 提供循环显示,即一直左移,超出范围后会自动衔接上最右侧的内容,形成移动横幅的效果

显示逻辑如下

在这里插入图片描述

  • AC(光标位置):控制写数据的位置

通过控制电路,确定 AC 位置,往 DDRAM 写入要显示的字符,通过字模库转化,最终显示在屏幕上

DDRAM地址如下

在这里插入图片描述

时序结构

  • RS:数据/指令选择,1为数据,0为命令
  • RW:读/写选择,1为读,0为写
  • E:使能标志。置1时,D0 ~ D7 的数据会被写入

指令集如下,标红的为较常用的
在这里插入图片描述

编码 —— 显示字符、数字

LCD1602 主要的两个操作就是 初始化显示字符,其他操作都是基于这两个操作

首先先封装 写数据 和 写命令 的方法

/*** @brief		延迟1ms* @parm		无* @retval		无*/
void LCD_Delay1ms()		//@11.0592MHz
{unsigned char i, j;_nop_();i = 2;j = 199;do{while (--j);} while (--i);
}/*** @brief		写命令* @parm		Command:命令* @retval		无*/
void LCD_WriteCommand(unsigned char Command)
{LCD_RS = 0;					//命令LCD_RW = 0;					//写LCD_DATAPORT = Command;		//写命令LCD_EN = 1;					//拉高使能LCD_Delay1ms();LCD_EN = 0;					//拉低使能LCD_Delay1ms();
}/*** @brief		写数据* @parm		Data:数据* @retval		无*/
void LCD_WriteData(unsigned char Data)
{LCD_RS = 1;					//命令LCD_RW = 0;					//写LCD_DATAPORT = Data;		//写命令LCD_EN = 1;					//拉高使能LCD_Delay1ms();LCD_EN = 0;					//拉低使能LCD_Delay1ms();
}

初始化
常用的初始化如下:

  1. 八位数据接口,两行显示,5 * 7 点阵
  2. 显示开,光标关,闪烁关
  3. 数据读写操作后,光标自动加一,画面不动
  4. 清屏

通过上述指令集都可以找到对应的指令,调用LCD_WriteCommand即可

/*** @brief		初始化LCD1602* @parm		无* @retval		无*/
void LCD_Init()
{LCD_WriteCommand(0x38);		//八位数据接口,两行显示,5*7点阵LCD_WriteCommand(0x0C);		//显示开,光标关,闪烁关LCD_WriteCommand(0x06);		//数据读写操作后,光标自动加一,画面不动LCD_WriteCommand(0x01);		//清屏
}

显示字符

需要先确定光标位置,将数据写在 DDRAM 的什么位置,再发送数据

/*** @brief		设置光标位置* @parm		Row:行号,范围:1 ~ 2* @parm		Column:列号,范围:1 ~ 40* @retval		无*/
void LCD_SetCursor(unsigned char Row, unsigned char Column)
{if(Row == 1)	//第一行起始为0x00LCD_WriteCommand(0x80 | (Column - 1));else			//第二行起始为0x40LCD_WriteCommand(0x80 | (Column - 1) + 0x40);
}/*** @brief		显示一个字符* @parm		Row:行号,范围:1 ~ 2* @parm		Column:列号,范围:1 ~ 40* @parm		Char:字符* @retval		无*/
void LCD_ShowChar(unsigned char Row, Column, Char)
{LCD_SetCursor(Row, Column);LCD_WriteData(Char);
}

接下来就是一些扩展方法
显示字符串,十进制无符号和有符号数字,十六进制,二进制

/*** @brief		显示字符串* @parm		Row:行号,范围:1 ~ 2* @parm		Column:列号,范围:1 ~ 40* @parm		String:字符串* @retval		无*/
void LCD_ShowString(unsigned char Row, unsigned char Column, unsigned char *String)
{unsigned char i = 0;LCD_SetCursor(Row, Column);for(i = 0; String[i] != '\0'; ++i)LCD_WriteData(String[i]);
}/*** @brief		X的Y次方* @parm		X:基数* @parm		Y:次方数* @retval		X^Y*/
unsigned long LCD_Pow(int X, int Y)
{unsigned long res = 1;while(Y--){res *= X;}return res;
}/*** @brief		在指定位置显示指定长度的无符号数字,从高位截取* @parm		Row: 行号,范围:1/2* @parm		Column: 列号,范围:1 ~ 40* @parm		Num: 显示的数字,范围:0 ~ 65535* @parm		Length: 长度,范围:1 ~ 40* @retval		无*/
void LCD_ShowNum(unsigned char Row, unsigned char Column, unsigned int Num, unsigned char Length)
{LCD_SetCursor(Row, Column);for(; Length > 0; --Length)LCD_WriteData((Num / LCD_Pow(10, Length - 1) % 10) + '0');
}/*** @brief		在指定位置显示指定长度的有符号数字,从高位截取* @parm		Row: 行号,范围:1/2* @parm		Column: 列号,范围:1 ~ 40* @parm		Num: 显示的数字,范围:-32768 ~ 32767。* @parm		Length: 长度,范围:1 ~ 40* @retval		无*/
void LCD_ShowSignedNum(unsigned char Row, unsigned char Column, int Num, unsigned char Length)
{//显示正负号unsigned int ShowNum;if(Num >= 0){LCD_ShowChar(Row, Column, '+');ShowNum = Num;}	else{LCD_ShowChar(Row, Column, '-');ShowNum = -Num;}LCD_ShowNum(Row, Column + 1, ShowNum, Length);
}/*** @brief		在指定位置显示指定长度的十六进制数字* @parm		Row: 行号,范围:1/2* @parm		Column: 列号,范围:1 ~ 40* @parm		Num: 显示的数字,范围:0 ~ 65535* @parm		Length: 长度,范围:1 ~ 40* @retval		无*/
void LCD_ShowHexNum(unsigned char Row, unsigned char Column, unsigned int Num, unsigned char Length)
{unsigned char Temp;LCD_SetCursor(Row, Column);for(; Length > 0; --Length){Temp = Num / LCD_Pow(16, Length - 1) % 16;if(Temp >= 10)LCD_WriteData(Temp - 10 + 'A');elseLCD_WriteData(Temp + '0');}
}/*** @brief		在指定位置显示指定长度的二进制数字* @parm		Row: 行号,范围:1/2* @parm		Column: 列号,范围:1 ~ 40* @parm		Num: 显示的数字,范围:0 ~ 65535* @parm		Length: 长度,范围:1 ~ 40* @retval		无*/
void LCD_ShowBinNum(unsigned char Row, unsigned char Column, unsigned int Num, unsigned char Length)
{LCD_SetCursor(Row, Column);for(; Length > 0; --Length)LCD_WriteData(Num / LCD_Pow(2, Length - 1) % 2 + '0');
}

完整项目链接:【51单片机】LCD1602液晶显示屏


以上就是本篇博客的所有内容,感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述

相关文章:

【51单片机】LCD1602液晶显示屏

学习使用的开发板:STC89C52RC/LE52RC 编程软件:Keil5 烧录软件:stc-isp 开发板实图: 文章目录 LCD1602存储结构时序结构 编码 —— 显示字符、数字 LCD1602 LCD1602(Liquid Crystal Display)液晶显示屏是…...

理解 HTML5 Canvas 中逻辑像素与物理像素的关系

理解 HTML5 Canvas 中逻辑像素与物理像素的关系 在使用 HTML5 Canvas 时,开发者经常会遇到一个困惑:为什么鼠标的 offsetX 和 offsetY 和我绘制的图形坐标对不上?这通常是因为 Canvas 的逻辑像素大小和物理像素大小不一致。本文将详细解释这…...

7.揭秘C语言输入输出内幕:printf与scanf的深度剖析

揭秘C语言输入输出内幕:printf与scanf的深度剖析 C语言往期系列文章目录 往期回顾: VS 2022 社区版C语言的安装教程,不要再卡在下载0B/s啦C语言入门:解锁基础概念,动手实现首个C程序C语言概念之旅:解锁关…...

数据分析-系统认识数据分析

目录 数据分析的全貌 观测 实验 应用 数据分析的全貌 观测 实验 应用...

蓝桥杯介绍

赛事背景与历程 自2009年举办以来,蓝桥杯已经连续举行了多届,成为国内领先的信息技术赛事。2022年,蓝桥杯被教育部确定为2022—2025学年面向中小学生的全国性竞赛活动,并入选国家级A类学科竞赛。 参赛对象与组别 蓝桥杯的参赛对…...

鸿蒙加载网络图片并转换成PixelMap

鸿蒙加载网络图片并转换成PixelMap 参考文档 基于API12. 有一些图片功能需要使用 PixelMap 类型的参数,但是使用Image组件之类的时候无法获取到 PixelMap 类型数据。 因此只能是把图片下载下来然后加在并转换一下。 实现方式 一下封装了一个函数。使用的 rcp 模…...

hive搭建

1.准备环境 三台节点主机已安装hadoopmysql数据库 2.环境 2.1修改三台节点上hadoop的core-site.xml <!-- 配置 HDFS 允许代理任何主机和组 --> <property><name>hadoop.proxyuser.hadoop.hosts</name><value>*</value> </property&…...

51c扩散模型~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/11541675 #Diffusion Forcing 无限生成视频&#xff0c;还能规划决策&#xff0c;扩散强制整合下一token预测与全序列扩散 当前&#xff0c;采用下一 token 预测范式的自回归大型语言模型已经风靡全球&#xff0c;同时互联…...

从零开始深度学习:全连接层、损失函数与梯度下降的详尽指南

引言 在深度学习的领域&#xff0c;全连接层、损失函数与梯度下降是三块重要的基石。如果你正在踏上深度学习的旅程&#xff0c;理解它们是迈向成功的第一步。这篇文章将从概念到代码、从基础到进阶&#xff0c;详细剖析这三个主题&#xff0c;帮助你从小白成长为能够解决实际…...

Liebherr利勃海尔 EDI 需求分析

Liebherr 使用 EDI 技术来提高业务流程的效率、降低错误率、加快数据交换速度&#xff0c;并优化与供应商、客户和其他合作伙伴之间的业务沟通。通过 EDI&#xff0c;Liebherr 实现了与全球交易伙伴的自动化数据交换&#xff0c;提升了供应链管理和订单处理的透明度。 Liebher…...

java小练习

小练1.用while语句计算11/2!1/3!1/4!...1/20!的和 public class test_11_17_2 {public static void main(String[] args) {double sum 0;double item 1;int n 20;int i 1;while(i<n){sum item;i i1;item item*(1.0/i);}System.out.println(sum);} } 小练2.计算88888…...

go语言中的占位符有哪些

在Go语言中&#xff0c;占位符主要用于格式化字符串输出&#xff0c;特别是在使用fmt包中的Printf系列函数时。以下是Go语言中常用的占位符&#xff1a; %v&#xff1a;代表值的默认格式&#xff0c;对于字符串是直接输出&#xff0c;对于整型是十进制形式。%v&#xff1a;扩展…...

基于Windows安装opus python库

项目中需要用到一些opus格式的编解码功能&#xff0c;找到网上有opus的开源库。网址&#xff1a;Opus Codec 想着人生苦短&#xff0c;没想到遇上了错误&#xff01;在这里记录一下过程 过程 安装python库 pip3 install opuslib验证 >>> import opuslib Tracebac…...

【设计模式】行为型模式(五):解释器模式、访问者模式、依赖注入

《设计模式之行为型模式》系列&#xff0c;共包含以下文章&#xff1a; 行为型模式&#xff08;一&#xff09;&#xff1a;模板方法模式、观察者模式行为型模式&#xff08;二&#xff09;&#xff1a;策略模式、命令模式行为型模式&#xff08;三&#xff09;&#xff1a;责…...

使用nossl模式连接MySQL数据库详解

使用nossl模式连接MySQL数据库详解 摘要一、引言二、nossl模式概述2.1 SSL与nossl模式的区别2.2 选择nossl模式的场景三、在nossl模式下连接MySQL数据库3.1 准备工作3.2 C++代码示例3.3 代码详解3.3.1 初始化MySQL连接对象3.3.2 连接到MySQL数据库3.3.3 执行查询操作3.3.4 处理…...

【MySQL】ubantu 系统 MySQL的安装与免密码登录的配置

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;MySQL初阶探索&#xff1a;构建数据库基础 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f4da;mysql的安装&#x1f4d5;MySQL的登录&#x1f30f;MySQL配置免密码登录 &#x1f4da;mysql的…...

高级 SQL 技巧讲解

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; SQL&#xff08;结构化查询语言&#xff09;是管理和操作数据库的核心工具。从基本的查询语句到复杂的数据处理&#xff0c;掌握高级 SQL 技巧不仅能显著提高数据分析的效率&#xff0c;还能解决业务中的复…...

浅论AI大模型在电商行业的发展未来

随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;AI大模型在电商行业中扮演着越来越重要的角色。本文旨在探讨AI大模型如何赋能电商行业&#xff0c;包括提升销售效率、优化用户体验、增强供应链管理等方面。通过分析AI大模型在电商领域的应用案例和技术进展…...

【python笔记03】《类》

文章目录 面向对象基本概念对象的概念类的概念 类的定义类的创建&#xff08;实例的模板&#xff09;类的实例化--获取对象对象方法中的self关键字面试题请描述什么是对象&#xff0c;什么是类。请观阅读如下代码&#xff0c;判断是否能正常运行&#xff0c;如果不能正常运行&a…...

Flutter 应用在真机上调试的流程

在真机上调试 Flutter 应用的方法有很多&#xff0c;可以使用 USB 数据线连接设备到电脑进行调试&#xff0c;也可以通过无线方式进行 Flutter 真机调试。 1. 有线调试 设备准备 启用开发者模式&#xff1a; Android&#xff1a;进入 设置 > 关于手机&#xff0c;连续点击…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...