51单片机--LCD1602

LCD1602的介绍

LCD1602是一种字符型液晶显示模块,通常用于嵌入式系统、单片机等领域。它由LCD(液晶显示屏)、HD44780控制驱动主电路及其扩展驱动电路、少量电阻、电容元件等组成。
在这里插入图片描述
LCD1602具有以下特点和功能:

  1. 显示能力:LCD1602可以同时显示两行,每行16个字符,共32个字符。
  2. 控制接口:通常使用8位数据总线D0-D7、RS、R/W、EN三个控制端口进行控制
  3. 工作电压:一般工作电压为5V。
  4. 显示原理:利用液晶的物理特性,通过电压对其显示区域进行控制,从而显示出字符和简单图形。
  5. 硬件参数:LCD1602主要参数包括工作温度范围、显示区域尺寸、像素尺寸、视角等。
  6. 引脚功能:LCD1602的引脚包括VCC(电源正极)、GND(电源负极)、V0(液晶对比度调节)、RS(寄存器选择)、R/W(读/写选择)、EN(使能)、D0-D7(数据总线)、A(背光正极)、K(背光负极)等。

在这里插入图片描述

工作原理

LCD1602使用HD44780芯片作为控制器,通过与主控芯片(如单片机或微处理器)进行通信来控制液晶显示屏。

工作时,主控芯片向LCD1602发送命令和数据。在发送之前,需要设置RS引脚的电平来区分是发送命令还是发送数据。当RS为高电平时,表示发送的是数据;当RS为低电平时,表示发送的是命令。通过设置RW引脚的电平来区分是写入操作还是读取操作,当RW为高电平时,表示读取操作;当RW为低电平时,表示写入操作;

这里的数据输入是并行输入,操作就是直接将数据传入P0寄存器即可;

在发送命令或数据后,需要通过控制引脚中的E引脚来触发LCD1602对命令或数据进行处理。通过设置E引脚的上升沿或下降沿触发,将数据写入液晶单元并显示相应的内容。

此外,LCD1602通常还包含背光引脚,用于控制显示屏背光的开关。通过控制背光引脚的电平,可以使LCD1602的显示内容在不同的光照条件下更好地被观察到。

在这里插入图片描述
上图是内部的大致存储结构;上面说过这是一块字符型的LCD模块我们输入的数字或者字符,都将通过ASCII码值的转换在字模库中找出对应的码值然后在屏幕进行显示
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

时序结构

在这里插入图片描述
在时序结构中,我们要做有写数据和写指令的操作;
写指令:RS引脚置于高电平,表示要选择指令;RW置于低电平,表示选择写入;然后将对应的数据给到P0寄存器;最后将使能置高电平,置完需要进行延迟1ms;

输入的数据由控制器芯片将信号传递给液晶模块的每个像素点。延迟操作可以确保驱动信号在传递过程中达到稳定状态;当然LCD1602的也需要一定的响应时间

写数据:将RS引脚置于低电平,其他操作与写指令一致;

代码:

//引脚定义
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;
#define LCD_DATAPORT P0//延迟1ms函数
void Delay1ms()		//@11.0592MHz
{unsigned char i, j;_nop_();i = 2;j = 199;do{while (--j);} while (--i);
}//LCD1602写入指令
void LCD_WriteCommand(unsigned char Command)
{LCD_RS=0;LCD_RW=0;LCD_DATAPORT=Command;LCD_E=1;Delay1ms();LCD_E=0;Delay1ms();
}//LCD1602写入数据
void LCD_WriteData(unsigned char Data)
{LCD_RS=1;LCD_RW=0;LCD_DATAPORT=Data;LCD_E=1;Delay1ms();LCD_E=0;Delay1ms();
}

LCD1602操作流程

在这里插入图片描述
这里我们只进行初始化和字符显示操作;
初始化:通过写入命令的操作,进行初始化;

void LCD_Init()
{LCD_WriteCommand(0x38);//功能设置:八位数据接口两行显示LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关LCD_WriteCommand(0x06);//读数据,写入操作后,光标自动加一LCD_WriteCommand(0x01);//清屏操作}

字符显示:将DDRAM的地址与写入的行列位置进行按位或,找到对应光标位置;

void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char)
{if(Line==1){LCD_WriteCommand(0x80|(Column-1));//0x80|AC	,设置光标位置}else{LCD_WriteCommand(0x80|(Column-1)+0x40);}LCD_WriteData(Char);//写入数据,一个字符一个字符进行写入
}

原代码

LCD1602.h

#ifndef __LCD1602_H__
#define __LCD1602_H__LCD_Init();
LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char);
void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char* String);
void LCD_ShowNum(unsigned char Line,unsigned char Colunm,unsigned int Number,unsigned char lenth);
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char lenth);
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Lenth);
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Lenth);
#endif

LCD1602.c

#include <REGX52.H>
#include<INTRINS.H>
//引脚定义
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;
#define LCD_DATAPORT P0//延迟函数
void Delay1ms()		//@11.0592MHz
{unsigned char i, j;_nop_();i = 2;j = 199;do{while (--j);} while (--i);
}//LCD1602写命令
void LCD_WriteCommand(unsigned char Command)
{LCD_RS=0;LCD_RW=0;LCD_DATAPORT=Command;LCD_E=1;Delay1ms();LCD_E=0;Delay1ms();
}//LCD1602写数据
void LCD_WriteData(unsigned char Data)
{LCD_RS=1;LCD_RW=0;LCD_DATAPORT=Data;LCD_E=1;Delay1ms();LCD_E=0;Delay1ms();
}//LCD1602初始化函数
void LCD_Init()
{LCD_WriteCommand(0x38);LCD_WriteCommand(0x0c);LCD_WriteCommand(0x06);LCD_WriteCommand(0x01);}//LCD1602设置位置
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{if(Line==1){LCD_WriteCommand(0x80|(Column-1));}else{LCD_WriteCommand(0x80|(Column-1)+0x40);}
}//LCD1602显示字符
void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char)
{LCD_SetCursor(Line,Column);LCD_WriteData(Char);
}//LCD1602显示字符串
void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char* String)
{unsigned char i;LCD_SetCursor(Line,Column);//利用循环将一个个字符进行写入,光标会自动加一for(i=0;String[i]!='\0';i++)//字符串的终止字符'\0'{LCD_WriteData(String[i]);}
}//返回值=X的Y次方
int LCD_Pow(int X,int Y)
{unsigned char i;int Result=1;for(i=0;i<Y;i++){Result*=X;}return Result;
}//LCD1602显示数字
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char lenth)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=lenth;i>0;i--){LCD_WriteData('0'+Number/LCD_Pow(10,i-1)%10);//通过除和取余进行取数字对应的位数//由于取得是ASCII码值,对应的数字前面需要增加'0'字符}
}//显示有符号十进制所给数字
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char lenth)
{unsigned char i;unsigned int Number1;LCD_SetCursor(Line,Column);if(Number>=0){LCD_WriteData('+');Number1=Number;}else{LCD_WriteData('-');Number1=-Number;}for(i=lenth;i>0;i--){LCD_WriteData('0'+Number/LCD_Pow(10,i-1)%10);}
}//显示以十六进制所给的数字
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Lenth)
{unsigned char i;unsigned char SingleNumber;LCD_SetCursor(Line,Column);for(i=Lenth;i>0;i--){SingleNumber=Number/LCD_Pow(16,i-1)%16;if(SingleNumber<10){LCD_WriteData('0'+SingleNumber);}else{LCD_WriteData('A'+SingleNumber-10);}}}//在LCD1602位置显示二进制数字
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Lenth)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Lenth;i>0;i--){LCD_WriteData('0'+Number/LCD_Pow(2,i-1)%2);}
}

main.c

#include <REGX52.H>
#include"LCD1602.h"void main()
{LCD_Init();LCD_ShowBinNum(1,1,10,4);LCD_ShowHexNum(1,6,255,3);LCD_ShowNum(2,1,789,4);
}

对于main.c的内容,只是对LCD1602进行测试,读者可以自己进行对应的尝试;

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

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

相关文章

面试总结-Redis篇章(八)——Redis分布式锁

JAVA 面试总结-Redis分布式锁 模拟抢券场景 通过下面方法添加Synchronized锁来防止上述情况&#xff0c;如果上面是单体服务没有问题&#xff0c;但是如果项目是集群部署&#xff0c;会出现下面的问题&#xff0c;因为Synchronized是属于本地的锁端口8080和8081同时访问&#x…

Qt 第二讲 登录框完善,登录成功后,进入新的界面;新建工程文件,默认提供的代码注释信息;前两讲思维导图

一&#xff0c;代码完善 头文件 #ifndef ZUOYE_H #define ZUOYE_H#include <QWidget> #include <QDebug> #include <QIcon> #include <QPushButton> #include <QLineEdit> #include <QLabel> //#include <QTextToSpeech>QT_BEGIN_…

⛳ 面向对象面试题

面向对象面试题目录 ⛳ 面向对象面试题&#x1f69c; 一&#xff0c;成员变量&#xff0c;局部变量&#xff0c;类变量存储在内存的什么地方&#xff1f;&#x1f43e; 1.1&#xff0c;类变量&#xff08;静态成员变量&#xff09;&#x1f4dd; 1.2&#xff0c;成员变量⭐ 1.3…

网络安全进阶学习第七课——文件包含漏洞

文章目录 一、文件包含概念二、文件包含漏洞原理三、文件包含分类文件包含分为两种&#xff1a; 四、与文件包含相关的配置文件&#xff1a;&#xff08;php.ini文件&#xff09;五、与文件包含有关的函数1、include()2、include_once()3、require()4、require_once() 六、文件…

iTOP-STM32MP157开发板Linux Misc驱动-编译驱动程序

这里我们以 stm32mp157 开发板为例&#xff0c;将杂项设备驱动编译成模块&#xff0c;请参考本手册第三十七章 Linux 内核模块。我们将 misc.c 文件拷贝到 Ubuntu 的/home/nfs/03 目录下。将上次编译 helloworld 的 Makefile 文 件拷贝到 misc.c 同级目录下&#xff0c;修改 …

解决Unable to load authentication plugin ‘caching_sha2_password‘

连接Mysql8时报错&#xff1a; java.sql.SQLException: Unable to load authentication plugin caching_sha2_password.原因 不同版本的认证插件不同造成的 8版本前是&#xff1a;default_authentication_pluginmysql_native_password 8版本后是&#xff1a;default_authenti…

Postman抓包教程

目录 什么是抓包&#xff1f; 如何使用 Postman 进行抓包 查看历史抓包数据 使用抓包数据进行接口测试和开发 抓包技巧和注意事项 什么是抓包&#xff1f; 在计算机网络中&#xff0c;抓包是指捕获网络流量的过程。抓包工具可以截获进出计算机网络的数据流&#xff0c;并将…

Python numpy库的应用、matplotlib绘图、opencv的应用

numpy import numpy as npl1 [1, 2, 3, 4, 5]# array():将列表同构成一个numpy的数组 l2 np.array(l1) print(type(l2)) print(l2) # ndim : 返回数组的轴数&#xff08;维度数&#xff09; # shape&#xff1a;返回数组的形状&#xff0c;用元组表示&#xff1b;元组的元素…

SpringCloudAlibaba微服务实战系列(五)Sentinel1.8.5+Nacos持久化

Sentinel数据持久化 前面介绍Sentinel的流控、熔断降级等功能&#xff0c;同时Sentinel应用也在面临着一个问题&#xff1a;我们在Sentinel后台管理界面中配置了一堆流控、降级规则&#xff0c;但是Sentinel一重启&#xff0c;这些规则全部消失了。那么我们就要考虑Sentinel的持…

1、传统锁回顾(Jvm本地锁,MySQL悲观锁、乐观锁)

目录 1.1 从减库存聊起1.2 环境准备1.3 简单实现减库存1.4 演示超卖现象1.5 jvm锁1.6 三种情况导致Jvm本地锁失效1、多例模式下&#xff0c;Jvm本地锁失效2、Spring的事务导致Jvm本地锁失效3、集群部署导致Jvm本地锁失效 1.7 mysql锁演示1.7.1、一个sql1.7.2、悲观锁1.7.3、乐观…

深度学习:常用优化器Optimizer简介

深度学习&#xff1a;常用优化器Optimizer简介 随机梯度下降SGD带动量的随机梯度下降SGD-MomentumSGDWAdamAdamW 随机梯度下降SGD 梯度下降算法是使权重参数沿着整个训练集的梯度方向下降&#xff0c;但往往深度学习的训练集规模很大&#xff0c;计算整个训练集的梯度需要很大…

集睿致远推出CS5466多功能拓展坞方案:支持DP1.4、HDMI2.1视频8K输出

ASL新推出的 CS5466是一款Type-C/DP1.4转HDMI2.1的显示协议转换芯片,&#xff0c;它通过类型C/显示端口链路接收视频和音 频流&#xff0c;并转换为支持TMDS或FRL输出信令。DP接收器支持81.Gbp s链路速率。HDMI输出端口可以作为TMDS或FRL发射机工作。FRL发射机符合HDMI 2.1规范…

OpenCvSharp (C# OpenCV) 二维码畸变矫正--基于透视变换(附源码)

导读 本文主要介绍如何使用OpenCvSharp中的透视变换来实现二维码的畸变矫正。 由于CSDN文章中贴二维码会导致显示失败,大家可以直接点下面链接查看图片: C# OpenCV实现二维码畸变矫正--基于透视变换 (详细步骤 + 代码) 实现步骤 讲解实现步骤之前先看下效果(左边是原图,右边…

菜鸡shader:L13 渐隐渐显的UV动画

文章目录 SD部分Shader代码部分 呃呃&#xff0c;这是目前我学习庄懂AP01课程的最后一节了&#xff0c;我看了一下21集之后的内容是关于LightingMap&#xff0c;目前感觉还用不到&#xff0c;加上之前参与过一个项目里面也有用到LightingMap&#xff0c;也算了解过&#xff0c;…

拦截Bean使用之前各个时机的Spring组件

拦截Bean使用之前各个时机的Spring组件 之前使用过的BeanPostProcessor就是在Bean实例化之后&#xff0c;注入属性值之前的时机。 Spring Bean的生命周期本次演示的是在Bean实例化之前的时机&#xff0c;使用BeanFactoryPostProcessor进行验证&#xff0c;以及在加载Bean之前进…

NISP含金量?NISP真的有必要考么?NISP好考吗?NISP二级为什么那么贵?

NISP证书简述 NISP证书三个级别&#xff0c;分别是&#xff1a;一级、二级、三级&#xff08;专项&#xff09; 证书。其每一项资格证书都有不同的优点&#xff0c;但是优点各有 相同&#xff0c;而且拥有NISP二级证书可以免考更换CISP资格证书&#xff0c;那么证书含金量如何下…

rcu链表综合实践

基础知识 rcu-read copy update的缩写。和读写锁起到相同的效果。据说牛逼一点。对于我们普通程序员&#xff0c;要先学会使用&#xff0c;再探究其内部原理。 链表的数据结构&#xff1a; struct list_head {struct list_head *next, *prev; };还有一种&#xff1a;struct h…

STM32(HAL库)驱动st7789LCD屏幕(7引脚240*240)

目录 1、简介 2、CubeMX初始化配置 2.1 基础配置 2.1.1 SYS配置 2.1.2 RCC配置 2.2 屏幕引脚配置 2.3 项目生成 3、KEIL端程序整合 3.1 LCD驱动添加 3.2 函数修改 3.2.1 lcd.h修改 3.2.2 lcd_innit.h 修改 3.2.3 lcd.c修改 3.2.4 lcd_inut.c修改 3.3 主函数代码 3.3…

Django学习笔记-表单(forms)的使用

在Django中提供了了form表单&#xff0c;可以更为简单的创建表单模板信息&#xff0c;简化html的表单。 一、网页应用程序中表单的应用 表单通常用来作为提交数据时候使用。 1.1 创建表单模板文件夹 在项目文件夹下创建一个template文件夹&#xff0c;用于存储所有的html模…

使用百度地图SDK计算距离

说明&#xff1a;通过百度地图提供的SDK&#xff0c;可以计算出两个地点之间的距离&#xff0c;另外还有行驶路线等等。本文介绍如果使用百度地图SDK&#xff0c;并用java代码实现。 申请 首先需要登录百度地图的官网&#xff0c;申请开发者认证&#xff0c;个人认证一般都很…