【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液晶显示屏


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/473442.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++派生类新增对象的初始化顺序】单继承下派生类新增成员对象的初始化顺序

单继承下派生类新增成员对象的初始化顺序 (1)【意识】派生类新增成员对象也要初始化,千万别忘! (2)派生类构造函数执行顺序 ①调用基类构造函数 ②对派生类的新增成员对象初始化[调用顺序为类中声明顺序] ③…

红外遥控信号解码

红外遥控信号解码 之前就已经做过红外遥控的解码了,但是一直没有做记录,最近的项目又使用到了红外遥控,索性就把他捡起来记录一下,对于信号的解码,我一般的习惯都是先用逻辑分析仪抓取一下信号波形,然后对…

基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络

一、介绍 垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集(‘塑料’, ‘玻璃’, ‘纸张’, ‘纸板’, ‘金属’),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进…

stdin文件流指针

stdin文件流指针(FILE *),用于表示标准输入流。它通常与键盘进行交互,也可以通过重定向将其他输入源作为标准输入。

GPU分布式通信技术-PCle、NVLink、NVSwitch深度解析

GPU分布式通信技术-PCle、NVLink、NVSwitch 大模型时代已到来,成为AI核心驱动力。然而,训练大模型却面临巨大挑战:庞大的GPU资源需求和漫长的学习过程。 要实现跨多个 GPU 的模型训练,需要使用分布式通信和 NVLink。此外&#xf…

调用门提权

在我写的2.保护模式+段探测这篇文章中,我们提到了S位对于段描述符的控制,之前我们已经介绍了代码段和数据段,现在我们来把目光转到系统段 在这么多中结构里面,我们今天要介绍的就是编号为12的,32位调用门 结…

文心一言编写小球反弹程序并优化

使用文心一言尝试编写一个小游戏,先完成 1.python中用pygame模块设计出一个显示区域720x540的屏幕,并绘制一个小球,可以完成小球在显示区域内自动随机直线移动,碰到显示区域的便捷并反弹 import pygame import random import sy…

华为开源自研AI框架昇思MindSpore应用案例:人体关键点检测模型Lite-HRNet

如果你对MindSpore感兴趣,可以关注昇思MindSpore社区 一、环境准备 1.进入ModelArts官网 云平台帮助用户快速创建和部署模型,管理全周期AI工作流,选择下面的云平台以开始使用昇思MindSpore,获取安装命令,安装MindSpo…

gitlab和jenkins连接

一:jenkins 配置 安装gitlab插件 生成密钥 id_rsa 要上传到jenkins,id_rsa.pub要上传到gitlab cat /root/.ssh/id_rsa 复制查看的内容 可以看到已经成功创建出来了对于gitlab的认证凭据 二:配置gitlab cat /root/.ssh/id_rsa.pub 复制查…

SpringBoot实现WebSocket

参考链接&#xff1a;https://www.kancloud.cn/king_om/mic_03/2783864 一、环境搭建 1.创建SpringBoot项目&#xff0c;引入相关依赖 <dependencies><!-- Spring Boot核心启动器&#xff0c;引入常用依赖基础 --><dependency><groupId>org.springf…

现代密码学|公钥密码体制 | RSA加密算法及其数学基础

文章目录 公钥密码RSA数学基础欧拉函数欧拉定理模指数运算 RSA加密算法对rsa的攻击 公钥密码 现代密码学&#xff5c;公钥密码体制概述 加密 A用B的公钥加密 B用B的私钥解密 认证 A使用A的私钥加密 B使用A的公钥解密 加密认证 A用A的私钥加密&#xff0c;再用B的公钥加密 B用…

VuePress v2 快速搭建属于自己的个人博客网站

目录 为什么用VuePress&#xff1f; 一、前期准备 Node.js 使用主题快速开发 二、VuePress安装 三、个性化定制 修改配置信息 删除不需要的信息 博客上传 四、部署 使用github快速部署 初始化仓库 本地配置 配置github的ssh密钥 部署 为什么用VuePress&#xff…

【阅读记录-章节1】Build a Large Language Model (From Scratch)

目录 1. Understanding large language models1.1 What is an LLM?补充介绍人工智能、机器学习和深度学习的关系机器学习 vs 深度学习传统机器学习 vs 深度学习&#xff08;以垃圾邮件分类为例&#xff09; 1.2 Applications of LLMs1.3 Stages of building and using LLMs1.4…

平台整合是网络安全成功的关键

如今&#xff0c;组织面临着日益复杂、动态的网络威胁环境&#xff0c;随着恶意行为者采用越来越阴险的技术来破坏环境&#xff0c;攻击的数量和有效性也在不断上升。我们最近的 Cyber​​Ark 身份威胁形势报告&#xff08;2024 年 5 月&#xff09;发现&#xff0c;去年 99% 的…

PlantUML——时序图

PlantUML时序图 背景 时序图&#xff08;Sequence Diagram&#xff09;&#xff0c;又名序列图、循序图&#xff0c;是一种UML交互图&#xff0c;用于描述对象之间发送消息的时间顺序&#xff0c;显示多个对象之间的动态协作。时序图的使用场景非常广泛&#xff0c;几乎各行各…

【MYSQL】分库分表

一、什么是分库分表 分库分表就是指在一个数据库在存储数据过大&#xff0c;或者一个表存储数据过多的情况下&#xff0c;为了提高数据存储的可持续性&#xff0c;查询数据的性能而进行的将单一库或者表分成多个库&#xff0c;表使用。 二、为什么要分库分表 分库分表其实是两…

Spring纯注解开发

在我的另一篇文章中&#xff08;初识Spring-CSDN博客&#xff09;&#xff0c;讲述了Bean&#xff0c;以及通过xml方式定义Bean。接下来将讲解通过注解的方法管理Bean。 我们在创建具体的类的时候&#xff0c;可以直接在类的上面标明“注解”&#xff0c;以此来声明类。 1. 常…

git push时报错! [rejected] master -> master (fetch first)error: ...

错误描述&#xff1a;在我向远程仓库push代码时&#xff0c;即执行 git push origin master命令时发生的错误。直接上错误截图。 错误截图 错误原因&#xff1a; 在网上查了许多资料&#xff0c;是因为Git仓库中已经有一部分代码&#xff0c;它不允许你直接把你的代码覆盖上去…

java常用工具包介绍

Java 作为一种广泛使用的编程语言&#xff0c;提供了丰富的标准库和工具包来帮助开发者高效地进行开发。这些工具包涵盖了从基础的数据类型操作到高级的网络编程、数据库连接等各个方面。下面是一些 Java 中常用的工具包&#xff08;Package&#xff09;及其简要介绍&#xff1…

latex中,两个相邻的表格,怎样留一定的空白

目录 问题描述 问题解决 问题描述 在使用latex写论文时&#xff0c;经常表格需要置顶写&#xff0c;则会出现两个表格连在一起的情况。下一个表名容易与上面的横线相连&#xff0c;如何通过明令&#xff0c;留出一定的空白。 问题解决 在第二个表格的 \centering命令之后…