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的主要特点和介绍:

  1. 字符显示能力: LCD1602能够显示两行文本,每行可显示16个字符。每个字符由5x8点阵字形组成,可以显示各种字母、数字、符号和自定义字符。
  2. 背光显示: LCD1602通常具有背光功能,可以通过控制电源来开启或关闭背光。背光使得在光线较暗的环境下仍然能够清晰地看到显示内容。
  3. 并行接口: LCD1602使用并行接口与主控制器(如Arduino、树莓派等)进行通信。通常使用4位或8位并行模式进行数据传输。
  4. 控制器芯片: LCD1602通常使用HD44780或类似的控制器芯片,这种芯片提供了驱动液晶显示器所需的功能,包括字符生成、显示控制等。
  5. 显示控制: 使用主控制器通过并行接口向LCD1602发送指令和数据来控制显示内容。可以设置光标位置、显示开关、光标闪烁等。
  6. 低功耗: LCD1602采用液晶显示技术,相对于其他显示技术(如LED),具有较低的功耗,适合于需要长时间运行的电子设备。
  7. 简单驱动电路: 驱动LCD1602通常只需要几个IO引脚,并且无需复杂的外部电路。这使得它易于集成到各种嵌入式系统和电子项目中。
    LCD1602广泛应用于各种场景,例如温度显示、时间显示、系统状态显示等。通过编程控制,可以实现动态显示、滚动显示、自定义字符显示等丰富的功能。它是学习嵌入式系统和进行电子项目开发的常用显示设备之一。

1.2 LCD1602引脚说明

在这里插入图片描述

LCD1602液晶显示器通常具有16个引脚,这些引脚用于与主控制器(如Arduino、树莓派等)进行连接和通信。以下是LCD1602的常见引脚说明:

  1. VSS(地/负极):连接到电源的地(GND)引脚,提供电源的负极。
  2. VCC(电源正极):连接到电源的正极,通常为+5V。
  3. VEE(对比度调节):用于调节液晶显示的对比度。通过连接可变电阻或电位器来调整引脚电压,以改变显示的清晰度和对比度。
  4. RS(寄存器选择):寄存器选择引脚,用于选择数据和指令的类型。当RS为低电平(0)时,表示发送的是指令;当RS为高电平(1)时,表示发送的是数据。
  5. RW(读/写选择):读/写选择引脚,用于选择液晶显示器的读写模式。当RW为低电平(0)时,表示写入数据或指令;当RW为高电平(1)时,表示读取数据。
  6. E(使能引脚):使能引脚,用于触发液晶显示器的操作。当E由低电平变为高电平时,液晶显示器执行指令或数据的读/写操作。
    7-14. DB0-DB7(数据引脚):数据引脚用于传输8位数据。在4位并行模式下,通常只使用DB4-DB7引脚。
  7. LED+(背光正极):连接到背光源的正极。通常连接到+5V电源。
  8. LED-(背光负极):连接到背光源的负极。通常连接到电源的地(GND)。
    这些引脚的具体连接方式可能会根据不同的主控制器和电路设计而有所变化。在使用LCD1602之前,应仔细阅读液晶显示器的数据手册,并根据手册提供的引脚说明进行正确的连接。

1.3 LCD1602指令介绍

在这里插入图片描述

LCD1602液晶显示器使用指令来控制其显示行为和操作。通过发送不同的指令,可以设置光标位置、显示模式、清除屏幕内容等。以下是一些常见的LCD1602指令:

  1. 清屏指令(Clear Display): 清除LCD屏幕上的所有内容,并将光标位置设置为起始位置。指令代码为0x01。
  2. 返回首页指令(Return Home): 将光标位置设置为起始位置,但不清除屏幕上的内容。指令代码为0x02。
  3. 光标和显示控制指令:
    • 显示开关指令(Display ON/OFF): 控制LCD的显示开关。可以设置是否显示光标和是否闪烁光标。指令代码为0x0C,其中C表示显示开关控制。
    • 光标和显示方向指令(Entry Mode Set): 控制光标的移动方向和显示的移位方式。可以设置光标移动后是否自动移动显示位置。指令代码为0x06,其中6表示光标和显示方向设置。
  4. 光标位置控制指令:
    • 设置光标位置指令(Set DDRAM Address): 设置光标的位置,即在屏幕上指定的行和列位置。指令代码的高4位为0x8,低4位为指定的位置。
    • 设置CGRAM地址指令(Set CGRAM Address): 设置自定义字符的存储位置。指令代码的高4位为0x4,低4位为指定的位置。
  5. 功能设置指令:
    • 显示模式设置指令(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;             // 使能LCD

    LCD_DATA = command; // 发送命令

    EN = 0;             // 禁用LCD
    delay(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;                     // 使能LCD

    LCD_DATA = c;               // 发送字符数据

    EN = 0;                     // 禁用LCD
    delay(5);                   // 等待一段时间
}

void main() {
    lcdInit();                  // 初始化LCD

    while(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位为0xc
 else 
    p=pos+0x80; //是第一行则命令代码高4位为0x8
 WriteCommand (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 mode
 WriteCommand(0x38); //display mode
 WriteCommand(0x38); //display mode
 WriteCommand(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被广泛应用于以下领域:

  1. 温度和湿度显示器: LCD1602可以用于显示温度和湿度传感器的读数,提供实时的环境信息。
  2. 时间和日期显示器: LCD1602常用于显示当前时间和日期,可以与实时时钟模块(RTC)或其他时间源配合使用。
  3. 系统状态显示器: 在嵌入式系统中,LCD1602可用于显示系统状态信息,如CPU负载、内存使用情况、网络连接状态等。
  4. 计数器和计时器: LCD1602可以用作计数器和计时器的显示器,显示计数值或计时器的剩余时间。
  5. 数字测量显示器: 通过连接传感器和测量模块,LCD1602可以显示各种数字测量值,如距离、压力、光强等。
  6. 报警和警告显示器: 可使用LCD1602来显示报警和警告信息,如安全系统的警报状态、设备故障等。
  7. 文本提示和菜单导航: 对于用户界面设计,LCD1602可用于显示文本提示、菜单选项和导航信息,提供交互式操作界面。
  8. 自定义字符显示器: LCD1602允许用户定义自己的字符,可以用于显示特定的符号、图标或自定义文本。
    这些仅是LCD1602的一些常见应用场景,实际上它在各种嵌入式系统和电子项目中的应用非常广泛。通过编程和控制,可以实现更多复杂的显示功能和交互特性,使LCD1602在项目中发挥更大的作用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

室内精准定位哪个产品抗干扰能力强?可以用于哪些方面?

室内精准定位产品其实有很多&#xff0c;其实它是安装在室内接收型号的一个基站&#xff0c;并且范围有一定的限制&#xff0c;而被定位的人员需要携带定位产品&#xff0c;那么通过室内基站收集到的信息&#xff0c;将会通过专业的系统处理后呈现在相应的设备上&#xff0c;比…

elementui实现复杂表单的实践

简介 文章主要讲述在vue3项目中使用elementui框架实现复杂表单的方式。表单中涉及动态组件的生成、文件上传和富文本编辑器的使用&#xff0c;只会将在实现过程中较复杂的部分进行分享&#xff0c;然后提供一份完整的前端代码。 表单效果演示 基础信息 spu属性 sku详情 关键…

【机器学习】初学者经典案例(随记)

&#x1f388;边走、边悟&#x1f388;迟早会好 一、概念 机器学习是一种利用数据来改进模型性能的计算方法&#xff0c;属于人工智能的一个分支。它旨在让计算机系统通过经验自动改进&#xff0c;而不需要明确编程。 类型 监督学习&#xff1a;使用带标签的数据进行训练&…

【游戏客户端】大话slg玩法架构(二)背景地图

【游戏客户端】大话slg玩法架构&#xff08;二&#xff09;背景地图 大家好&#xff0c;我是Lampard家杰~~ 今天我们继续给大家分享SLG玩法的实现架构&#xff0c;关于SLG玩法的介绍可以参考这篇上一篇文章&#xff1a;【游戏客户端】制作率土之滨Like玩法 PS&#xff1a;和之前…

仕考网:公务员如何备考申论

在备战公务员考试的申论部分时&#xff0c;掌握一定的技巧&#xff0c;遵循特定的步骤是至关重要的。以下是一些备考策略&#xff0c;希望能帮助到大家&#xff1a; 1. 掌握考试大纲和命题趋势 在考试大纲中明确了题目的类型和可能涉及的主题范围&#xff0c;考生可以聚焦到关…

批量提取Word文档中表格内容

1 背景 有一个word文件&#xff0c;其中包含多个格式一致的表格&#xff08;如下图&#xff09;&#xff0c;需要将其内容进行提取&#xff0c;填写到excel中 2 实现代码 ## 导入工具包 from docx import Document import pandas as pd## 读取 Word 文件 document Document(…

MySQL实现数据备份的方式可以基于哪几种?

MySQL 数据库实现数据备份的方式主要有以下几种&#xff1a; 物理备份 (Physical Backup)&#xff1a; 冷备份 (Cold Backup)&#xff1a;在数据库关闭的情况下&#xff0c;直接复制数据库文件&#xff08;数据文件、日志文件等&#xff09;。这种方式操作简单&#xff0c;但是…

UML类图的建立过程

1. 概念层类图 概念层的类图描述的是现实世界中对问题领域的概念理解&#xff0c;类图中表达的类与现实世界的问题领域中的实际事物有着明显的对应关系&#xff0c;类之间的关系也与问题领域中实际事物之间的关系有着明显的对应关系。在概念层类图阶段很少考虑或者几乎不需要考…

应急响应-ELK日志分析系统

&#x1f3bc;个人主页&#xff1a;金灰 &#x1f60e;作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持&#xff01;❤️ &#x1f34a;易编橙终身成长社群&#…

3、视图和模板

续上一篇&#xff0c;这一篇 着重于创建公共接口——“视图” 第三部分——3、视图和模板 1、概述2、编写更多视图原理——django依次访问了什么文件 3、写一个真正有用的视图一个快捷函数 render() render——渲染 4、抛出404错误一个快捷函数 get_object_or_404() 5、使用模…

kvm图形化管理工具virt-manager安装

1、Virt-manager简介 Virt-manager是一个桌面用户界面&#xff0c;用于通过libvirt管理虚拟机。它主要针对KVM虚拟机&#xff0c;但也管理Xen和LXC&#xff08;linux容器&#xff09;。它提供了运行域、它们的实时性能和资源利用率统计信息的摘要视图。向导可以创建新域&#…

MFC扩展库BCGControlBar Pro v35.0 - 可视化管理主题等全新升级

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v35.0已全新发布了&#xff0c;这个版本改进类Visual Studio 2022的视觉主题、增强对多个…

camera-qsc-crosstalk校准数据XTALK回写

问题背景 手机越做越紧凑&#xff0c;需要模组和芯片尺寸越做越小&#xff0c;在尺寸一定的基础上&#xff0c;高像素和大像素&#xff0c;对于手机摄像头来说&#xff0c;一直是一对矛盾的存在。 高像素&#xff1a;带来高分辨率画质大像素&#xff1a;带来暗态下高感光度和…

【MyBatis】——入门基础知识必会内容

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

Covalent Network(CXT)通过社区投票将代币迁移并更名为 CXT,以推动人工智能更深层次的创新

专注于人工智能和 Web3 的模块化数据基础设施 Covalent Network&#xff08;CXT&#xff09;宣布&#xff0c;其治理提案已通过社区投票并顺利实施&#xff0c;即将原生代币 CQT 迁移为新的 CXT 代币&#xff0c;并部署至新的合约。这一关键性转变标志着 Covalent Network&…

Android焦点之InputWindows的更新(一)

找到焦点窗口后&#xff0c;回到DisplayContent的updateFocusedWindowLocked方法中继续往下走 执行到此处会进行InputWindows的更新 InputMonitor#setInputFocusLw&#xff1a;以上过程伴随日志&#xff1a;WindowManager: Input focus has changed to Window{a44139a u0 Noti…

linux系统中SPI驱动框架以及代码的详解

大家好,今天给大家分享一下,如何使用SPI子系统,详细实现以及具体的操作方法。 第一:SPI驱动框架模板 参考内核头文件:include\linux\spi\spi.h。 1、SPI平台总线设备驱动模型 Linux驱动程序开始基于“平台总线设备驱动模型”,将驱动程序分为两块: * 左边注册一个platfo…

算法力扣刷题记录 四十一【N叉树遍历】

前言 依然是遍历问题。由二叉树扩展到N叉树遍历。 记录 四十一【N叉树遍历】 一、【589. N叉树的前序遍历】 题目 给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由空值 null 分隔…

FLinkCDC引起的生产事故(二)

背景&#xff1a; 最近在做实时数据的抽取工作&#xff0c;利用FLinkCDC实时抽取目标库Oracle的数据到Doris中&#xff0c;但是在抽取的过程中&#xff0c;会导致目标库的生产库数据库非常卡顿&#xff0c;为了避免对生产环境的数据库造成影响&#xff0c;对生产环境的数据库利…

Android 自定义Edittext 和TextView 提示文字和填入内容不同的粗细组件

近期项目中又EditText 以及TextView 这两个组件需要用到提示文字 以及 填入文字要保持不同的粗细程度,所以记录一下 首先 是EditText 组件的自定义 BLEditText 继承的这个组件是一个三方的组件,可以在很大程度上减少drawable的编写,有兴趣的可以去相关的Git去看一下 点击查看,…