我在高职教STM32——LCD液晶显示(2)

news2024/11/29 2:53:04

        大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正因如此,才有了借助 CSDN 平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思的教学设计分享出来,主要面向广大师生朋友,单片机老鸟就略过吧。欢迎点赞+关注,各位的支持是本人持续输出的动力,多谢多谢!


        前边我们讲解了LED、按键和蜂鸣器的应用,这三类器件本身工作原理十分简单,因此我们的重点是放在STM32的GPIO上面。这一章我们来学习一下开发板配套的那块厚厚的液晶屏——LCD1602,聚焦的是这个器件本身的特点和工作时序。因此,我们需要熟读它的数据手册,因为手册里告诉了编程的要点、参数、时序等。阅读器件手册是做单片机和嵌入式开发必备的基本能力,我们就从这一章开始锻炼起来吧。为了不让篇幅太长,本章打算分四个部分来讲解,本文是第二部分。

【学习目标】

  1. 了解LCD1602的工作原理
  2. 掌握LCD1602的工作时序
  3. 领悟软件模拟时序的思路和方法

二、深入内部理解LCD1602

2.1 显示地址与字符

        LCD1602内部带了80个字节的显示RAM,用来存储我们发送的数据,它的结构如图7所示。

图7 LCD1602内部RAM结构

        第一行的地址是0x00到0x27,第二行的地址从0x40到0x67,其中第一行0x00到0x0F是与液晶上第一行16个字符显示位置相对应的,第二行0x40到 0x4F是与第二行16个字符显示位置相对应的。而每行都多出来一部分,是为了显示移动字幕设置的。1602字符液晶是显示字符的,因此它跟ASCII字符表是对应的。比如我们给0x00这个地址写一个‘a’,也就是十进制的97,液晶的最左上方的那个小块就会显示一个字母a。此外,液晶内部有个数据指针,它指向哪里,我们写的那个数据就会送到相应的那个地址里。

2.2 状态字节

        LCD1602有一个状态字节,我们通过读取这个状态字的内容,就可以知道一些内部情况,这个状态字节含义如表3所示。

表3 LCD1602状态字节

        这个状态字节最高位表示了当前液晶是不是“忙”,如果这个位是1表示正“忙”,禁止我们读写数据或者命令;如果是0,则可以进行读写。而低7位就表示了当前数据地址指针的位置。

2.3 读写时序

        LCD1602的基本操作时序,一共有4个,这些大家都不需要记住,但是都需要理解,因为我们现在不是为了应付考试,所以不需要你把手册背熟,但是你写程序的时候,打开手册要能看懂如何操作。

2.3.1 读状态

        RS = L,R/W = H,E = H,读状态。这是个很简单的逻辑,我们对照手册上的读状态时序(如图8所示),编写的程序结构如代码清单2所示。

图8 读状态时序图
代码清单2 读液晶状态程序的基本结构

        这样就读到了当前液晶的状态位,我们可以通过该位的值来了解当前液晶是否处于“忙”状态。这里面有两个问题:第一,如果读到的状态是“不忙(0)”,那么程序可以进行读写操作;如果当前状态是“忙(1)”,那么还得继续等待重新判断液晶的状态;第二,读完了液晶状态继续保持使能E是高电平的话,LCD1602会继续输出它的状态值,输出的这个值会占据了数据总线,所以读完了状态,通常需要把这个引脚拉低(第7行)来释放总线。

        为了解决以上两个问题,我们把读液晶状态的函数放在while循环中,直到循环退出(即不忙),再执行后续的写液晶操作,程序结构如代码清单3所示。

代码清单3 写液晶之前反复读取是否“忙”

2.3.2 读数据

        如图9所示,这个时序跟读状态很像,把第一步改成拉高RS即可。但是,读数据不常用,大家了解一下就可以了,这里就不详细解释了。

图9 读数据时序图

2.3.3 写指令

        RS = L,R/W = L,D7~D0 = 指令码,E = 高脉冲,时序如图10所示。这个在逻辑上没什么难的,只是“E = 高脉冲”这个问题要解释一下。这个指令一共有4条语句,其中前三条语句顺序无所谓,但是“E = 高脉冲”这一句很关键。

图10 写指令时序

        实际上流程是这样的:因为我们现在是写指令,所以我们首先要保证E引脚是低电平状态,而前三句不管我们怎么写,LCD1602只要没有接收到E引脚的使能控制,它都不会来读总线上的信号的。当通过前三句准备好数据之后,E使能引脚从低电平到高电平变化,然后E使能引脚再从高电平到低电平出现一个下降沿,LCD1602内部一旦检测到这个下降沿后,并且检测到“RS = L,R/W = L”就马上来读取D7~D0 的数据,完成写指令过程。

        综上所述,我们写了个“E = 高脉冲”,意思就是:使能E先从低拉高,再从高拉低,形成一个高脉冲。

2.3.4 写数据

        RS = H,R/W = L,D7~D0 = 数据,E = 高脉冲,时序如图11所示。这个时序跟写指令很像,把第一步改成拉高RS即可。此时,写入的就是需要显示的字符编码了。

图11 写数据时序

2.4 指令介绍

        与单片机寄存器的用法类似,LCD1602在使用的时候,我们首先要进行初始的功能配置,有以下几个指令需要了解。

2.4.1 显示模式设置

        如表4所示,写指令0x38,设置16x2显示,5x7点阵,8位数据接口。这条指令对我们这个液晶来说是固定的,必须写0x38,大家仔细看会发现我们的液晶实际上内部点阵是5x8的,还有一些1602液晶还兼容串行通信,用2个IO口即可,但是速度慢,我们这个液晶就是固定的0x38模式。

表4 固定的显示模式设置指令

2.4.2 显示开/关与光标设置

        这里有两类指令,我们把数据手册里对它们的描述贴过来,如表5所示。

表5 显示开/关与光标设置指令

2.4.3 清屏显示

        固定的,写入0x01表示显示清屏,包含了数据指针清零,所有的显示清零。写入0x02则仅仅是数据指针清零,显示不清零。

2.4.4 RAM地址设置

        该指令码的最高位为1,低7位为RAM的地址,RAM地址与液晶上字符的关系已在图7中呈现。通常,我们在读写数据之前都要先设置好地址,然后再进行数据的读写操作。

2.4.5 光标、画面位移设置

        如表6所示,通过这个指令码我们可以实现屏幕上内容的整体左移(或右移)显示,就像生活中常见的那种滚动屏显。具体控制效果为:

  • S/C =0,R/L =0:光标左移 ,地址计数器减1(即显示内容和光标一起左移)
  • S/C =0,R/L =1:光标右移 ,地址计数器加1(即显示内容和光标一起右移)
  • S/C =1,R/L =0:显示内容左移 ,光标不移动
  • S/C =1,R/L =1:显示内容右移 ,光标不移动
表6 光标和画面移动指令

        这个指令效果也解释了图7中屏幕之外那些地址的意义,我们再把它复制过来并添加了一些标注(如图12所示),两排地址就像可以写两行字的纸带,写在前16个格子里字迹就会显示,而写在其他格子里字迹就隐身了(并没有消失)。因此,当屏幕内容移动时,纸带是不动的,动的是字迹,也就是手册上所说的“移动时不影响DDRAM”。 

图12 用纸带比喻RAM地址

(第二部分完,共四部分) 

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

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

相关文章

LabVIEW_TDMS

1.TDMS设置属性 想给这里写属性怎么整 使用TDMS设置属性函数时,对组名称与通道名称不设置,即可达到上图中的样式。 PS:属性名称如果设置一样则最终生效的值为最后写入的值。如将属性2修改为属性1,则最终只有1个属性1&#xff0c…

C++语法04 标准输入语句

标准输入 使用格式:cin >> 输入的意思就是把一个值放到变量里面去,也就是变量的赋值,这个值是由我们自己输入的。 (注意:输入变量前要先定义,输入完之后要按Enter键。) 输入多个变量,与输出类似,…

基于一种改进熵方法的旋转机械故障诊断模型(MATLAB)

熵的概念起源于热力学,1884年,玻尔兹曼定义熵,用以描述分子热运动的无序性和混乱度。1948年,Shannon在其发表的《AMathematicalTheoryofCommunication》中提出香农熵,首次将“熵”引入信息度量范畴,为信息论…

C语言实现树和二叉树(二)

OK,各位未来的高级程序员们,大家好,今天我们来讲解一下二叉树这个部分的第二种存储结构---------链式存储结构,相信大家对这部分内容已经很期待了,但是,这里我们在开讲之前,要先补充一个知识&am…

AJAX 综合案例-day2

Bootstrap 弹框 功能:不离开当前页面,显示单独内容,供用户操作 步骤: 1. 引入 bootstrap.css 和 bootstrap.js 2. 准备 弹框标签 ,确认结构 3. 通过 自定义属性 ,控制弹框的 显示 和 隐藏 1. 通过属性…

SAP_FICO模块-获利能力段新增特征字段

业务背景: 公司有启用获利能力分析功能,有一个销售订单接口,是通过第三方销售订单管理平台推送数据到SAP的,用户希望对接新增一个编号ID到销售订单上,并且可以用KE24/KE30报表查看显示; 对于我这么一个后勤…

小程序打开空白的问题处理

小程序打开是空白的,如下: 这个问题都是请求域名的问题: 一、检查服务器域名配置了 https没有,如果没有,解决办法是申请个ssl证书,具体看这里 https://doc.crmeb.com/mer/mer2/4257 二、完成第一步后&#…

云动态摘要 2024-06-20

给您带来云厂商的最新动态,最新产品资讯和最新优惠更新。 最新优惠与活动 [低至1折]腾讯混元大模型产品特惠 腾讯云 2024-06-06 腾讯混元大模型产品特惠,新用户1折起! 云服务器ECS试用产品续用 阿里云 2024-04-14 云服务器ECS试用产品续用 最新产品更新 [功能优化]费用…

栈,队列,数组,链表

一.数据结构概述 数据结构是计算机底层存储,组织数据的方式。 是指数据相互之间是以什么方式排列在一起的。 数据结构是为了更加方便的管理和使用数据,需要结合具体的业务场景来进行选择。 一般情况下,精心选择的数据结构可以来更高的运行或者存储效率。 二.学好数据结构三大…

AI绘画ComfyUI-插件-面部修复,快速入门安装使用!

这期给大家分享一个插件AI绘画 ComfyUI的——Impact Pack ComfyUI也是隶属于Stable Diffusion的工作流形式的AI绘画工具。 这是一个综合节点,这期先介绍下这个插件中的面部修复功能 Impact Pack插件 1、下载插件 在ComfyUI管理器中安装节点,搜索Imp…

探索磁力搜索引擎:互联网资源获取的新视角

在当今数字化社会中,寻找和获取网络资源变得更加便捷和多样化。磁力搜索引擎作为这一趋势的一部分,提供了一种新颖而有效的方法来定位和获取用户所需的文件、媒体和其他数字内容。本文将深入探讨磁力搜索引擎的工作原理、使用场景及其在网络文化中的影响…

0.6 复合视频信号(CVBS)简介

0.6 复合视频信号简介 复合视频信号指在一个信号中包含了亮度信号、色度信号与同步信号(包括场同步、行同步信号及行场消隐信号)的视频信号。又可称为 CVBS,CVBS 为 Color,Video,Blanking,Sync 或者 compo…

酷得智能 电子方案开发 单片机方案定制

手持小风扇电子方案开发,东莞酷得智能科技有限公司为您服务 东莞市酷得智能科技有限公司 在消费类电子市场深耕多年,依托于市场团队对市场的敏锐度、工程团队的技术积累、结合自身的创新以及和上游原厂深度合作,在2.4G通信、BLE、语音、马达…

java实现一个LRU缓存算法。

//LRU(Least Recently Used)缓存算法是一种常见的缓存淘汰策略, // 它的基本思想是保留最近被访问过的数据,淘汰最久未被访问的数据。下面是一个使用Java实现的简单LRU缓存算法: import java.util.LinkedHashMap; impo…

【Unity】AssetBundle打包策略

【Unity】AssetBundle打包策略 在游戏开发过程中,AssetBundle(AB)打包策略的重要性不容忽视。游戏开发者往往手动设置游戏资源包名进行管理,难免会造成资源确实或导致冗余,因此对于AB包的打包流程来说,进行策略管理显得十分重要。…

正定矩阵(Positive Definite Matrix)

正定矩阵(Positive Definite Matrix) flyfish Positive(正数) :在数学和统计学中,通常指大于零的数。在矩阵理论中,一个矩阵被称为正定,是因为它的性质类似于正数的性质。 Defini…

聚合大模型场景助力产业升级,WAIC 2024 容联云论坛即将开幕

前 言 Introduction 2024世界人工智能大会暨人工智能全球治理高级别会议(简称“WAIC 2024”)即将拉开帷幕,在世界人工智能大会组委会办公室的指导下,容联云将于7月6日主办容联云生成式应用与大模型商业化实践论坛。本次论坛还将获…

Bureau of Contacts延迟高、卡顿、无法联机怎么办?

Bureau of Contacts是一款最多支持四个人联机玩的恐怖游戏,由MIROWIN开发并发行,6月20日在steam推出抢先体验版,相信喜欢恐怖游戏的玩家已经等不及了。玩家会扮演一名特工,接触并调查超自然现象,游戏分为调查和驱魔两个…

C语言练习02-数组

一、求最值 已知数组元素为{33,5,22,44,55}&#xff0c;找出数组中的最大值并打印在控制台 #include<stdio.h> #include<math.h>int main() {int arr[] {33,5,22,44,55};int max arr[0];int len sizeof(arr) / sizeof(int); //注意&#xff1a;sizeof(arr)计算…

新世纪助力无锡市第二人民医院通过ITSS认证

通过江苏新世纪信息科技有限公司的咨询辅导&#xff0c;无锡市第二人民医院通过合规性审查、复核、评定审核环节&#xff0c;顺利完成ITSS通用要求的认证。近日&#xff0c;评定结果在“ITSS中国电子工业标准化技术协会信息技术服务分会”网站&#xff08;https://www.itss.cn&…