LCD1602介绍和各报错经验总结

news2024/11/25 4:35:37

LCD ( Liquid Crystal Display 的简称)液晶显示器。能够同时显示16x2,32个字符,是一种专门用来显示字母、数字、符号等的点阵型液晶模块。

LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。该显示屏的优点是耗电量低、体积小、辐射低。

作为嵌入式中非常非常常用的显示硬件,对于它的各种稀奇古怪的报错却是鲜有系统性的总结,本文lz目的就在于总结比较常见并给出笔者实践过的部分解决方法的思路,如有别的好的解决方法,欢迎各位在评论区补充。(笔者因为遇到了非常多的报错,也挺不容易的,希望大家多多支持笔者的博客笔记,一起学习)

-----------------------------------------------------------------------------------------------

首先介绍一下LCD1602的一些基本信息和使用方式。

首先介绍LCD的发光原理:背光灯发出白色光,经过偏光片对光线进行初步帅选,经过玻璃板到达液晶控制电路,光线穿过液晶间隙,外界施加到液晶的电压,会改变光线的偏转角度,光线在经过玻璃板,穿过偏光片,最终投射到红绿蓝三基色偏光片上,展示出不同的颜色,最终形成一个显示单位,称为像素点。

液晶本身不发光,需要背光灯提供光源,光线经过一系列处理才到输出,输出的光线强度要比光源的强度低很多,能量利用率较低,(比CRT显示器节能),液晶显示的处理方式,会导致显示方向较窄,对应它的视角较小,从侧面看屏幕会看不清他的显示内容,色彩转换,液晶分子转动也需要消耗一定的时间,导致屏幕的响应速度低。

接下来介绍LCD的相关引脚:

1.VSS:接地线;

2.VDD:接电源正极,一般接5V;

3:VO(图中为VE):液晶屏对比度调整,接电源正极时对比度最弱,接地时对比度最强;

4.RS:写入数据/命令选择线;

5.RW:读/写选择线;

6.E:使能端线;

7.D0~D7:8位数据线;

9.A:背光源正极;

10.K(C):背光源负极。

 接下来介绍LCD的两种操作:读/写操作。

1、写操作:

写操作是LCD最常用的操作。而因此我们将其再分为两块:写数据、写命令,但二者原理其实相同。

首先说明的是当E线处于低电平时,是无法往其中写入内容(数据/命令)的。当写操作开始时候,拉低RW表示我们选择写入数据,再根据需求拉低或者抬高RS的电平,当RS选中高电平时候,我们进行写入数据的操作,当RS选择低电平的时候,我们进行写入命令的操作。之后我们再拉高E使能线的电平,给一个上升沿触发信号,将数据/命令送入LCD,再延时一小会,让LCD接收数据。之后拉低使能线电平,给到下降沿触发信号,延时让数据发送到LCD。

 以下是写入指令的代码:

void WriteCmd(uint8_t cmd)
{ 
	RS = 0;  //选择写指令
	RW = 0; 	//选择写
	E = 0;  //E使能拉低
	P0 = cmd;  //把指令送入P0
	delay_ms(2); //延时一小会儿,让1602准备接收数据
	E = 1;  //使能线电平变化上升沿,命令送入1602的8位数据口
	delay_ms(2);//延时,让数据发送
	E = 0;	//使能线拉低
}

以下是写入数据的代码:

void WriteData(uint8_t data)
{ 
	RS = 1;  //选择写数据
	RW = 0; 	//选择写
	E = 0;  //E使能拉低
	P0 = data;  //把指令送入P0
	delay_ms(2); //延时一小会儿,让1602准备接收数据
	E = 1;  //使能线电平变化上升沿,命令送入1602的8位数据口
	delay_ms(2);//延时,让数据发送
	E = 0;	//使能线拉低
}

2、读操作:

相比于写操作而言,读操作的使用频率往往低很多,但它依旧是很有用的。当读操作开始时候,拉高RW表示我们选择读取数据,之后我们再拉高E使能线的电平,给一个上升沿触发信号,让LCD的数据传入单片机,再延时一小会,让单片机接收数据。之后拉低使能线电平,给到下降沿触发信号,延时。

 接下来关于对LCD初始化,我们进行以下的代码实现,注意8位和4位不同的设置方法。

void lcd_Init()
{
	WriteCmd(0x38);        // 16*2显示,5*7点阵,8位数据口
    /*WriteCmd(0x28);       // 16*2显示,5*7点阵,4位数据口*/
	WriteCmd(0x0C);        // 开显示,不显示光标
	WriteCmd(0x06);        // 地址加1,当写入数据后光标右移
	WriteCmd(0x01);        // 清屏
}

接下来是移动光标地址的代码,在移动光标时候,我们相应的命令为0x80 + col,如果是第二行,指令则为0x80 + 0x40 +col。

void lcd_locate(uint8_t line,uint8_t column)
{
	// 第一行
	if(line==0)        
		LcdWriteCmd(0x80+column); 
	// 第二行
	if(line==1)        
		LcdWriteCmd(0x80+0x40+column); 
}

最后介绍相应的输出字符串的代码:

void lcd_PrintStr(const uint8_t *str)
{
	while(*str!='\0')
			LcdWriteData(*str++);
}

接下来介绍LCD1602的字库表,如图:

接下来介绍一些比较常见的报错:

首先,说在前面,代码一般是不太会出错的,主要是硬件连接和硬件故障的问题。

1、LCD根本没亮

首先LCD没亮的话,A和K的背光板的电源和LCD的电压VSS、VDD正负极一定是接错的。然后一般使用者前面的接线也是有问题的,比如RS和RW接到数据线上去了,接错串口了(该情况常见于4位输入的情况)。

也有可能是LCD对应的串口没设置好,比如一般我们串口是设置为推挽输出,查看我们的推挽输出是否给到了对应的电平。

需要在硬件连接和软件代码两方面都要仔细检查。

2、LCD亮,但没有方块,全是亮的

这种情况有以下几种可能:

1.VO对比度设置太低,可以通过增大对比度的方式调节,通常我们在VO与地之间接入一个电位器,可以给到一个比较容易调节的阻值,一般选择量程大于5k的电位器;

2.初始化后没有数据输入,所以显示为空白;

3.查看硬件是否短路,将万用表红黑表笔接到VSS和VDD上进行检查;

3、LCD亮,但只有第一行有黑格

这个问题一般和初始化有错有关,一般的问题主要是两个:

1.编写的初始化代码有误,详见上面的初始化代码作为参考;

2.接线有误导致无法正常输入初始化数据。

3.VO对比度设置太高,可以通过降低对比度的方式调节,通常我们在VO与地之间接入一个电位器;

此外,当你在输入完数据/指令后,拔出LCD电源,再次插入,不进行系统重启和新的输入时,你也能观察到这个现象。

4、输入字符出现乱码或者日文

一般是接线是不太可能有问题的,因为一般来说,接线有问题的话直接就停留在上一个阶段了,根本完成不了初始化,但不排除接线问题的可能。

一般是复位的问题,或者是延时过短,数据顺利无法写入。

 由于LCD复位后默认是8线输入,如果函数LCD_write_command是一个按四线输入写入的函数,那么执行LCD_write_command(0x28);等效为先写入8线指令0x20;写入后LCD已经改为了四线模式,再写入4线指令8x的高四位,但是不再有低四位写入,所以之后写入其他数据时,LCD仍在等待上一个指令的低四位。这样就导致了不能正常的进行后面的操作。

解决方法:先执行LCD_write_command(0x02)(0x20应该也是可以的),先是写入了8线指令2,再写入8线指令0`,这样就将LCD改为4线传输,在紧跟这步之后,写入0x32,之后按4线写数据时,就没有高低错乱的问题。

5、双数位置字符无法显示(极少见,据笔者所知,就本人遇到过)

这个应该只有使用mbed的同僚会遇到,因为mbed是用C语言写出程序逻辑,再转写为可识别的.bin文件,这个过程是很未知的,而不是像keil一样直接对寄存器或者使用HAL库对寄存器进行修改,比较清晰。这种容易引发问题。

以笔者的STM32L432为例,笔者因为使用了原本作为模拟输出的A5~7作为数字输出,应该是启动了引脚复用导致了LCD的数据引脚被间歇性制空或者被失能,导致了输出有误。

解决的思路主要是重新启用对应原本用于数字输出的D管脚,而不要用A引脚,即使要用A引脚,也要用数字偏小的,笔者实测有效的。

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

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

相关文章

【十字绣】传统手艺-微信小程序开发流程详解

还记得小时候看过母亲的十字绣吗,易学易懂,就是用专用的绣线和十字格布,通过平面坐标计找出位置,对照专用的图案进行刺绣,可作出心中所想的画,奈何所需材料成本不小,这里用小程序简单模拟十字绣…

HCIA——VLAN

目录 1,什么是VLAN: 2,如何实现VLAN: 3,VLAN的划分方式: 4,交换机接口类型: 1,Access接口: 2,Trunk接口:允许将一个接口划分给多…

ChatGPT 角色扮演调教文案收集

后续文案会陆续更新~,在输入完文本后,再输入一句“请尽力模仿xx的语气跟我对话”即可 一.雌小鬼 你需要阅雌小鬼守则,阅读后当前回复仅允许回复"嘻嘻",后续回复尽量简短,回复中尽量不要直接复述…

swagger的简单介绍

目录 swagger是什么? swagger有什么用? Swagger包含的工具集: swagger的使用步骤: swagger的相关注解: Docket的源码 了解swagger的作用和概念了解前后端分离在SpringBoot中集成Swagger swagger是什么?…

Linux网络编程—Day11 高性能服务器程序框架

按照服务器程序的一般原理,讲服务器结构为如下三个主要模块: I/O处理单元逻辑单元存储单元 服务器模型 第一种:C/S模型 TCP/IP协议在设计和实现上并没有客户端和服务器的概念,在通信 过程中所有机器都是对等的。但由于资源&am…

【Linux】Linux开发工具vim

Linux开发工具vim 什么是vim三种模式的转换vim的基本命令gg:定位光标到最开始的行Shiftg:定位光标到结尾行nShiftg:定位光标到任意行Shift$:定位光标到当前行结尾Shift^:定位光标到当前行开始w,b:光标按照单词进行行内…

红黑树 C++

企业里永远是技术驱动理论发展 比起理解红黑树的原理,更重要的是理解红黑树的应用场景,因为某些应用场景的需要,红黑树才会应运而生。 红黑树的特点: 插入,删除,查找都是O(logn)的复杂度。 红黑树的应用…

大数据Doris(二十六):Broker Load基本原理和语法介绍

文章目录 Broker Load基本原理和语法介绍 一、基本原理 二、Broker Load语法 Broker Load基本原理和语法介绍 Apache Doris架构中除了有BE和FE进程之外,还可以部署Broker可选进程,主要用于支持Doris读写远端存储上的文件和目录。例如:Apa…

spring boot +Sa-Token优雅的实现项目鉴权!

1. 技术选型 最近在做登录、授权的功能,一开始考虑到的是spring boot spring security,但spring security太重,而我们是轻量级的项目,所以,spring security不适合我们。 而后考虑spring boot shiro,但s…

【老王读SpringMVC-5】Controller method 是如何执行的?

通过前面对 Controller method 参数绑定的分析,我们知道, 被 RequestMapping 标记 handler method 的执行是通过调用 RequestMappingHandlerAdapter#handle()。 RequestMappingHandlerAdapter#handle() 具体的调用过程如下: 参数解析、han…

【Java基础篇】运算符

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏:Java.SE,本专栏主要讲解运算符,程序逻辑控制,方法的使用&…

由浅入深Dubbo网络通信深入解析

目录 1 dubbo中数据格式2 消费方发送请求3 提供方接收请求4 提供方返回调用结果5 消费方接收调用结果6 异步转同步7 异步多线程数据一致8 心跳检查 1 dubbo中数据格式 解决socket中数据粘包拆包问题,一般有三种方式 定长协议(数据包长度一致&#xff09…

5GNR——RACH随机接入流程(1):随机接入的原因

1、随机接入触发原因 1- Initial access from RRC_IDLE; 2- RRC Connection Re-establishment procedure; 3- DL or UL data arrival during RRC_CONNECTED when UL synchronisation status is “non-synchronised”; 4- UL data arrival during RRC_CONNECTED when there are …

Java之运算符

+加号的作用 1.表示正数 2.相加运算符 3.进行字符串的拼接 4.自增 Tips: 运算运算符优于 扩展赋值运算符 byte a ; int b ; ab; 右侧为byte,无需强制转换 aab; 右侧为int,需强制转换为byte,赋给左边…

解码区块链:探索去中心化世界的奥秘与潜力

🐟 区块链技术的基本原理🐟 区块链技术的应用场景🐟 区块链技术的挑战与前景 区块链技术作为一项创新性的技术,引领着数字时代的变革。它以其去中心化、透明性和安全性的特点,为各行业带来了无限可能。在本篇博客中&am…

《程序员面试金典(第6版)》面试题 02.05. 链表求和(构建一个新链表)

题目解析 给定两个用链表表示的整数,每个节点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。 题目传送门:面试题 02.05. 链表求和 示例: 输入&#x…

漏洞管理基础知识

漏洞管理对于端点安全至关重要,是在安全漏洞导致漏洞之前清除安全漏洞的最主动方法之一。 什么是漏洞 漏洞是软件中的错误代码段,会导致软件崩溃或以程序员从未预料到的方式做出响应。黑客可以利用漏洞对计算机系统进行未经授权的访问或对计算机系统执行…

第五十天学习记录:C语言进阶:位段

位段 什么是位段 位段的声明和结构是类似的&#xff0c;有两个不同&#xff1a; 1、位段的成员可以是int,unsigned int或signed int。 2、位段的成员名后边有一个冒号和一个数字。 #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>//位段-二进制位 struct A {int …

用脚本采集ChatGPT免翻免费镜像

新建了一个网站 ChatGPT人工智能中文站 - ChatGPT人工智能中文站 每天给大家更新可用的国内可用chatGPT免费镜像站 昨天发布了一个教程 本地安装 ChatGPT&#xff01;无需API、 免翻墙、完全免费使用纯正OpenAI的全部功能&#xff01; 支持 Windows、 Mac、NAS、Linux系统 …

led钨丝灯项目笔记

基于ESP-12E的LED钨丝灯作品 原理图&#xff1a; PCB&#xff1a; 嘉立创上面有些封装没有&#xff0c;需要自己画 画完这两个&#xff0c;此时它们还没有相关联&#xff0c;需要将它们关联起来 在封装管理器中将它们关联起来 在这里面就可以找到自己画的封装 如&#xff1a;…