【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();
}
初始化
常用的初始化如下:
- 八位数据接口,两行显示,5 * 7 点阵
- 显示开,光标关,闪烁关
- 数据读写操作后,光标自动加一,画面不动
- 清屏
通过上述指令集都可以找到对应的指令,调用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 无限生成视频,还能规划决策,扩散强制整合下一token预测与全序列扩散 当前,采用下一 token 预测范式的自回归大型语言模型已经风靡全球,同时互联…...
从零开始深度学习:全连接层、损失函数与梯度下降的详尽指南
引言 在深度学习的领域,全连接层、损失函数与梯度下降是三块重要的基石。如果你正在踏上深度学习的旅程,理解它们是迈向成功的第一步。这篇文章将从概念到代码、从基础到进阶,详细剖析这三个主题,帮助你从小白成长为能够解决实际…...
Liebherr利勃海尔 EDI 需求分析
Liebherr 使用 EDI 技术来提高业务流程的效率、降低错误率、加快数据交换速度,并优化与供应商、客户和其他合作伙伴之间的业务沟通。通过 EDI,Liebherr 实现了与全球交易伙伴的自动化数据交换,提升了供应链管理和订单处理的透明度。 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语言中,占位符主要用于格式化字符串输出,特别是在使用fmt包中的Printf系列函数时。以下是Go语言中常用的占位符: %v:代表值的默认格式,对于字符串是直接输出,对于整型是十进制形式。%v:扩展…...
基于Windows安装opus python库
项目中需要用到一些opus格式的编解码功能,找到网上有opus的开源库。网址:Opus Codec 想着人生苦短,没想到遇上了错误!在这里记录一下过程 过程 安装python库 pip3 install opuslib验证 >>> import opuslib Tracebac…...
【设计模式】行为型模式(五):解释器模式、访问者模式、依赖注入
《设计模式之行为型模式》系列,共包含以下文章: 行为型模式(一):模板方法模式、观察者模式行为型模式(二):策略模式、命令模式行为型模式(三):责…...
使用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的安装与免密码登录的配置
🍑个人主页:Jupiter. 🚀 所属专栏:MySQL初阶探索:构建数据库基础 欢迎大家点赞收藏评论😊 目录 📚mysql的安装📕MySQL的登录🌏MySQL配置免密码登录 📚mysql的…...
高级 SQL 技巧讲解
大家好,我是程序员小羊! 前言: SQL(结构化查询语言)是管理和操作数据库的核心工具。从基本的查询语句到复杂的数据处理,掌握高级 SQL 技巧不仅能显著提高数据分析的效率,还能解决业务中的复…...
浅论AI大模型在电商行业的发展未来
随着人工智能(AI)技术的快速发展,AI大模型在电商行业中扮演着越来越重要的角色。本文旨在探讨AI大模型如何赋能电商行业,包括提升销售效率、优化用户体验、增强供应链管理等方面。通过分析AI大模型在电商领域的应用案例和技术进展…...
【python笔记03】《类》
文章目录 面向对象基本概念对象的概念类的概念 类的定义类的创建(实例的模板)类的实例化--获取对象对象方法中的self关键字面试题请描述什么是对象,什么是类。请观阅读如下代码,判断是否能正常运行,如果不能正常运行&a…...
Flutter 应用在真机上调试的流程
在真机上调试 Flutter 应用的方法有很多,可以使用 USB 数据线连接设备到电脑进行调试,也可以通过无线方式进行 Flutter 真机调试。 1. 有线调试 设备准备 启用开发者模式: Android:进入 设置 > 关于手机,连续点击…...
快图设计:5个理由告诉你为什么这款Vue图片编辑器值得尝试
快图设计:5个理由告诉你为什么这款Vue图片编辑器值得尝试 【免费下载链接】vue-fabric-editor 快图设计-基于fabric.js和Vue的开源图片编辑器,可自定义字体、素材、设计模板。fabric.js and Vue based image editor, can customize fonts, materials, de…...
AI时代下,泳装行业的内容竞争正在被重新定义
北京先智先行科技有限公司持续推进人工智能产业应用,构建了“先知大模型”“先行 AI 商学院”“先知 AIGC 超级工场”三大核心产品体系,并围绕先知大模型私有化部署、先知 AIGC 超级工场、AI 训练师、先知人力资源服务、先知产业联盟等核心业务方向&…...
智慧交通系统安全漏洞深度解析:从明文传输到固件攻击的防御启示
1. 项目概述:一次对智慧交通“神经末梢”的深度安全审视2014年的DEF CON黑客大会,向来是安全研究的风向标。那一年,IOActive的首席技术官Cesar Cerrudo在台上展示的,不是某个炫酷的软件漏洞,而是一个关于我们每天经过的…...
嵌入式GUI设计:硬件选型与OpenGL优化实战
1. 嵌入式GUI设计的核心价值与市场驱动力在智能设备爆发的时代,嵌入式图形用户界面(GUI)已经从"锦上添花"变成了"不可或缺"的核心竞争力。我亲历过多个项目,那些仅关注硬件性能而忽视交互体验的产品ÿ…...
互联网音频播放器技术演进与Xilinx可编程逻辑应用
1. 互联网音频播放器的技术演进与市场背景2000年初,互联网音频播放器市场正处于爆发式增长的前夜。当时最引人注目的产品当属Diamond Multimedia推出的Rio PMP-300便携式MP3播放器,这款设备彻底改变了人们获取和欣赏音乐的方式。作为第一代互联网音频硬件…...
别再只会用默认蓝色了!MATLAB scatter函数调色全攻略,从单色到渐变一次搞定
MATLAB散点图色彩艺术:从基础调色到数据驱动的视觉叙事 科研图表的美学价值往往被低估——直到你看到那些配色糟糕的论文插图。MATLAB的scatter函数远不止是绘制点集的工具,当掌握其色彩控制逻辑后,它能成为数据故事讲述的视觉利器。本文将彻…...
【SITS大会技术社区交流活动深度复盘】:20年一线专家亲述3大未公开的破圈协作模型与落地工具包
更多请点击: https://intelliparadigm.com 第一章:【SITS大会技术社区交流活动深度复盘】:20年一线专家亲述3大未公开的破圈协作模型与落地工具包 模型一:异构角色动态配对机制 传统技术沙龙常陷入“讲师单向输出、听众被动接收…...
从零开始搭建 AI 应用时如何利用 Taotoken 简化模型选型与接入
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 从零开始搭建 AI 应用时如何利用 Taotoken 简化模型选型与接入 当你着手为一个新项目引入大模型能力时,面对市场上众多…...
技术突破:PyWxDump 4.0如何破解微信数据解析的四大技术壁垒
技术突破:PyWxDump 4.0如何破解微信数据解析的四大技术壁垒 【免费下载链接】PyWxDump 删库 项目地址: https://gitcode.com/GitHub_Trending/py/PyWxDump 微信数据解析面临动态密钥生成、多层加密数据库、多账户数据隔离和跨版本兼容性四大核心挑战。PyWxDu…...
从机器人到游戏引擎:用Eigen库搞定C++中的3D数学(附完整代码示例)
从机器人到游戏引擎:用Eigen库搞定C中的3D数学(附完整代码示例) 在计算机图形学、机器人学和游戏开发中,3D数学是不可或缺的基础。无论是计算机器人末端执行器的位姿,还是实现3D相机的变换,亦或是进行刚体运…...
