LCD1602屏幕简介(全网最详细教程)

news2024/11/24 13:37:19

目录

1.接线说明

2.LCD1602显示原理

3.LCD1602时序分析

4.LCD1602显示一个字符

 5.LCD1602显示一行


1.接线说明

第1引脚:GND为电源地

第2引脚:VCC接5V电源正极

第3引脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会 产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。

第4引脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。

第5引脚:RW为读写信号线,高电平(1)时进行读操作,以51为例的简单原理图低电平(0)时进行写操作。

第6引脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。

第7~14引脚:D0~D7为8位双向数据端。第15~16脚:空脚或背灯电源。第15引脚背光正极,第16引脚背光负极。

开发板接线图:

2.LCD1602显示原理

要想搞懂1602如何显示,就只需搞懂两个问题(在哪显示,如何显示)。

首先来说一下在哪显示这个问题:

LCD1602可以显示16*2个字符且通过D0-D7八个引脚传输数据八位数据,每一个显示的位置都对应上图的一个地址。例如我想在第一行的第三个位置显示,那么就可以锁定上表中的“02”,换算成二进制就是0000 0010。听上去很简单,但是LCD1602有个特点就是写入显示地址时要求最高位 D7 恒定为高电平。所以我们想显示真实的地址应该为1000 0010。

在哪显示说清楚了,现在来搞怎么显示这个问题:

 在LCD1602的手册中给出了这样一个表格,我们想显示表格中的字符只需获取某个字符的高位和低位即可。例如我想显示“B”这个字符,就是0100 0010转换成16进制就是0x42,刚好对应‘B’的ASCLL码66。当然我们在编程的时候无需这样操作,只需输入字符即可,编译器会自动编译成对应的ASCLL码。

说到这里会发现无论是传输地址的指令还是传输字符的指令都是通过D0-D7这八根线进行传输,那么我们什么时候传输的数据,说明时候传输的是地址呢。我们靠的是在1602上的RS引脚,RS为高电平1时选择数据寄存器(写数据)、低电平0时选择指令寄存器(写地址)。

3.LCD1602时序分析

LCD1602的时序分为读操作时序和写操作时序,我们先分析一下最重要的写操作时序。我们无论是写入数据还是写入地址都必须要执行写操作,因此我们在编程是最好封装两个函数(写地址函数,写数据函数)。

写时序分析

 首先看RS,RS的时序分析非常简单就正如上文所说我们只需搞清楚到底是是写地址还是写数据 ,写地址为0,写数据为1即可,没有太多好分析的。

R/W:可以从途中看出来R/W的时序低电平贯穿了整个时序,因此我们将R/W置0即可。

E:初始状态为0,然后延时至少tR之后置1(tR的值参考上表,25ns执行一个_nop_();函数即可),置1后要延时至少tPW(上图给出的tPW值为150ns,建议执行两个_nop_();函数),接着再至少延时tF(执行一个_nop_();函数)后置0。

代码如下(基于51单片机),其它单片机此原理都可适用。

#include "reg52.h"
#include "intrins.h"
#include "delay.h"

#define databuffer P0  //定义D0-D7引脚
sbit EN = P2^7;
sbit RS = P2^6;
sbit RW = P2^5;

void Write_cmd_Func(char cmd)  //写命令函数
{
	check_busy();   //检测忙信号函数
	RS = 0;    //RS为低电平:写指令
	RW = 0; 
	
	EN = 0;
	_nop_(); //执行一个空函数,延时约1us
	databuffer = cmd;
	_nop_();
	EN = 1;
	_nop_();
	_nop_();
	EN = 0;  
	_nop_();	
}

void Write_data_Func(char datashow) //写命令函数
{
	check_busy();  //检测忙信号函数
	RS = 1; //RS为高电平:写内容
	RW = 0;	
	
	EN = 0;
	_nop_();
	databuffer = datashow;
	_nop_();
	EN = 1;
	_nop_();
	_nop_();
	EN = 0;  
	_nop_();	
}

读操作时序:

读操作时序主要应用在检测忙信号,忙信号也在手册初始化中使用到,下文会提到。所以我们分析读操作时序的目的也就是为了写检测忙信号函数。 

RS:置0,写命令

RW:高电平贯穿整个时序,因此置1。

E:初始状态为0,延时tR后拉高,之后再延时tPW后拉低。

读操作时序与写操作时序的区别在于:写操作时序在E=0的时候就开始传输数据,而读操作时序要等E=1之后才开始传输数据。

代码如下:

void check_busy()//检测忙信号函数
{
	char tmp = 0x80; //创建一个变量,存放数据

	databuffer=0x80; //初始值为忙,只要当单片机发数据后高位变低后才为不忙
	while(tmp & 0x80){  //检测tmp的高位bf的值是否为高电平,如果为忙程序卡住不往下执行         
                        //高电平:忙   低电平:不忙
	RS = 0;
	RW = 1;
	EN = 0;
	_nop_();
	EN = 1;
	_nop_();	
	_nop_();
	tmp=databuffer;
  EN = 0;
	_nop_();	
	}
}

LCD1602初始化:

当然这里还需注意LCD1602的手册给出了使用前还需将LCD1602初始化,具体初始化内容如下,我们只需调用我们刚刚封装好的写命令函数一步一步执行手册所给的内容即可。

(1)延时 15ms

(2)写指令 38H(不检测忙信号)

(3)延时 5ms

(4)以后每次写指令,读/写数据操作均需要检测忙信号

(5)写指令 38H:显示模式设置

(6)写指令 08H:显示关闭

(7)写指令 01H:显示清屏

(8)写指令 06H:显示光标移动设置

(9)写指令 0CH:显示开及光标设置

void LCD1602_Init() //LCD1602初始化
{

	Delay15ms();
	Write_cmd_Func(0x38);
	Delay5ms();
	Write_cmd_Func(0x38);
	Write_cmd_Func(0x08);
	Write_cmd_Func(0x01);
	Write_cmd_Func(0x06);
	Write_cmd_Func(0x0c);
}

4.LCD1602显示一个字符

我们上面已经把写命令函数,写数据函数,初始化函数等都已经写完了,现在就可以在main函数里面操作让我们的LCD1602显示一个字符了。

代码如下:

void main()
{
	char position = 0x80 + 0x08;  //定义显示的位置
	char datashow = 'E'           //定义显示的字符
	
	LCD1602_Init();
	Write_cmd_Func(position);
	Write_data_Func(datashow);
}

效果如下:

 5.LCD1602显示一行

想要显示一行我们只需基于上面的内容封装一个函数即可。

代码如下:

void LCD1602_ShowLine(char row,char col,char *string) //row:行 col:列 *string:显示内容
{
	switch(row){
		case 1:
		Write_cmd_Func(0x80+col);
		while(*string){
		Write_data_Func(*string);
		string++;
		}
		break;
			
	  case 2:
		Write_cmd_Func(0x80+0x40+col);
		while(*string){
		Write_data_Func(*string);
		string++;
		}
		break;
	}
}

效果如下:

有关LCD1602的内容就分享完了,欢迎广大嵌入式爱好者交流!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于海外的Apple搜索广告

随着Apple平台成为大多数应用的服务支柱,我们需要比以往任何时候都更加关注iOS搜索广告,从而成功与用户建立联系。Apple Search Ads能够通过搜索为我们的应用带来流量,让用户在App Store中输入相关关键词时能够高效、简单地发现应用。 Apple …

超详细的学习笔记:CSS浮动(附代码示例)

笔记参考b站网课:【前端开发入门教程,web前端零基础html5 css3前端项目视频教程】https://www.bilibili.com/video/BV1Kg411T7t9?p124&vd_source06e5549bf018e111f4275c259292d0da 目录 一、结构伪类选择器 二、伪元素 三、标准流 四、浮动 1、…

WEB APIs day3 (1)

一、表单全选反选案例 <!DOCTYPE html><html><head lang"en"><meta charset"UTF-8"><title>全选反选案例</title><style>* {margin: 0;padding: 0;}table {border-collapse: collapse;border-spacing: 0;border…

【ROS2】仿真入门

一、说明 在机器人项目中,仿真是一个具有多种用途的重要方面。首先,您可以测试希望机器人执行的行为代码。其次,您可以使用仿真来测试不同类型的硬件,例如距离传感器、相机或 3D 点云传感器,看看哪种效果最好。第三,可视化模拟的相同软件可以与真正的机器人实时使用,在机…

基于51单片机和proteus的智能垃圾桶系统

此系统是基于51单片机和proteus的仿真设计&#xff0c;功能如下&#xff1a; 1. LCD1602实时显示系统状态。 2. 超声波测距模拟检测人体靠近垃圾桶 3. 舵机模拟开启或关闭垃圾桶桶盖。 4. 垃圾桶满溢后报警指示。 5. LED指示人体状态满溢状态及系统状态。 功能框图如下&am…

BTP Integration Suite学习笔记 - (Unit2) Developing with SAP Integration Suite

BTP Integration Suite学习笔记 - (Unit1) Developing with SAP Integration Suite 这章内容比较大而空 Unit2 iPaaS介绍 2.1 SAP的集成策略 这张图应该不陌生&#xff0c;很多地方都可以看到&#xff0c;SAP对于智能企业的集成策略。它有四个原则&#xff1a; Predefined in…

剑指 offer 动态规划算法题:斐波那契数列(青蛙普通跳台阶)

题目描述&#xff1a;写一个函数&#xff0c;输入 n &#xff0c;求斐波那契&#xff08;Fibonacci&#xff09;数列的第 n 项&#xff08;即 F(N)&#xff09;。斐波那契数列的定义如下&#xff1a;F(0) 0, F(1) 1&#xff0c;F(N) F(N - 1) F(N - 2), 其中 N > 1.斐…

wordpress 导航栏 调用

环境&#xff1a;wordpress6、twentytwentyone模板 一、wp-content/themes/twentytwentyone/functions.php 添加以下代码&#xff1a; 1、注册 (左边是别名&#xff0c;右边是名称。别名会用在导航栏的调用上&#xff0c;名称则显示在菜单后台页面上&#xff1a;外观->菜单…

解密Sketch文件打开秘籍:简单两步操作!

虽然Figma&#xff0c;sketch,xd都很好用&#xff0c;但是设计师在设计工作流中经常会遇到无法在这三者软件中自由导入导出的情况。但是只要我们转变一下思路&#xff0c;因为这三种软件都支持导入sketch格式,所以我们只要将文件格式转成sketch&#xff0c;就能自由的在不同软件…

Visual Studio 新功能:Include 语句清理

Visual Studio 17.7 预览版 3 引入了一项新功能&#xff0c;用来提升开发者的生产力。我们很高兴地宣布这项新功能&#xff1a;Include 语句清理&#xff0c;这是一个帮助你维护干净代码的工具。如需使用此功能&#xff0c;请确保更新到最新版本的 Visual Studio 预览版。 Inc…

macOS 14 Sonama - 小记

文章目录 Sonoma 官方资讯关于 Sonama 命名关于 壁纸Sonoma 官方资讯 macOS Sonoma Preview https://www.apple.com/hk/en/macos/sonoma-preview/官方视频介绍 Apple Events --> Watch the Keynote --> 00:43:13 (约14min) https://www.apple.com/hk/en/apple-events/mac…

WEB APIs day3 (2)

3.其它事件 页面加载事件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthde…

Mac环境下安装nginx并本地部署项目

1、前提 必须安装了homebrew&#xff0c;可在终端输入命令brew -v查看是否已经安装&#xff0c;如果输入指令出现版本号说明已经安装成功 如果未安装先安装&#xff08;homebrew官网地址&#xff09; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/H…

vue2+echarts5:2D地图打点、下钻

准备 要实现地图可点击、下钻&#xff0c;为了使地图有3D效果&#xff0c;原本用map3D需要下载依赖echarts-gl,由于存在地图下钻后在区域内无法展示完整地图&#xff0c;改用2D地图 "echarts": "^5.4.2", // "echarts-gl": "^2.0.9"…

ChatGpt基于第三方API2D服务封装的SpringBoot starter

前置条件&#xff1a; 看下API2D官网&#xff0c;第三方API2D服务对接流程&#xff1a; 其对接文档地址 https://api2d.com/wiki/doc 一:创建一个空的Maven项目 完成后整的项目层级图如下 1.pom.xml 中添加相关依赖包 <?xml version"1.0" encoding"UTF-…

《C语言初阶篇》听说你还不会for循环的变种写法?一文教你彻底搞懂循环语句!

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《快速入门C语言》《C语言初阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言&#x1f4ac; for 语句的介绍&#x1f4ad; for循环默认可以控制几条语句&#xff1f;&#x1f4ad; for语…

vite基于vue3项目,打包之后的文件夹增加一个额外的文件夹

vite将项目打包之后&#xff0c;自动会生成一个dist文件&#xff0c;里边只有/assets,index.html,favicon.ico.这三个文件。 现在需求是打包之后&#xff0c;dist文件夹下多怎加一个healthcheck的文件夹。 功能实现&#xff1a; 使用复制的方法&#xff0c;将healthcheck文件…

[C++] 为什么头文件最好只做声明

文章目录 问题阐述问题分析和解决方法参考 问题阐述 问题描述&#xff1a; 当编译大的复杂的工程时&#xff0c;经常会遇到一个函数在头文件定义的时候&#xff0c;会导致冲突的问题&#xff1b;下图给出显性原因分析&#xff1b; 问题分析和解决方法 参考 C/C中在头文件中定义…

我爱学QT-把QT程序打包成windows文件

学习链接&#xff1a; 把QT程序打包成Windows软件_哔哩哔哩_bilibili 什么是打包和部署&#xff1f; 因为我们要把写好的程序发给用户来用&#xff0c;我们写好的源码也不能随便给别人。 怎么打包和部署&#xff1f; 1.把工程切换到release模式 这样点 &#xff0c;然后编译…

阿里大模型——通义千问

目录 前段时间世界人工智能大会在上海举行&#xff0c;我去参观感受了一下&#xff0c;整个感受是有点名不副实的&#xff0c;参展的有各种银行、车企、还有中国电信、联通三个运营商都来凑热闹了。 但是也有Google、华为、阿里、腾讯、商汤这样的大厂。现场也可以体验一些大厂…