51单片机--LCD1602

news2024/11/18 7:47:49

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.coloradmin.cn/o/788781.html

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

相关文章

使用sftp

一、背景 新项目组前端部署方式是Build打包生成dist文件&#xff0c;交由后端部署。后来知道了vscode安装sftp前端可以自行部署。 二、实操 1、vscode安装sftp 2、 配置 ①F1 / ctrlshiftp ②命令行输入sftp -> 选择 sftp: Config ③配置信息介绍 {"name"…

liteflow overall笔记

偶然看到liteflow的介绍&#xff0c;感觉是一个local单机版本的conductor。 核心代码的注释非常好&#xff0c;在我看过的开源代码里面数一数二单元测试完备&#xff0c;要学习用法基本都可以在单元测试看到相关代码核心基于阿里的ElExpress&#xff0c;使用方式值得学习监控稍…

网络编程八股文

文章目录 tcp粘包问题&#xff1f;BIO,NIO,AIO是什么&#xff1f;零拷贝是什么&#xff1f;浏览器发出一个请求到收到响应的具体步骤&#xff1f;select, poll, epoll区别是什么&#xff1f;https是如何保证安全传输的&#xff1f;tcp的三次握手和四次挥手&#xff1a;tcp网络分…

LZ77算法理论

发布时间&#xff1a;2023-07-25 14:58:28 英文介绍文档&#xff1a;https://archive.ph/F4pg7 很短&#xff0c;看一遍10&#xff5e;20分钟应该够了。 1. 算法用到的术语&#xff1a; Input stream 要被压缩的字符序列 Character 输入流中的基本数据元素 Coding position…

RealsenseD455 + ubuntu18.04 + ROS-Melodic的使用

系统&#xff1a;Ubuntu18.04 ros: melodic 相机&#xff1a;intel RealSense D455一、安装依赖和 Realsense SDK sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE || sudo apt-key adv --keyserver hkp://keyserver…

机器人导航(3):导航相关消息

文章目录 地图nav_msgs/MapMetaDatanav_msgs/OccupancyGrid 里程计坐标变换定位目标点与路径规划激光雷达相机深度图像转激光数据depthimage_to_laserscan简介depthimage_to_laserscan节点说明depthimage_to_laserscan使用 地图 地图相关的消息主要有两个: nav_msgs/MapMetaD…

【雕爷学编程】Arduino动手做(171)---micro:bit 开发板

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#xff0c;这…

“VCMessage”任务意外失败

从网上查到很多都是说设置这个位置&#xff0c;但是我的已经是对的&#xff0c;还是出现 “VCMessage”任务意外失败这个错误。 又查到一个人说解决方法是更正OutputPath或从父级继承&#xff1a;右键单击项目,然后转到"属性">"链接器">"常规&q…

开源项目注意事项

fork项目后&#xff0c;记得另外开启一个分支然后在新分支上进行开发&#xff0c;push到仓库后从分支往原项目提交。 否则会出现Partially verified&#xff08;导致提交pr后auto-merge失败&#xff09; 注意git提交操作 https://blog.csdn.net/sonichenn/article/details/13…

matplotlib从起点出发(3)_Tutorial_3_Image

1 图像教程 matplotlib可以简单地处理并显示图像&#xff0c;当然&#xff0c;它不是一个专业的图像处理库&#xff0c;所以也不要拿它来与opencv进行比较。 2 启动命令 首先&#xff0c;让我们启动IPython。它是对标准python提示符的最出色的增强&#xff0c;它与matplotli…

OpenHarmony与HarmonyOS联系与区别

目录 1. 背景 2.OpenHarmony 3.HarmonyOS 4.鸿蒙生态 5.OpenHarmony与HarmonyOS的技术上实现区别 1.语言支持 2.SDK 的不同 3.运行调测方式不同 4.对APK的兼容性不同 5.包含关系 6.调试命令 6.何时选择OpenHarmony或是HarmonyOS&#xff1f; 1. 背景 开篇就说“关于…

企业数字化转型中容易出现哪些误区?

对信息化和数字化的投入产出认识有误 在和一些从事企业信息化数字化建设的朋友的沟通中&#xff0c;发现很多企业老板对信息化和数字化投入产出认知上确实有偏差&#xff0c;他们总觉得投入一部分&#xff0c;就得有相应的产出&#xff0c;在他们心里信息化的投入产出如下图曲线…

强化学习SAC算法对数概率公式推导

强化学习 SAC算法 对数概率推导 先上原论文&#xff1a; 首先对公式 ( 20 ) (20) (20) 做推导。 公式 ( 20 ) (20) (20) 的数据流应该是这样的&#xff1a; s → π ( u ∣ s ) → u → a tanh ⁡ ( u ) → a \mathbf{s}\rightarrow \pi(\mathbf{u}|\mathbf{s}) \rightar…

Vue3标签(Tag)

APIs 参数说明类型默认值必传closable标签是否可以关闭booleanfalsefalsecolor标签颜色&#xff0c;预置多种常用颜色&#xff1a;success, processing, error, warn, pink, red, orange, green, cyan, blue, purplestring‘’falseicon设置图标string | slot‘’false Event…

【深度学习】【Image Inpainting】Generative Image Inpainting with Contextual Attention

Generative Image Inpainting with Contextual Attention DeepFillv1 (CVPR’2018) 论文&#xff1a;https://arxiv.org/abs/1801.07892 论文代码&#xff1a;https://github.com/JiahuiYu/generative_inpainting 论文摘录 文章目录 效果一览摘要介绍论文贡献相关工作Image…

MySQL数据备份与恢复练习

目录 1.创建student和score表 2.为student表和score表增加记录 3.备份数据库school到/backup目录 4.备份MySQL数据库为带删除表的格式&#xff0c;能够让该备份覆盖已有数据库而不需要手动删除原有数据库 5.直接将MySQL数据库压缩备份 6.备份MySQL数据库某个(些)表。此例备…

『Python学习笔记』Python代码打包成pip包(可pip install)|查看安装torch、cuda和cudnn版本号

Python代码打包成pip包(可pip install)|查看安装torch、cuda和cudnn版本号 文章目录 一. pip包的好处二. 简单小例子2.1. 创建Python包2.2. 构建Python包2.3. 上传到PyPI2.4. pip安装测试 三. CLIP多模态模型相关例子3.1. Chinese-CLIP例子3.2. CLIP-ONNX例子3.3. 问题1和问题…

vue使用driver.js完成页面引导的功能

需求&#xff1a;用户首次进入的时候肯定不知道一些功能是干什么在哪里&#xff0c;之后给用户一个页面引导&#xff0c;教他怎么做。 点击插件driver.js官方文档 效果&#xff1a; 1.下载driverjs 我默认下载的是最新版 "driver.js": "^1.0.5",&#x…

MySQL 高级SQL语句(一)

目录 一、高级SQL语句&#xff08;进阶查询&#xff09; 1.1 select 1.2 distinct 1.3 where 1.4 and 和 or 1.5 in 1.6 between 1.7 通配符 1.8 like 1.9 order by 一、高级SQL语句&#xff08;进阶查询&#xff09; 先准备2个表 一个location表&#xff1a; use m…

私人记账本程序cashbook

什么是 cashbook &#xff1f; cashbook 是一个私人或家庭记账程序&#xff0c;支持私有化部署&#xff0c;商用或其他使用不受约束。建议使用者每年创建一个账本&#xff0c;图表功能可以起到分析全年数据的效果。 官方提供了演示站点&#xff0c;但不建议记录真实数据 演示账…