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

2024-06-20 20:12
文章标签 stm32 lcd 高职 液晶显示

本文主要是介绍我在高职教STM32——LCD液晶显示(2),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正因如此,才有了借助 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地址

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

这篇关于我在高职教STM32——LCD液晶显示(2)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1079135

相关文章

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

STM32 ADC+DMA导致写FLASH失败

最近用STM32G070系列的ADC+DMA采样时,遇到了一些小坑记录一下; 一、ADC+DMA采样时进入死循环; 解决方法:ADC-dma死循环问题_stm32 adc dma死机-CSDN博客 将ADC的DMA中断调整为最高,且增大ADCHAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_Buffer_Size); 的ADC_Bu

基于stm32的河流检测系统-单片机毕业设计

文章目录 前言资料获取设计介绍功能介绍具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机设计精品

STM32的使用方法一

注:我采用的是STM32F103RC芯片、相应的电路图和STM32CubeIDE软件这是在STM32CubeIDE软件定义芯片后,所给的必要的代码逻辑,加上了注释 #include "main.h"/* Private variables ---------------------------------------------------------*//* Private function

STM32 HAL CAN通讯 实操

1、简介 相比于串口通讯,对于刚接触CAN通讯的小白来说,CAN通讯相对复杂,看各种视频、帖子理论,总是一知半解。本次通过傻瓜式操作,先实现CAN通讯的交互,以提高小白的信心,也便于自己复习观看。本次以STM32CubeMX进行初始化配置,通过Keil 5软件进行软件设计,通过CAN盒实现进行数据的交互。该流程实际以STM32F0、F1、F3、F4、F7实测好用(理论上都适用),这三种型号单片机

我在高职教STM32——准备HAL库工程模板(1)

新学期开学在即,又要给学生上 STM32 嵌入式课程了。这课上了多年了,一直用的都是标准库来开发,已经驾轻就熟了。人就是这样,有了自己熟悉的舒适圈,就很难做出改变,老师上课也是如此,排斥新课和不熟悉的内容。显然,STM32 的开发,HAL 库已是主流,自己其实也在使用,只不过更换库就意味着教学内容有很大变化,自己也就迟迟没有迈出调整这一步。现在,是时候做出变化了,笔者计划保持教学项