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

devtools/2024/9/24 7:25:15/

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

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

【学习目标】

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

四、字符跳动显示实验

        我们在前面的液晶指令描述中可以看到,LCD1602还支持光标和屏幕移动,下面我们就通过两个实验来感受一下动态显示的效果。

4.1 任务描述

        这个实验是让字符串里的每个字符逐个跳出来显示,我们将实验的动态效果分解在图18中,中间部分做了一些省略。

图18 字符跳动显示效果

4.2 工程源码剖析

        对于底层的 lcd1602.clcd1602.h 驱动文件来说,我们尽量不去改动。控制字符跳出的代码在主程序里实现,见如下代码清单16。

/********************************************************* 代码清单16:main.c* 项    目:LCD1602液晶显示* 任务描述:字符跳到显示* 实验平台:OneNET STM32开发板V3.2* 作    者:老耿* 日    期:yyyy/mm/dd******************************************************
**///-----------------------------------------------------
// 必要的头文件
//-----------------------------------------------------
#include "delay.h"
#include "lcd1602.h"int main()
{u8 i;	//控制列坐标的变量u8 *p;	//指向字符串的指针delay_init();			//Systick初始化,用于普通的延时Lcd1602_Init();			//LCD1602初始化while(1){i = 2;	            //列坐标初值p = "STM32 Board";	//指向待显示的字符串Lcd1602_Clear(2);	//每次开始显示前先清屏Lcd1602_ShowStr(0, 3, "KylinV3.2");	//首行静态显示delay_ms(250);		//停留一下进入下面的字符跳出效果/* ------------ 以下是控制字符逐个跳出的循环 -------------*/while(*p)	//只要不是结束字符就循环,即while(*p!='\0'){	Lcd1602_ShowChar(1, i, *p);	//第二行指定位置显示一个字符i++;			//下一列p++;			//下一个字符delay_ms(250);	//每个字符跳出的间隔}delay_ms(250);		//跳完停留一下}
}

五、液晶滚动显示实验

5.1 任务描述

        这个实验是让整个屏幕画面整体向左或向右滚动显示,我们将实验动态效果分解在图19中,中间部分做了一些省略。

图19 液晶滚动显示效果

5.2 工程源码剖析

        同理,还是只修改主程序里的控制代码,见如下代码清单17。

/********************************************************* 代码清单17:main.c* 项    目:LCD1602液晶显示* 任务描述:滚动显示* 实验平台:OneNET STM32开发板V3.2* 作    者:老耿* 日    期:yyyy/mm/dd******************************************************
**///-----------------------------------------------------
// 必要的头文件
//-----------------------------------------------------
#include "delay.h"
#include "lcd1602.h"int main()
{delay_init();			//Systick初始化,用于普通的延时Lcd1602_Init();			//LCD1602初始化Lcd1602_ShowStr(0, 3, "KylinV3.2");Lcd1602_ShowStr(1, 2, "STM32 Board");while(1){Lcd1602_WriteCmd(0x18);		//画面整体左移一个字符位置//Lcd1602_WriteCmd(0x1C);	//画面整体右移一个字符位置delay_ms(250);}
}

六、液晶显示功能的扩展

        在上面的实验中,我们通过 Lcd1602_ShowStr() 函数实现了字符串信息的显示。但不知你是否考虑过,倘若显示的内容不是字符的类型,比如传感器采集温湿度值、ADC采集的电压值等,这些数据都是浮点类型的,也想通过液晶显示出来,该如何处理呢?

        针对以上问题,我们补充一个显示函数 Lcd1602_Printf(),来实现多种数据类型的显示,就像使用 printf() 函数那样,可以通过%d、%f、%s这样的形式来指定显示内容的数据类型。该函数用到了C语言中解决变参问题的操作方式,想详细了解这部分知识的同学请自行搜索查阅,这里不展开。源码见如下代码清单18。

/*
************************************************************
*	代码清单18:	Lcd1602_Printf()函数
*	函数功能:	设置LCD1602显示的内容
*	入口参数:	x和y:显示的起始坐标(同上)
*				fmt:不定长参
*	返回参数:	无
*	说明:		
************************************************************
*/
void Lcd1602_Printf(u8 x, u8 y, char *fmt, ...)
{u8 LcdPrintfBuf[33];	//”打印“字符的缓冲区va_list ap;		//定义一个可变参数列表u8 *ptr = LcdPrintfBuf;	//指向缓冲区的指针va_start(ap, fmt);	//获取可变参数列表第一个参数的地址vsprintf((char *)LcdPrintfBuf, fmt, ap);	//把可变参数列表内容格式化成字符串存入缓冲区va_end(ap);			//清空可变参数列表Lcd1602_SetCursor(x, y);	//设置显示位置while(*ptr)		//循环显示缓冲区里的每个字符{Lcd1602_WriteData(*ptr);ptr++;}
}

        有了这个函数,我们就可以在主程序中像使用 printf() 函数那样在液晶屏上“打印”需要的内容了,代码清单19给了一个简单示例。

/********************************************************* 代码清单18:main.c* 项    目:LCD1602液晶显示* 任务描述:用液晶“打印”函数来显示* 实验平台:OneNET STM32开发板V3.2* 作    者:老耿* 日    期:yyyy/mm/dd******************************************************
**///-----------------------------------------------------
// 必要的头文件
//-----------------------------------------------------
#include "delay.h"
#include "lcd1602.h"int main()
{char *str = "Kylin STM32";	//字符串类型float ver = 3.2;			//浮点类型delay_init();				//Systick初始化,用于普通的延时Lcd1602_Init();				//LCD1602初始化Lcd1602_Printf(0, 0, "%s", str);Lcd1602_Printf(1, 0, "version:%.1f", ver);while(1);
}

        可以看到,带变参的 Lcd1602_Printf() 函数更灵活通用,使我们不必再纠结显示内容究竟是什么数据类型,这是它的优势。那有没有劣势呢?当然有了,在显示同样内容的情况下,使用Lcd1602_Printf() 函数比用 Lcd1602_ShowStr() 函数编译出来的代码量大了不是一点儿,如图20所示。

图20 编译的代码量对比

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


http://www.ppmy.cn/devtools/56058.html

相关文章

postgreSQL学习

postgreSql学习 学习参考:1、命令1.1 登录1.2 关闭连接 2、常用数据类型2.1 数值类型2.2 字符串类型2.3 时间2.4 其他 3、自增主键4、sql4.1 库操作(1)创建新库(2)切换数据库(3)删库【谨慎&…

PH计仪器校准内容,以及相关注意事项内容

ph计大家一定不陌生,在日常生活中和实验场所,经常会有看到这种计量器具,作为测定ph值的常用仪器,其运用领域可谓十分广泛,不过因为其结构的特殊性,加上传感器的原理问题,其自身的计量校准也需要…

LeetCode-数组/回溯-No39组合总和

题目: 给你一个无重复元素的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有不同组合 ,并以列表形式返回。你可以按任意顺序返回这些组合。 candidates 中的同一个数字可以无限制重复被选…

vue滚动到页面底部时加载

handleScroll 函数监听页面滚动事件,当滚动到页面底部时执行代码。 通过这种方式,当用户滚动到页面底部时,将会动态加载更多内容,直到达到设定的总项目数。 const spinning ref(false); // 正在加载Loading... onMounted(() &g…

看小说?笔趣阁?你是怎么爬取的?

笔趣阁小说爬虫源代码开源 具体运用的知识: request库中的get请求正则表达式的匹配规则parsel的Selector.css的解析进制数的转换数据保存 具体怎么查看和解析网页,我就不过多解释了,不过可以私信问我,我会教小伙伴怎么完成&#…

隐藏html5中video标签的控件

1、 隐藏视频控件: 使用video::-webkit-media-controls、video::-moz-media-controls、video::-ms-media-controls等CSS选择器来隐藏不同浏览器上的默认控件。video::part(media-controls)用于覆盖未来的标准,确保最大兼容性。 /* 隐藏所有默认控件 */…

使用Testcontainers进行Java集成测试

在现代软件开发中,集成测试是确保应用程序与其依赖项(如数据库、消息队列等)正确交互的关键步骤。Testcontainers是一个支持JUnit测试的Java库,它提供了一个简单而强大的方式来创建和管理测试所需的任何Docker容器。本文将详细介绍…

chrome 配置允许跨域

目录 1.Chrome跨域插件配置 1.1启动插件 1.2. 设置本地调试跨域 2 Firefox跨域插件 2.1. 安装插件 CORS Everywhere 2.2. 启动插件 3 工具下载链接 1.Chrome跨域插件配置 使用chrome插件“Allow CORS: Access-Control-Allow-origin ”来解决跨域问题。 点击pin图标&…