大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正是如此,才有了借助头条平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思设计的教学课件分享出来,如果您正是一名单片机爱好者或是一名同行,欢迎点赞 关注,各位的支持是本人持续输出的动力,多谢多谢!#30天学会STM32##单片机#

stm32的液晶显示代码(我在高职教STM32LCD液晶显示)(1)

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

【学习目标】

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

三、液晶静态显示实验

本章的前两个部分花了不少篇幅,全方面的介绍了LCD1602以及与开发板之间的联系,传递出来的无非就是一个意思——吃透数据手册。这别无他法,结合参考程序反复阅读手册,慢慢感悟,开发经验就是这么积累起来的。学完这个入门的液晶屏,后面还有更复杂的彩屏和触摸屏等着我们去学习,依然是“啃”数据手册。好了,下面我们就动手来写一个程序,把手册里的内容转换成代码,驱动LCD1602去显示我们想要的效果。

3.1 任务描述

编写LCD1602驱动代码,上电之后可以在指定位置显示字符串信息,实验效果如图13所示。

stm32的液晶显示代码(我在高职教STM32LCD液晶显示)(2)

图13 LCD1602静态显示实验效果

3.2 工程文件清单

与之前的工程一样,控制一类新的硬件就增加一对与之匹配的驱动文件,即图14中的lcd1602.c和lcd1602.h。

stm32的液晶显示代码(我在高职教STM32LCD液晶显示)(3)

图14 LCD1602工程文件

3.3 工程源码剖析

这里为了突出源码的功能细节和排版之需,对源码进行了必要的分割处理。

3.3.1 lcd1602.h源码剖析

该文件源码见代码清单4,主要是LCD1602端口操作的宏定义和驱动函数的声明,每个函数的功能和参数将在下面剖析lcd1602.c源码时解读。

stm32的液晶显示代码(我在高职教STM32LCD液晶显示)(4)

代码清单4 lcd1602.h文件源码

3.3.2 lcd1602.c源码剖析

该文件就是所有LCD1602驱动函数的定义,下面就逐个进行剖析。

1) Lcd1602_WaitReady()函数源码

该函数就是用来检测液晶是否准备好,返回1表示“忙”,返回“0”表示“不忙”。详细源码见如下代码清单5。

stm32的液晶显示代码(我在高职教STM32LCD液晶显示)(5)

代码清单5 Lcd1602_WaitReady()函数源码

2) Lcd1602_Sendbyte()函数源码

该函数把一个字节(参数byte)送上液晶的8位数据端口,高3位送到PC2 ~ PC0,低5位送上PB9 ~ PB5。送数的过程如代码清单6所示,有一点曲折,但各位可以从中好好体会一下C语言位操作的严谨和奇妙。

stm32的液晶显示代码(我在高职教STM32LCD液晶显示)(6)

代码清单6 Lcd1602_SendByte()函数源码

首先,我们得清楚,要改变的只有PC2 ~ PC0、PB9 ~ PB5这8位,而这两组I/O的其他位是不能变的,因为其它I/O还连着别的硬件呢。所以,才有了第55行先保存这组I/O的值。接下来,第56~58行的操作过程可以用图15来表示,这几句很好的诠释了C语言常见的位操作在嵌入式层面是如何应用的,希望各位能好好领悟。同理,第60~63行是把byte的高3位送到PC2~PC0,各位可以自己琢磨和推导一下。

stm32的液晶显示代码(我在高职教STM32LCD液晶显示)(7)

图15 PB9~PB5的送数过程

3) Lcd1602_WriteCmd()函数源码

该函数实现写一个命令(参数byte)到LCD1602,就是按照数据手册上写命令的时序编写的,大家可以对照手册来阅读,源码见如下代码清单7。

stm32的液晶显示代码(我在高职教STM32LCD液晶显示)(8)

代码清单7 Lcd1602_WriteCmd()函数源码

4) Lcd1602_WriteData()函数源码

该函数与写命令函数是一个套路,就是第103行改成了数据模式,源码见代码清单8。

stm32的液晶显示代码(我在高职教STM32LCD液晶显示)(9)

代码清单8 Lcd1602_WriteData()函数源码

5) Lcd1602_SetCursor()函数源码

该函数用来设置光标的位置,参数x和y是位置坐标,x是行坐标(0表示第一行,1表示第二行),y是列坐标(0~15),源码见如下代码清单9。

stm32的液晶显示代码(我在高职教STM32LCD液晶显示)(10)

代码清单9 Lcd1602_SetCursor()函数源码

6) Lcd1602_ShowChar()函数源码

该函数用来显示单个字符,参数x和y与上面一样,确定在哪个位置显示,ch为字符内容,源码见如下代码清单10。

stm32的液晶显示代码(我在高职教STM32LCD液晶显示)(11)

代码清单10 Lcd1602_ShowChar()函数源码

7) Lcd1602_ShowStr()函数源码

该函数用来显示字符串信息,参数x和y与上面一样,确定从哪个位置开始显示,*str指向待显示的字符串空间,源码见如下代码清单11。

stm32的液晶显示代码(我在高职教STM32LCD液晶显示)(12)

代码清单11 Lcd1602_ShowStr()函数源码

8) Lcd1602_Clear()函数源码

该函数用来清屏,参数pos可取值为0、1、2,分别表示清除第一行、第二行和整屏,源码见如下代码清单12。

stm32的液晶显示代码(我在高职教STM32LCD液晶显示)(13)

代码清单12 Lcd1602_Clear()函数源码

9) Lcd1602_Init()函数源码

该函数完成LCD1602上电之后的初始化,一方面将所连接的I/O口全部初始化,另一方面按照数据手册交待的复位步骤对液晶进行初始化,源码见如下代码清单13。

stm32的液晶显示代码(我在高职教STM32LCD液晶显示)(14)

代码清单13 Lcd1602_Init()函数源码

1602液晶手册提供了一个初始化过程,由于不检测“忙”位,所以程序比较复杂,如图16所示。而我们编写的程序已经将检测“忙”位的功能嵌入到写操作里面了,所以只用了第244~247行4条语句就完成了同样效果,更加简易方便。手册上描述的那个,大家仅作了解即可。以后在别的资料里看到了与我们这类不一样的初始化也不要困惑,注意跟我们这里联系和对比。

stm32的液晶显示代码(我在高职教STM32LCD液晶显示)(15)

图16 数据手册上的初始化过程

3.3.3 main.c源码剖析

主程序比较简单,完成初始化之后就调用显示函数在屏上指定的位置显示指定的字符串,源码见如下代码清单14。

stm32的液晶显示代码(我在高职教STM32LCD液晶显示)(16)

代码清单14 main.c文件源码

3.3.4 验证与测试

程序下载前,接好液晶屏和电源适配器,并将电源拨动开关置于OFF处(如图17所示)。程序下载后,电源开关拨至ON,即可实现实验效果。

stm32的液晶显示代码(我在高职教STM32LCD液晶显示)(17)

图17 实验效果与电源拨动开关

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

,