Lcd1602——斌哥51

2023-05-16

最新修改时间2022/7/22
LCD1602
在这里插入图片描述
16代表显示16个字符,2代表总共显示两行
芯片的工作电压是4.5-5.5v
工作电流2.0ma(5V)
模块最佳工作电压5.0v
字符尺寸:2.95X4.25(wxh)mm
管脚说明:
在这里插入图片描述
VSS:电源地
VDD:接5v电源
VL:液晶显示器对比度调整端,接正电源的时候对比度弱,接地的时候对比度高。对比度过高会产生鬼影,所以在使用的时候,串接一个10k的电位器调整对比度。(对比度调节可以理解为)
补充:
对比度是指投影图像最亮和最暗区域之间的比率,比值越大,从黑到白的渐变层次就越多,从而色彩表现越丰富。对比度对视觉效果的影响非常关键,一般来说对比度越大,图像越清晰醒目,色彩也越鲜明艳丽;而对比度小,则会让整个画面都灰蒙蒙的。高对比度对于图像的清晰度、细节表现、灰度层次表现都有很大帮助。对比度越高图像效果越好,色彩会更饱和,反之对比度低则画面会显得模糊,色彩也不鲜明。

RS:Register selection寄存器选择位。高电平选择数据寄存器,低电平选择指令寄存器。(高数据,低命令
R/W:为读写信号线,高电平进行读操作,低电平进行写操作。
当RS和R/W同时为低电平的时候,可以写入指令或者写入显示地址。高读,低写
当RS为低,R/W为高的时候,可以用于读忙操作。
当RS为高,R/W为低的时候,可以用于写数据。
E:为使能端,当E从高电平降为低电平的时候,液晶模块开始执行命令。
D0-D7:8位数据线。
BLA:背光源正极(调节亮度)
BLK:背光源负极(调节亮度)

显示地址:

在这里插入图片描述
重点:
我们直接看的话,第二行第一个地址是0x40,那是不是我们可以直接操作0x40这个地址,使得光标定位在这个位置呢?
答案是不可以!!!!!
因为写入显示地址的时候,要求D7为1,所以实际写入的地址信息是40h(01000000)+80h(10000000)=c0h(11000000)
也就是说我们在操作显示地址的时候要记得加上80h

在这里插入图片描述

注意看第一行的起始地址是0x00末尾的地址是0x27
那么第一行总共有40个可供操作的地址,那么两行就是80个可供操作的地址。
也就是说每个字符占8位,总共80个字符,就是80*8=640位,也就是64字节的RAM缓冲区。

而实际我们使用的时候值显示每行前16个字符。
而LCD1602只能显示ASCII表中的打印字符(注意ASCII有两种字符,一种是控制字符,一种是打印字符)

在这里插入图片描述
这里说明一下,我们在打印相应的字符时可以通过加上’0’(字符0)的方式对应打印输出目标。也可以直接加上十进制的数字48

指令集:(我们控制模块的命令)
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
DDRAM : 显示用ram,直接和屏幕上的点相对应。屏幕上的一个点和ddram中的一个位对应,字符屏的ddram和图形屏的ddram有一点点区别。
CGROM : 字模存储用空间。你要显示某个ascii字符时,要显示字符的字模就存在这里。

在这里插入图片描述

读时序:
在这里插入图片描述
注意时间间隔
比如:我们读取有效数据要求间隔100ns
我们的51单片是11.0592mhz
我们的机器周期就有(1/11.0592mhz)*12 约等于1.085us,所以我们的指令周期是显然是足够的
在这里插入图片描述
写操作时序:
在这里插入图片描述
源文件如下:
main.c


# include "lcd1602.h"
# include "display.h"

 uchar num = 0;  //0-255
 uint i = 0;

//下面的主函数是显示单个字符的方式
/************************
*				主函数
*************************/
//void main (void)
//{
//		Lcd1602_busycheck();
//		Lcd1602_Write_CMD(0x01);  //清屏
//		Lcd1602_Write_CMD(0x06);	//每次写入新数据,光标右移,屏幕不移动
//		Lcd1602_Write_CMD(0x0C);   //打开屏幕,光标不显示
//		Lcd1602_Write_CMD(0x38);   //选择8位的数据位,并且允许两行都可以用来显示
//		
//		Lcd1602_Write_CMD(0x80);   //写地址,从第一行的第一位开始写。0x00 + 0x80 
//	
//	
//		Lcd1602_Write_DAT('O') ;   //写显示数据
//		Lcd1602_Write_DAT('K') ;	//写显示数据
//}



//主函数,显示字符串,并可以指定位置
//void main (void)
//{
//		Lcd1602_busycheck();
//		Lcd1602_Write_CMD(0x01);  //清屏
//		Lcd1602_Write_CMD(0x06);	//每次写入新数据,光标右移,屏幕不移动
//		Lcd1602_Write_CMD(0x0C);   //打开屏幕,光标不显示
//		Lcd1602_Write_CMD(0x38);   //选择8位的数据位,并且允许两行都可以用来显示
//		
//		LCD_Position(0,7);  //从第零行的第七个开始显示
//	
//		LCD_dispaly("good");
//		
//}


//动态显示
void main (void)
{
	 
	
		Lcd1602_busycheck();
		Lcd1602_Write_CMD(0x01);  //清屏
		Lcd1602_Write_CMD(0x06);	//每次写入新数据,光标右移,屏幕不移动
		Lcd1602_Write_CMD(0x0C);   //打开屏幕,光标不显示
		Lcd1602_Write_CMD(0x38);   //选择8位的数据位,并且允许两行都可以用来显示
		
		LCD_Position(0,7);  //从第零行的第七个开始显示
	
		LCD_dispaly("good");
		while(1)
		{
			num++;   //num是uchar型,最大255
			LCD_Position(1,0);
			Lcd1602_Write_DAT(num/100 + '0');
			Lcd1602_Write_DAT(num%100/10 + '0');
			Lcd1602_Write_DAT(num%100%10 + '0');
			i =5000;
			while(i--);
		}
}

lcd1602.c


# include "lcd1602.h"
# define uchar unsigned char
# define uint unsigned int 

/**********************************
*				忙检检测函数								*
*				判断LCD1602当前是否在忙		*
***********************************/

void Lcd1602_busycheck()  
{
	uint sta = 0;  //定义一个变量用来存储Dataport读到的数据
	
	Dataport = 0xff; //人为释放Dataport数据线
	
	RS = 0;      //命令
	RW = 1;      //读
	
	//忙则循环判断,不忙则结束循环
	do
	{

		
		E = 1;        //使能
		
		sta = Dataport;  //读取数据端口的值,如果显示屏不忙那就是0xFF,如果忙就不是0xFF
		
		E = 0;
		
		
	}while((sta & 0x80) == 0x80);   //0x80 就是1000 0000 我们用来判断端口的最高位是不是1,如果是1则代表忙,不是1则不忙

}


/**********************************
*				写数据函数								*
*				判断LCD1602当前是否在忙		*
***********************************/

void Lcd1602_Write_DAT(uchar Dat)  //一次写8Bit
{
	Lcd1602_busycheck();		//检测忙不忙
	
	RS = 1;  //数据
	RW = 0;		//写操作
	
	Dataport = Dat;
	
	E = 1;    //当E由高电平变为低电平的时候,液晶开始执行命令
	_nop_();

	E = 0;
  
}
	
/**********************************
*				写命令函数								*
*				判断LCD1602当前是否在忙		*
***********************************/
void Lcd1602_Write_CMD(uchar Comd)  //一次写8Bit
{
	Lcd1602_busycheck();		//检测忙不忙
	
	RS = 0;  //命令
	RW = 0;		//写操作
	
	Dataport = Comd;
	
	E = 1;    //当E由高电平变为低电平的时候,液晶开始执行命令
	_nop_();
	E = 0;
}

lcd1602.h

# ifndef __lcd1602_H__
# define __lcd1602_H__

# include <reg51.h>
# include <intrins.h>

# define uchar unsigned char
# define uint unsigned int 
# define Dataport P0   //以P0作为数据口


sbit RS = P3^5;  //命令或数据,高数据,低命令

sbit RW = P3^6;	//写或读,高读低写

sbit E = P3^4;	//使能

void Lcd1602_busycheck(); 		//忙检测
void Lcd1602_Write_DAT(uchar Dat);    //写数据
void Lcd1602_Write_CMD(uchar Comd);    //写命令

# endif

display.c

# include "display.h"


//LCD显示字符串函数
void LCD_dispaly(uchar* str)
{
	//"\0"在c语言中代表“字符串结束符”。“\0”的ASCII码为“0”,
	//也就是空字符;字符串总是以“\0”作为串的结束符;因此当把一个字符
	//串存入一个数组时,也把结束符“\0”存入数组,并以此作为该字符串是
	//否结束的标志。”
	while(*str)  //比如输入good   总共有g o o d \0   5个元素
	{
			Lcd1602_Write_DAT(*str++) ; 
	}

}


//指定写入数据的位置
void LCD_Position(bit x,uchar y)  //定义行x,定义列y
{
	uchar position;
	if(x == 0)
		position = 0x80 + y;		
	else
		position = 0xC0 + y;
	
	Lcd1602_Write_CMD(position);
}

display.h

# ifndef __display_H__
# define __display_H__

# include "lcd1602.h"

# define uchar unsigned char
# define uint unsigned int 
	
void LCD_dispaly(uchar* str);
void LCD_Position(bit x,uchar y) ;
	
#endif
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lcd1602——斌哥51 的相关文章

  • 你可以写个LCD1602的驱动代码,从当初的起点开始。

    你可以写个LCD1602的驱动代码 xff0c 从当初的起点开始 你现在才明白正确弄单片机的方式
  • LCD1602液晶显示屏的入门级应用(一)

    嵌入式小白 xff0c 今天用到1602 xff0c 被CGRAM DDRAM CGROM搞得乱七八糟 xff0c 特此记录一下 xff0c 供大家参考 首先 xff0c 1602液晶显示屏除了电源 地以外 xff0c 有3个控制引脚 RS
  • STC12C5A60S2_LCD1602驱动

    文章目录 LCD1602 HLCD1602 cmain c LCD1602 H 代码如下 xff1a span class token macro property span class token directive hash span
  • 详解LCD1602液晶显示屏的使用

    1 简介 作为各类单片机实物设计的常用显示屏 xff0c LCD1602是一种专门用于显示字母 数字 符号等点阵式LCD xff0c 其1602是指LCD显示的内容为16X2 xff0c 即可以显示两行 xff0c 每行16个字符 xff0
  • LCD1602和12864显示器

    1 LCD显示器相关背景 1 1 LCD简介 1 显示器 xff0c 常见显示器 2 LCD Liquid Crystal Display xff0c 液晶显示器 xff0c 原理介绍 3 LCD应用领域 4 LED OLED 1 2 电子
  • LCD1602按下复位后乱码的问题

    1602按下后会有乱码的问题 xff0c 其实根本上是硬件引起的 某些最小系统板的复位电路没做好 xff0c 按下复位键后 xff0c 就会产生乱码 但是出现这种现象 xff0c 是可以用软件后期修正的 由于LCD复位后默认是8线输入 xf
  • LCD1602模块如何显示自定义字符

    相信大家现在知道了如何通过查字库表的方法来显示表中的任意一个字符 假如现在我想显示某个温度值 xff0c 需要标志出温度符号 C xff0c 现在你去字库表里面查找 xff0c 发现根本找不到这个符号 xff0c 那怎么办 xff1f 下面
  • STM32F407的LCD1602液晶显示程序

    LCD1602 H ifndef LCD1602 H define LCD1602 H include sys h include stm32f4xx h unsigned char message 20 unsigned char mes
  • Arduino--LCD1602(IIC)

    xff08 1 xff09 简介 前篇文章介绍了LCD1602的四位数据线控制方法 xff1a https blog csdn net u011816009 article details 106573622 但是该方法还是需要较多的IO口
  • 树莓派上使用python实现LCD1602显示当前ip

    树莓派一般运行Linux操作系统后通过远程控制来运行 xff0c 但是往往由于网络原因导致树莓派分配的ip地址被改变 xff0c 致使需要重新连接屏幕后才能查看树莓派的当前ip 最近手头有个LCD1602 xff0c 所以尝试将通过驱动LC
  • STM32驱动lcd1602,并口8位 6800时序

    STM32驱动lcd1602 xff0c 并口8位 6800时序 一 LCD1602 xff08 3 3V硬件版本 xff09 简介 1 1 引脚 引脚 xff0c lcd1602采用标准接口 xff0c 6800时序8位并行数据传输 第
  • LCD1602温度显示程序设计流程

    博主福利 xff1a 100G 43 电子设计学习资源包 xff01 http mp weixin qq com mp homepage biz 61 MzU3OTczMzk5Mg 61 61 amp hid 61 7 amp sn 61
  • Lcd1602——斌哥51

    最新修改时间2022 7 22 LCD1602 16代表显示16个字符 xff0c 2代表总共显示两行 芯片的工作电压是4 5 5 5v 工作电流2 0ma xff08 5V xff09 模块最佳工作电压5 0v 字符尺寸 xff1a 2
  • 基于51单片机的红外解码器

    1 简介 本红外解码器是以MCS 51系列AT89C512片机为核心 将红外传感器接收的信号解析出来 LCD1602显示屏将解码数据显示出来 2 总体原理图 硬件组成 单片机最小系统 LCD1602显示屏 IR红外接收器 系统电源 3 程序
  • 电子闹钟设计

    摘要 本设计是以89c51单片机作为控制核心的闹铃系统 本文大致可以分三个章节 第一章讲用单片机制作电子闹钟带来的优势 还有电子闹钟在未来的电子产品中的趋势以及本次设计所要实现的课题目标 第二章讲一些设计思路和硬件组成 第三讲程序代码 最后
  • 51单片机——串口通信

    51单片机 串口通信 串口通信 串口通信的原理 串口的配置 定时器的配置 c源代码 netty源代码 结果 本篇博客的最终效果是实现51单片机用串口发送Hello World netty监听串口读到Hello World后回发给51单片机
  • 51单片机——LCD1602液晶显示屏

    如下图 红框就是LCD1602液晶显示屏 他是可插拔的 插上去后数码管就会乱码无效了 因为他两共用了MCU的8个P0口 LCD1602原理图 从上面两幅图可以看出来 LCD1602的LCD D0 LCD D7分别对应MCU的P00 P07
  • Arduino基础入门篇31—LCD1602液晶显示

    LCD1602也叫1602字符型液晶 是一种专门用来显示字母 数字 符号的点阵型液晶模块 能同时显示16X2即32个字符 本篇我们来认识LCD1602 驱动它显示 Hello World 1 LCD1602介绍 对于单片机爱好者和电子爱好者
  • LCD1602芯片的使用——简单易懂

    题目 想在LCD1602上显示两行如下字样 huaianxinxi wantin 想完成上面的显示必须掌握LCD1602芯片的基本知识 将在程序下面附上LCD1602芯片的基本知识 供大家参考 我实现的比较简单 没有什么花哨的显示 大家首先
  • 2021年电赛模块化程序总结

    文章目录 1 ADC0804 2 LCD1602 3 AD9854 1 ADC0804 集成A D转换器品种繁多 选用时应综合考虑各种因素选取集成芯片 一般逐次比较型A D转换器用的比较多 ADC0804就是这类单片集成A D转换器 ADC

随机推荐

  • OpenCV 相机转换为 OpenGL 相机

    OpenCV 相机转换为 OpenGL 相机 0 引言1 预备知识和概述2 资源3 OpenCV和OpenGL中的图像坐标系统3 1 OpenCV H Z和OpenGL中的主轴3 2 齐次坐标和OpenGL中的归一化设备坐标 4 OpenC
  • 两轮差速小车循线控制原理分析

    硬件资料设定 xff1a 小车驱动来自于两个相同的电机 xff0c 转向依靠两轮差速实现 xff0c 小车前后左右安装超声波传感器 xff0c 前后各一个 xff0c 左右各两个 xff1b 功能目标 xff1a 假设小车左侧有墙壁 xff
  • ch06-Pytorch的正则化与归一化

    ch06 Pytorch的正则化与归一化 0 引言1 weight decay 和 dropout1 1 Regularization1 2 Dropout 2 Normalization2 1 Batch Normalization2 2
  • ch07-Pytorch的训练技巧

    ch07 Pytorch的训练技巧 0 引言1 模型保存与加载1 1 序列化与反序列化1 2 PyTorch 中的模型保存与加载1 3 模型的断点续训练 2 模型 Finetune2 1 Transfer Learning amp Mode
  • opencv-contrib-Python编译module 'cv2.cv2' has no attribute 'xfeatures2d'

    opencv contrib Python编译module 39 cv2 cv2 39 has no attribute 39 xfeatures2d 39 引言解决步骤一解决步骤二 引言 opencv contrib Python编译出现
  • find_package()函数

    find package函数 引言1 find package用法2 find package原理3 A required library with LAPACK API not found 错误解决4 添加findpackage查询路径
  • py安装文件时报错usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]

    py安装文件时报错usage setup py global opts cmd1 cmd1 opts cmd2 cmd2 opts 引言solved 引言 报错 xff1a python setup py fastentrypoints u
  • VScode单步调试

    VScode配置 0 快捷键1 安装clang2 VScodeDebug3 Cmake支持gdb调试的方法 0 快捷键 稍大工程在vscode下的调试参考该博客 Ctrl 43 打开默认终端 Ctrl 43 Shift 43 新建新的终端
  • 串口通信简介

    串口通信 串口通信是一种串行异步通信 xff0c 通信双方以字符帧作为数据传输单位 xff0c 字符帧按位依次传输 xff0c 每个位占固定的时间长度 两个字符帧之间的传输时间间隔可以是任意的 xff0c 即传输完一个字符帧之后 xff0c
  • ubuntu16.0 ROS(介绍EAI的YDLIDAR-X4激光雷达在ROS下使用方法)

    YDLIDAR X4激光雷达介绍 YDLIDAR X4激光雷达是深圳越登智能科技有限公司 xff08 YDLIDAR xff0c 这家公司属于EAI xff09 研发的一款 360 度二维测距产品 xff0c 本产品基于三角测距原理 xff
  • php使用http_build_query,parse_url,parse_str创建与解析url

    1 http build query http build query 可以创建urlencode之后的请求字符串 span class hljs keyword string span http build query mixed spa
  • 无人驾驶小车调试笔记(六)-- 车轮校准

    简介 xff1a 小车的动力完全来自于两个电机带动的车轮 xff0c 在理想状态下 xff0c 给两个电机同样的驱动参数 xff0c 两个车轮会以同样的转速带动小车直线行驶 xff0c 而实际情况是每个电机可能都会有个体差异 xff0c 也
  • Nginx HTTP详解

    正文 1 Nginx启动流程 2 HTTP 初始化 新连接建立时的行为 在上次博客的最后可以看到 xff0c 在ngx event accept方法建立连接的最后一步 xff0c 将会调用ngx listening t监听结构体的handl
  • 时钟周期,机器周期,指令周期的相互关系

    1 时钟周期 61 振荡周期 xff0c 名称不同而已 xff0c 都是等于单片机晶振频率的倒数 xff0c 如常见的外接12M晶振 xff0c 那它的时钟周期 61 1 12M 2 机器周期 xff1a 8051系列单片机的机器周期 61
  • 单片机的分频是什么意思?

    分频就是单片机的时钟频率 xff08 也就是晶振的震荡频率 xff09 F经过12分频 xff0c 变换成F 12的频率 简单的来说就是以整数倍降低频率 2分频就是分频前的频率除以2 xff1b 4分频就是分频前的频率除以4 比如 xff1
  • NMOS和PMOS管

    这里我先说一下我自己分辨MOS管的方法 对于NMOS我们看下图中的箭头 xff0c 都是远离源头 对于PMOS我们看箭头 xff0c 都是指向源头 P xff1a POSITIVE积极的寻找自己的起源 N xff1a NEGTIVE消极的远
  • 基本运算放大电路

    我先说明 下面的内容应该很多人都看到过 xff0c 但是我建议还是细看 xff0c 最好自己推一下 我就是这么做的 运算放大器工作原理综述 xff1a 运算放大器组成的电路五花八门 xff0c 令人眼花瞭乱 xff0c 在分析运算放大器工作
  • PCB板框的绘制——AD19

    pcb板框的绘制当然首先要切换到keep out 层才行 找到设置 xff0c 找到keep out 假如我们要绘制一个矩形的板框 xff0c 我们选择线径就可以 手动绘制一个矩形的板框 我们需要让我们的板子边框按照我们所绘制的走线来定义
  • 零基础自学STM32-野火——GPIO复习篇——使用绝对地址操作GPIO

    今天主要是复习一下 结合野火的 零基础开发指南 名字没记住大概是这个 先放一张结构图 存储器映射 xff08 初学重点 xff09 xff1a 我们的片内外设比如 xff1a Flash Sram Fsmc 以及挂在AHB 总线上的外设 x
  • Lcd1602——斌哥51

    最新修改时间2022 7 22 LCD1602 16代表显示16个字符 xff0c 2代表总共显示两行 芯片的工作电压是4 5 5 5v 工作电流2 0ma xff08 5V xff09 模块最佳工作电压5 0v 字符尺寸 xff1a 2