51单片机嵌入式开发:8、 STC89C52RC 操作LCD1602原理
STC89C52RC 操作LCD1602原理
- 1 LCD1602概述
- 1.1 LCD1602介绍
- 1.2 LCD1602引脚说明
- 1.3 LCD1602指令介绍
- 2 LCD1602外围电路
- 2.1 LCD1602接线方法
- 2.2 LCD1602电路原理
- 3 LCD1602软件操作
- 3.1 LCD1602显示
- 3.2 LCD1602 protues仿真
- 4 总结
1 LCD1602概述
1.1 LCD1602介绍
LCD1602是一种常见的字符型液晶显示器,它由两行、每行16个字符构成,因此被称为LCD1602。它是一种低功耗、易于使用的显示设备,广泛应用于各种嵌入式系统和电子项目中。
以下是LCD1602的主要特点和介绍:
- 字符显示能力: LCD1602能够显示两行文本,每行可显示16个字符。每个字符由5x8点阵字形组成,可以显示各种字母、数字、符号和自定义字符。
- 背光显示: LCD1602通常具有背光功能,可以通过控制电源来开启或关闭背光。背光使得在光线较暗的环境下仍然能够清晰地看到显示内容。
- 并行接口: LCD1602使用并行接口与主控制器(如Arduino、树莓派等)进行通信。通常使用4位或8位并行模式进行数据传输。
- 控制器芯片: LCD1602通常使用HD44780或类似的控制器芯片,这种芯片提供了驱动液晶显示器所需的功能,包括字符生成、显示控制等。
- 显示控制: 使用主控制器通过并行接口向LCD1602发送指令和数据来控制显示内容。可以设置光标位置、显示开关、光标闪烁等。
- 低功耗: LCD1602采用液晶显示技术,相对于其他显示技术(如LED),具有较低的功耗,适合于需要长时间运行的电子设备。
- 简单驱动电路: 驱动LCD1602通常只需要几个IO引脚,并且无需复杂的外部电路。这使得它易于集成到各种嵌入式系统和电子项目中。
LCD1602广泛应用于各种场景,例如温度显示、时间显示、系统状态显示等。通过编程控制,可以实现动态显示、滚动显示、自定义字符显示等丰富的功能。它是学习嵌入式系统和进行电子项目开发的常用显示设备之一。
1.2 LCD1602引脚说明
LCD1602液晶显示器通常具有16个引脚,这些引脚用于与主控制器(如Arduino、树莓派等)进行连接和通信。以下是LCD1602的常见引脚说明:
- VSS(地/负极):连接到电源的地(GND)引脚,提供电源的负极。
- VCC(电源正极):连接到电源的正极,通常为+5V。
- VEE(对比度调节):用于调节液晶显示的对比度。通过连接可变电阻或电位器来调整引脚电压,以改变显示的清晰度和对比度。
- RS(寄存器选择):寄存器选择引脚,用于选择数据和指令的类型。当RS为低电平(0)时,表示发送的是指令;当RS为高电平(1)时,表示发送的是数据。
- RW(读/写选择):读/写选择引脚,用于选择液晶显示器的读写模式。当RW为低电平(0)时,表示写入数据或指令;当RW为高电平(1)时,表示读取数据。
- E(使能引脚):使能引脚,用于触发液晶显示器的操作。当E由低电平变为高电平时,液晶显示器执行指令或数据的读/写操作。
7-14. DB0-DB7(数据引脚):数据引脚用于传输8位数据。在4位并行模式下,通常只使用DB4-DB7引脚。 - LED+(背光正极):连接到背光源的正极。通常连接到+5V电源。
- LED-(背光负极):连接到背光源的负极。通常连接到电源的地(GND)。
这些引脚的具体连接方式可能会根据不同的主控制器和电路设计而有所变化。在使用LCD1602之前,应仔细阅读液晶显示器的数据手册,并根据手册提供的引脚说明进行正确的连接。
1.3 LCD1602指令介绍
LCD1602液晶显示器使用指令来控制其显示行为和操作。通过发送不同的指令,可以设置光标位置、显示模式、清除屏幕内容等。以下是一些常见的LCD1602指令:
- 清屏指令(Clear Display): 清除LCD屏幕上的所有内容,并将光标位置设置为起始位置。指令代码为0x01。
- 返回首页指令(Return Home): 将光标位置设置为起始位置,但不清除屏幕上的内容。指令代码为0x02。
- 光标和显示控制指令:
• 显示开关指令(Display ON/OFF): 控制LCD的显示开关。可以设置是否显示光标和是否闪烁光标。指令代码为0x0C,其中C表示显示开关控制。
• 光标和显示方向指令(Entry Mode Set): 控制光标的移动方向和显示的移位方式。可以设置光标移动后是否自动移动显示位置。指令代码为0x06,其中6表示光标和显示方向设置。 - 光标位置控制指令:
• 设置光标位置指令(Set DDRAM Address): 设置光标的位置,即在屏幕上指定的行和列位置。指令代码的高4位为0x8,低4位为指定的位置。
• 设置CGRAM地址指令(Set CGRAM Address): 设置自定义字符的存储位置。指令代码的高4位为0x4,低4位为指定的位置。 - 功能设置指令:
• 显示模式设置指令(Function Set): 设置显示模式、数据线数和字符字体。指令代码为0x28,其中2表示功能设置。
• 扩展指令设置(Extended Function Set): 扩展功能设置,用于设置显示模式和字符字体。指令代码为0x39,其中9表示扩展功能设置。
这些指令通过并行接口或串行接口发送给LCD1602,以控制其行为和显示内容。在使用LCD1602时,可以根据需要选择适当的指令来实现各种显示效果和功能。详细的指令说明可以在LCD1602的数据手册或相关资料中找到。
2 LCD1602外围电路
2.1 LCD1602接线方法
根据数据手册,外围电路接法如图所示:
2.2 LCD1602电路原理
在开发板上的原理图接法如图所示:
3 LCD1602软件操作
LCD1602软件操作要注意时序等重要参数:
初始化流程如下所示:
3.1 LCD1602显示
AI例程如下:
#include <reg52.h>#define LCD_DATA P0 // 设置LCD数据线连接到P0口
sbit RS = P2^4; // RS引脚
sbit RW = P2^5; // RW引脚
sbit EN = P2^6; // EN引脚// 延时函数
void delay(unsigned int count) {unsigned int i, j;for(i = 0; i < count; i++) {for(j = 0; j < 120; j++);}
}// 发送命令到LCD
void lcdCommand(unsigned char command) {RS = 0; // 设置为命令模式RW = 0; // 设置为写入模式EN = 1; // 使能LCDLCD_DATA = command; // 发送命令EN = 0; // 禁用LCDdelay(5); // 等待一段时间
}// 初始化LCD
void lcdInit() {lcdCommand(0x38); // 8位数据线,2行显示,5x8点阵字体lcdCommand(0x38); // 8位数据线,2行显示,5x8点阵字体lcdCommand(0x38); // 8位数据线,2行显示,5x8点阵字体lcdCommand(0x01); // 清屏delay(10); // 等待清屏完成lcdCommand(0x06); // 设定输入方式,光标右移,不移动显示lcdCommand(0x0C); // 打开显示,关闭光标
}// 在指定位置显示字符
void lcdPrintChar(unsigned char row, unsigned char col, unsigned char c) {unsigned char address;if(row == 0) {address = 0x80 + col; // 第一行} else if(row == 1) {address = 0xC0 + col; // 第二行}lcdCommand(address); // 设置显示位置RS = 1; // 设置为数据模式RW = 0; // 设置为写入模式EN = 1; // 使能LCDLCD_DATA = c; // 发送字符数据EN = 0; // 禁用LCDdelay(5); // 等待一段时间
}void main() {lcdInit(); // 初始化LCDwhile(1) {lcdCommand(0x0F); // 光标闪烁// 在第一行显示文本lcdPrintChar(0, 0, 'C');lcdPrintChar(0, 1, 'u');lcdPrintChar(0, 2, 'r');lcdPrintChar(0, 3, 's');lcdPrintChar(0, 4, 'o');lcdPrintChar(0, 5, 'r');lcdPrintChar(0, 6, ' ');lcdPrintChar(0, 7, '1');delay(1000); // 延时一段时间lcdCommand(0x0C); // 关闭光标delay(1000); // 延时一段时间}
}
自己演示的例程如下:
/*1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK*//*-----------------------------------------------名称:LCD1602内容:通过标准程序静态显示2行字符
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<stdio.h> //标准输入输出
#include<intrins.h>sbit RS = P2^4; //Pin4
sbit RW = P2^5; //Pin5
sbit E = P2^6; //Pin6#define Data P0//数据端口char data TimeNum[]=" ";
char data Test1[]=" ";
/******************************************************************/
/* 函数声明 */
/******************************************************************/
/******************************************************************/
/* 微秒延时函数 */
/******************************************************************/
void DelayUs(unsigned char us)//delay us
{unsigned char uscnt;uscnt=us>>1; /*12MHz频率*/while(--uscnt);
}
/******************************************************************/
/* 毫秒函数声明 */
/******************************************************************/
void DelayMs(unsigned char ms)
{while(--ms){DelayUs(250);DelayUs(250);DelayUs(250);DelayUs(250);}
}
/******************************************************************/
/* 写入命令函数 */
/******************************************************************/
void WriteCommand(unsigned char c)
{DelayMs(5);//操作前短暂延时,保证信号稳定E=0;RS=0;RW=0;_nop_();E=1;Data=c;E=0;
}
/******************************************************************/
/* 写入数据函数 */
/******************************************************************/
void WriteData(unsigned char c)
{DelayMs(5); //操作前短暂延时,保证信号稳定E=0;RS=1;RW=0;_nop_();E=1;Data=c;E=0;RS=0;
}
/******************************************************************/
/* 写入字节函数 */
/******************************************************************/
void ShowChar(unsigned char pos,unsigned char c)
{unsigned char p;if (pos>=0x10)p=pos+0xb0; //是第二行则命令代码高4位为0xcelse p=pos+0x80; //是第一行则命令代码高4位为0x8WriteCommand (p);//写命令WriteData (c); //写数据
}
/******************************************************************/
/* 写入字符串函数 */
/******************************************************************/
void ShowString (unsigned char line,char *ptr)
{unsigned char l,i;l=line<<4;for (i=0;i<15;i++)ShowChar (l++,*(ptr+i));//循环显示16个字符
}
/******************************************************************/
/* 初始化函数 */
/******************************************************************/
void InitLcd()
{DelayMs(15);WriteCommand(0x38); //display modeWriteCommand(0x38); //display modeWriteCommand(0x38); //display modeWriteCommand(0x06); //显示光标移动位置WriteCommand(0x0F); //显示开及光标设置WriteCommand(0x01); //显示清屏 }/******************************************************************/
/* 主函数 */
/******************************************************************/
void main(void){
InitLcd(); //初始化LCD
DelayMs(15); //延时保证信号稳定sprintf(Test1," Welcome! "); //打印输出第一行信息
ShowString(0,Test1);sprintf(TimeNum,"LCM1602 Test ok!");//打印输出第二行信息
ShowString(1,TimeNum);while(1);}
3.2 LCD1602 protues仿真
光标可显示的例程:
4 总结
LCD1602液晶显示器在各种嵌入式系统和电子项目中有广泛的应用场景。由于其低功耗、易于使用和成本效益等特点,LCD1602被广泛应用于以下领域:
- 温度和湿度显示器: LCD1602可以用于显示温度和湿度传感器的读数,提供实时的环境信息。
- 时间和日期显示器: LCD1602常用于显示当前时间和日期,可以与实时时钟模块(RTC)或其他时间源配合使用。
- 系统状态显示器: 在嵌入式系统中,LCD1602可用于显示系统状态信息,如CPU负载、内存使用情况、网络连接状态等。
- 计数器和计时器: LCD1602可以用作计数器和计时器的显示器,显示计数值或计时器的剩余时间。
- 数字测量显示器: 通过连接传感器和测量模块,LCD1602可以显示各种数字测量值,如距离、压力、光强等。
- 报警和警告显示器: 可使用LCD1602来显示报警和警告信息,如安全系统的警报状态、设备故障等。
- 文本提示和菜单导航: 对于用户界面设计,LCD1602可用于显示文本提示、菜单选项和导航信息,提供交互式操作界面。
- 自定义字符显示器: LCD1602允许用户定义自己的字符,可以用于显示特定的符号、图标或自定义文本。
这些仅是LCD1602的一些常见应用场景,实际上它在各种嵌入式系统和电子项目中的应用非常广泛。通过编程和控制,可以实现更多复杂的显示功能和交互特性,使LCD1602在项目中发挥更大的作用。
相关文章:
51单片机嵌入式开发:8、 STC89C52RC 操作LCD1602原理
STC89C52RC 操作LCD1602原理 1 LCD1602概述1.1 LCD1602介绍1.2 LCD1602引脚说明1.3 LCD1602指令介绍 2 LCD1602外围电路2.1 LCD1602接线方法2.2 LCD1602电路原理 3 LCD1602软件操作3.1 LCD1602显示3.2 LCD1602 protues仿真 4 总结 1 LCD1602概述 1.1 LCD1602介绍 LCD1602是一种…...
数字化时代的供应链管理综合解决方案
目录 引言背景与意义供应链管理综合解决方案的目标 📄供应链管理系统主要功能系统优势 📄物流管理系统主要功能系统优势 📄订单管理系统主要功能应用场景 📄仓储管理系统系统亮点主要功能系统优势 📄商城管理系统主要功…...
CentOS 安装 annie/lux,以及 annie/lux 的使用
annie 介绍 如果第一次听到 annie 想必都会觉得陌生,annie 被大家称为视频下载神器,annie 作者介绍说可以下载抖音、哔哩哔哩、优酷、爱奇艺、芒果TV、YouTube、Tumblr、Vimeo 等平台的视频。 githup:https://github.com/pingf/annie 支持…...
拥抱UniHttp,规范Http接口对接之旅
前言 如果你项目里还在用传统的编程式Http客户端比如HttpClient、Okhttp去直接对接第三方Http接口, 那么你项目一定充斥着大量的对接逻辑和代码, 并且针对不同的对接渠道方需要每次封装一次调用的简化, 一旦封装不好系统将会变得难以维护&am…...
Python 给存入 Redis 的键值对设置过期时间
Redis 是一种内存中的数据存储系统,与许多传统数据库相比,它具有一些优势,其中之一就是可以设置数据的过期时间。通过 Redis 的过期时间设置,可以为存储在 Redis 中的数据设置一个特定的生存时间。一旦数据到达过期时间࿰…...
在linux中安装docker
文章目录 1、安装依赖2、安装docker的下载源3、安装docker4、设置Docker服务开机自启 1、安装依赖 sudo yum install -y yum-utils2、安装docker的下载源 sudo yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repohttps://download.do…...
【JVM-04】线上CPU100%
【JVM-04】线上CPU100% 1. 如何排查2. 再举一个例子 1. 如何排查 ⼀般CPU100%疯狂GC,都是死循环的锅,那怎么排查呢?先进服务器,⽤top -c 命令找出当前进程的运⾏列表按⼀下 P 可以按照CPU使⽤率进⾏排序显示Java进程 PID 为 2609…...
try catch 解决大问题
项目开发中遇到一个棘手的bug,react前端项目独自运行时一切正常,但是把项目集成到使用wujie的大平台微前端项目中之后,突然有个地方无故报错,导致程序运行停止,后续的方法不再执行。报错如下: DOMExceptio…...
手动解析Collection
即将被解析的json {"collection": {"templates": [{"data": [{"name": "plantCode","value": "MSHG_KFXHS02"}, {"name": "details","value": [{"plantMedicament…...
list模拟实现【C++】
文章目录 全部的实现代码放在了文章末尾准备工作包含头文件定义命名空间类的成员变量为什么节点类是用struct而不是class呢?为什么要写get_head_node? 迭代器迭代器在list类里的实例化和重命名普通迭代器operator->()的作用是什么? const迭代器反向迭…...
nginx正向代理、反向代理、负载均衡
nginx.conf nginx首要处理静态页面 反向代理 动态请求 全局模块 work processes 1; 设置成服务器内核数的两倍(一般不不超过8个超过8个反而会降低性能一般4个 1-2个也可以) netstat -antp | grep 80 查端口号 *1、events块:* 配置影响ngi…...
matlab 有倾斜的椭圆函数图像绘制
matlab 有倾斜的椭圆函数图像绘制 有倾斜的椭圆函数图像绘制xy交叉项引入斜线负向斜线成分正向斜线成分 x^2 y^2 xy 1 (负向)绘制结果 x^2 y^2 - xy 1 (正向)绘制结果 有倾斜的椭圆函数图像绘制 为了确定椭圆的长轴和短轴的…...
PTK是如何加密WLAN单播数据帧的?
1. References WLAN 4-Way Handshake如何生成PTK?-CSDN博客 2. 概述 在Wi-Fi网络中,单播、组播和广播帧的加密算法是由AP决定的。其中单播帧的加密使用PTK密钥,其PTK的密钥结构如下图所示: PTK的组成如上图所示,由K…...
Django之登录权限系统
本文参考链接django之auth模块(用户认证) - chchcharlie、 - 博客园 (cnblogs.com) 执行完迁移命令,会自动生成admin表,迁移命令如下: python manage.py makemigrations python manage.py migrate 相关模块 from django.contrib …...
rust way step 1
install rust CARGO_HOME D:\rust\.cargo RUSTUP_HOME D:\rust\.rustup [dependencies] ferris-says "0.2" vscode 安装rust 插件 use ferris_says::say; // from the previous step use std::io::{stdout, BufWriter};fn main() {let stdout stdout();let m…...
视觉语言模型导论:这篇论文能成为你进军VLM的第一步
近些年,语言建模领域进展非凡。Llama 或 ChatGPT 等许多大型语言模型(LLM)有能力解决多种不同的任务,它们也正在成为越来越常用的工具。 这些模型之前基本都局限于文本输入,但现在也正在具备处理视觉输入的能力。如果…...
Postman工具基本使用
一、安装及基本使用 安装及基本使用参见外网文档:全网最全的 postman 工具使用教程_postman使用-CSDN博客 建议版本:11以下,比如10.x.x版本。11版本以后貌似是必须登录使用 二、禁止更新 彻底禁止postman更新 - 简书 host增加࿱…...
uni-app三部曲之三: 路由拦截
1.引言 路由拦截,个人理解就是在页面跳转的时候,增加一级拦截器,实现一些自定义的功能,其中最重要的就是判断跳转的页面是否需要登录后查看,如果需要登录后查看且此时系统并未登录,就需要跳转到登录页&…...
专注于国产FPGA芯片研发的异格技术Pre-A+轮融资,博将控股再次投资
近日,苏州异格技术有限公司(以下简称“异格技术”)宣布成功完成数亿元的Pre-A轮融资,由博将控股在参与Pre-A轮投资后,持续投资。这标志着继2022年获得经纬中国、红点中国、红杉中国等机构数亿元天使轮融资后࿰…...
【python】QWidget父子关系,控件显示优先级原理剖析与应用实战演练
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
CTF php RCE(三)
0x07 日志文件包含 判断类型 使用kali curl -I urlF12 打开F12开发者工具,选中之后F5刷新查看server类型即可 配置文件 直接包含或者访问如果有回显就是, NGINX:NGINX 的配置文件通常位于 /etc/nginx/ 目录下,具体的网站配…...
Android 注解的语法原理和使用方法
Android 注解的语法原理和使用方法 关于我 在 Android 开发中,注解(Annotation)是一种强大的工具,用于在代码中添加元数据。注解可以简化代码、提高可读性、减少样板代码,并且在一定程度上增强编译时的类型检查。本文…...
YOLOv10改进 | Conv篇 | 利用FasterBlock二次创新C2f提出一种全新的结构(全网独家首发,参数量下降70W)
一、本文介绍 本文给大家带来的改进机制是利用FasterNet的FasterBlock改进特征提取网络,将其用来改进ResNet网络,其旨在提高计算速度而不牺牲准确性,特别是在视觉任务中。它通过一种称为部分卷积(PConv)的新技术来减少…...
实验-ENSP实现防火墙区域策略与用户管理
目录 实验拓扑 自己搭建拓扑 实验要求 实验步骤 整通总公司内网 sw3配置vlan 防火墙配置IP 配置安全策略(DMZ区内的服务器,办公区仅能在办公时间内(9: 00- 18:00)可以访问,生产区的设备全天可以访问) 配置nat策…...
【游戏客户端】大话slg玩法架构(二)背景地图
【游戏客户端】大话slg玩法架构(二)背景地图 大家好,我是Lampard家杰~~ 今天我们继续给大家分享SLG玩法的实现架构,关于SLG玩法的介绍可以参考这篇上一篇文章:【游戏客户端】制作率土之滨Like玩法 PS:和之前…...
git-工作场景
1. 远程分支为准 强制切换到远程分支并忽略本地未提交的修改 git fetch origin # 获取最新的远程分支信息 git reset --hard origin/feature_server_env_debug_20240604 # 强制切换到远程分支,并忽略本地修改 2. 切换分支 1. **查看所有分支:**…...
coco dataset标签数据结构(json文件)
COCO数据集现在有3种标注类型:object instances(目标实例), object keypoints(目标上的关键点), 和image captions(看图说话),使用json文件存储。 NameImagesLabelstrain linkhttp:…...
GaussDB关键技术原理:高性能(四)
GaussDB关键技术原理:高性能(三)从查询重写RBO、物理优化CBO、分布式优化器、布式执行框架、轻量全局事务管理GTM-lite等五方面对高性能关键技术进行了解读,本篇将从USTORE存储引擎、计划缓存计划技术、数据分区与分区剪枝、列式存…...
总结之企业微信(一)——创建外部群二维码,用户扫码入群
创建外部群 企微接口中没有直接通过服务端API接口创建外部群 可以通过jssdk创建外部群:引用jssdk调用会话接口wx.openEnterpriseChat https://work.weixin.qq.com/api/doc/90000/90136/90511 创建外部群二维码 需要通过企业微信的应用,并且配置客户联…...
透视数据治理:企业如何衡量数据治理的效果?
在企业运营中,各个业务部门的成功与否都是直观且易于量化的,像销售部门卖了多少产品又为企业带来多少盈利,这些都能用具体的数字来说话。但当谈到数据治理的成效时,许多企业与决策者却感到迷茫。 数据治理的重要性不言而喻&#…...
简单的网页代码/江苏短视频seo搜索
isnull(expr)如expr为null,那么isnull()的返回值为1,否则返回值为0。mysql>select isnull(11);->0mysql>select isnull(1/0);->1使用的null值对比通常是错误的。isnull()函数同is null比较操作符具有一些相同的特性。请参见有关is null 的说…...
石家庄市建设局质监站网站/网络站点推广的方法有哪些
前言 在SpringBoot中使用自定义注解、aop切面打印web请求日志。主要是想把controller的每个request请求日志收集起来,调用接口、执行时间、返回值这几个重要的信息存储到数据库里,然后可以使用火焰图统计接口调用时长,平均响应时长&am…...
建设网站的规则/推广手段
概述当linux系统中有信息需要进行格式化,可以怎么处理呢?今天我们就看下怎么把一串数字后面的逗号去掉。。。方法一1、sed可以使用linux下sed命令去掉一串数字后的逗号2、catsed如果文本信息是存在文件中,那么可以结合cat和sed两个命令来实现…...
怎么样做网站视频/百度站长平台
一、流程分析 1.1 入口程序 在 SpringApplication#run(String... args) 方法中,外部化配置关键流程分为以下四步 public ConfigurableApplicationContext run(String... args) {...SpringApplicationRunListeners listeners getRunListeners(args); // 1listeners.…...
网站系统建设管理制度/网站搭建步骤
1. JS为什么是单线程的? JS最初被设计用在浏览器中,那么想象一下,如果浏览器中的JS是多线程的。 那么现在有2个进程,process1 process2,由于是多进程的JS,所以他们对同一个dom,同时进行操作。 p…...
网站是怎么做排名的/做网页设计一个月能挣多少
<?php include_once smarty.php; $smarty->assign(title,标题); $smarty->assign(content,内容);$output $smarty->fetch(index.html); echo $output;// $smarty->display(index.html); ?>#使用fetch函数,你可以将要输出的html赋值给一个变量&…...