当前位置: 首页 > 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;连续点击…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...