速通蓝桥杯嵌入式省一教程:(五)用按键和屏幕实现嵌入式交互系统

一个完整的嵌入式系统,包括任务执行部分和人机交互部分。在前四节中,我们已经讲解了LED、LCD和按键,用这三者就能够实现一个人机交互系统,也即搭建整个嵌入式系统的框架。在后续,只要将各个功能加入到这个交互系统中,即可完成整个嵌入式系统的设计。因此,尽管你什么都不会,只会使用LED、LCD和按键,也至少能获得省三或省二的奖项。下面我们就以第十四届省赛题为例,看看如何实现一个完善的交互系统。

c952c7d7e6534ec1806c47c320b4df9b.png

0332ed65b11c46d2987e0b3f4912bed3.png

9cf78ef142d146e097d4579920358009.png

698ba608e7124a0bb3a05fc6cc6f5dad.png

首先我们来看第一个要求:按下B1切换界面:

c952c7d7e6534ec1806c47c320b4df9b.png

结合第二节:LCD显示的内容,只需要将切换界面处的判断条件更换为key[0].single_flag == 1即可:

if (key[0].single_flag == 1)
{LCD_Clear(Black);          //每切换一次界面清一次屏view++;if (view > 2){view = 0;}key[0].single_flag = 0;    //标志位清零(重要!)
}

再来看第二个要求:

fffa615b384d47df9fca5f996da4aa0e.png

1556556cae2749ab895296684d8fb622.png

B2的要求相对于B1来说,只是增加了不同界面的不同功能,其本质是一样的。注意,第二个小要求需要切换选择参数,这就需要一个标志变量choose。每次重新进入参数界面时,默认可调整的参数为R,只需要在切换界面时把choose重新赋值为'R'即可。

char choose = 'R';
if (key[1].single_flag == 1)
{if (view == 0)             //数据界面{/* 5s切换模式 */if (M == 'H')    M = 'L';else    M = 'H';N++;                   //统计次数}else if (view == 1)        //参数界面{if (choose == 'R')    choose = 'K';else    choose = 'R';}key[1].single_flag = 0;    //标志位清零(重要!)
}

要求3:

85f86215a2e34327b5ded00e24bc043e.png

结合要求2,当choose=='R'时,对R进行++;当choose=='K'时,对K进行++:

if (key[2].single_flag == 1 && view == 1)    //参数界面
{if (choose == 'R'){R++;if (R > 10)    R = 1;}else{K++;if (K > 10)    K = 1;}key[2].single_flag = 0;                 //标志位清零(重要!)
}

要求4:

5de81558f47947d8a6d03cf2b17b3d85.png

要求4的第1个要求与要求3类似,不再赘述。第2个要求要标志是否处于锁定状态,同样需要一个标志变量lock

if (key[3].single_flag==1 && view==1)        //参数界面
{if (choose == 'R'){R--;if (R < 1)    R = 10;}else{K--;if (K < 1)    K = 10;}key[3].single_flag = 0;                  //标志位清零(重要!)
}bool lock = 0;
if (view==0 && lock==0)                      //数据界面,解锁状态
{if (key[3].long_flag == 1)    lock = 1;key[3].long_flag = 0;                    //标志位清零(重要!)
}
else if (view==0 && lock==1)                 //数据界面,锁定状态
{if (key[3].single_flag == 1)    lock = 0;key[3].single_flag = 0;                  //标志位清零(重要!)
}

将所有有关LED、LCD与按键的操作封装成函数,在主循环中调用,即可实现一个交互系统。

/* task.c */#include "task.h"uint8_t view = 0;
char choose = 'R';
bool lock = 0;
char M = 'L';
int P;
double V, MH, ML;
int R = 1;
int K = 1;
int N = 0;
char text[20];void key_pro(void)
{//B1if (key[0].single_flag == 1){LCD_Clear(Black);view++;choose = 'R';if (view > 2){view = 0;}key[0].single_flag = 0;}//B2if (key[1].single_flag == 1){if (view == 0){/***************5s切换模式LED_Toggle(LD2);HAL_Delay(100);***************/if (M == 'H')    M = 'L';else    M = 'H';N++;}else if (view == 1){if (choose == 'R')    choose = 'K';else    choose = 'R';}key[1].single_flag = 0;}//B3if (key[2].single_flag == 1 && view == 1){if (choose == 'R'){R++;if (R > 10)    R = 1;}else{K++;if (K > 10)    K = 1;}key[2].single_flag = 0;}//B4if (key[3].single_flag==1 && view==1){if (choose == 'R'){R--;if (R < 1)    R = 10;}else{K--;if (K < 1)    K = 10;}key[3].single_flag = 0;}if (view==0 && lock==0){if (key[3].long_flag == 1)    lock = 1;key[3].long_flag = 0;}else if (view==0 && lock==1){if (key[3].single_flag == 1)    lock = 0;key[3].single_flag = 0;}
}void display(void)
{if (view == 0){LCD_DisplayStringLine(Line1, (uint8_t *)"        DATA        ");sprintf(text, "     M=%c            ", M);LCD_DisplayStringLine(Line3, (uint8_t *)text);sprintf(text, "     P=%d%%         ", P);LCD_DisplayStringLine(Line4, (uint8_t *)text);sprintf(text, "     V=%.1f        ", V);LCD_DisplayStringLine(Line5, (uint8_t *)text);LED_On(LD1);}if (view == 1){LCD_DisplayStringLine(Line1, (uint8_t *)"        PARA        ");sprintf(text, "     R=%d           ", R);LCD_DisplayStringLine(Line3, (uint8_t *)text);sprintf(text, "     K=%d           ", K);LCD_DisplayStringLine(Line4, (uint8_t *)text);LED_Off(LD1);}if (view == 2){LCD_DisplayStringLine(Line1, (uint8_t *)"        RECD        ");sprintf(text, "     N=%d           ", N);LCD_DisplayStringLine(Line3, (uint8_t *)text);sprintf(text, "     MH=%.1f       ", MH);LCD_DisplayStringLine(Line4, (uint8_t *)text);sprintf(text, "     ML=%.1f        ", V);LCD_DisplayStringLine(Line5, (uint8_t *)text);LED_Off(LD1);}if (lock == 1)    LED_On(LD3);else    LED_Off(LD3);
}
/* task.h */#ifndef __TASK_H
#define __TASK_H#include "main.h"
#include <stdio.h>
#include "led.h"
#include "lcd.h"
#include "fonts.h"
#include "key.h"void key_pro(void);
void display(void);#endif /* __TASK_H */

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

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

相关文章

单体版ruoyi表格绑定按钮

先需要在表格中添加一个按钮&#xff0c;可以快速操作这条数据的某个0/1状态 表格的列 editFlag是检验用户是否有操作的权限 var editFlag [[${permission.hasPermi(pipayshop:itemCommoidtyInfoCategoryTop:edit)}]]; 绑定状态条 /* 用户状态显示 */function statusTools(…

分布式图数据库 NebulaGraph v3.6.0 正式发布,强化全文索引能力

本次 v3.6.0 版本&#xff0c;主要强化全文索引能力&#xff0c;以及优化部分场景下的 MATCH 性能。 强化 强化增强全文索引功能&#xff0c;具体 pr 参见&#xff1a;#5567、#5575、#5577、#5580、#5584、#5587 优化 支持使用 MATCH 子句检索 VID 或属性索引时使用变量&am…

【Sklearn】基于AdaBoost算法的数据分类预测(Excel可直接替换数据)

【Sklearn】基于AdaBoost算法的数据分类预测(Excel可直接替换数据) 1.模型原理2.模型参数3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果1.模型原理 AdaBoost(Adaptive Boosting)是一种集成学习算法,它通过组合多个弱分类器来构建一个更强大的分类器。下面是AdaBo…

C++ 对象生成:构造函数

对象生成&#xff1a;构造函数 一、构造函数特性二、三种构造函数1.无参构造函数2.有参构造函数3.拷贝构造函数 一、构造函数特性 C编译器提供了构造函数供程序生成对象这是一个与类同名的函数&#xff0c;参数可以有多种形式&#xff08;重载&#xff09;没有返回类型声明一般…

3d max省时插件CG MAGIC功能中的材质参数可一键优化!

渲染的最终结果就是为了让渲染效果更加真实的体现。 对于一些操作上&#xff0c;可能还是费些时间&#xff0c;VRay可以说是在给材质做加法的路上越走越远&#xff0c;透明度、凹凸、反射等等参数细节越做越多。 对于材质参数调节的重要性大家都心里有数的。 VRay材质系统的每…

IDEA源码下载失败问题

1.IDEA下载源码报 java.lang.RuntimeException: Cannot reconnect java.lang.RuntimeException: Cannot reconnect 异常通常表示无法重新连接到资源或服务。这种情况可能出现在尝试重新连接到数据库、网络套接字或任何需要连接的资源时。 以下是解决此异常的几种可能方法&…

语言基础2 矩阵和数组

语言基础2 矩阵和数组 矩阵和数组是matlab中信息和数据的基本表示形式 可以创建常用的数组和网格 合并现有的数组 操作数组的形状和内容 以及使用索引访问数组元素 用到的函数列表如下 一 创建 串联和扩展矩阵 矩阵时按行和列排列的数据元素的二维数据元素的二维矩…

C# File.ReadAllLines()报错

项目中需要读取一个文本文件的内容&#xff0c;调用C#的File.ReadAllLines(path)方法&#xff0c;但是报错&#xff0c;就提示unknown exception&#xff0c;也没其他提示了。 文件是在的&#xff0c;并且&#xff0c;如果把文件拷贝到另外一个路径&#xff0c;再次读取是正常…

c++ | uint8_t、uint16_t、unint32_t 和size_t

头文件 #include <stdint.h> // for C #include <cstdint> // for Cuint8_t、uint16_t、unint32_t 这三个分别是表示无符号整型&#xff0c;不同点是他们的长度不同&#xff0c;分别是8位机器位、16、32&#xff0c;也就是一个字节、两个字节、四个字节 注意在…

Angular16的路由守卫基础使用

Angular16的路由守卫基础使用 使用ng generate guard /guard/login命令生成guard文件因新版Angular取消了CanActivate的使用&#xff0c;改用CanActivateFn&#xff0c;因此使用router跳转需要通过inject的方式导入。 import { inject } from angular/core; import { CanActi…

低光图像增强:利用深度学习的LLNet与图形用户界面进行优化的实践

第一部分&#xff1a;引言与LLNet概述 随着技术的快速进步&#xff0c;图像增强已经变得日益重要。低光照条件下的图像经常受到噪声、模糊和颜色失真的影响&#xff0c;这使得图像的质量受到损害。为了解决这一问题&#xff0c;研究者们开发了多种技术来增强低光图像。其中&am…

Pytorch的torch.utils.data中Dataset以及DataLoader等详解

在我们进行深度学习的过程中&#xff0c;不免要用到数据集&#xff0c;那么数据集是如何加载到我们的模型中进行训练的呢&#xff1f;以往我们大多数初学者肯定都是拿网上的代码直接用&#xff0c;但是它底层的原理到底是什么还是不太清楚。所以今天就从内置的Dataset函数和自定…

数据可视化:图表绘制详解

数据可视化是一种将抽象的数字和数据转化为直观图形的技术&#xff0c;使数据的模式、趋势和关系一目了然。本文将详细介绍如何绘制各种类型的图表&#xff0c;包括柱状图、折线图、饼图、散点图和热力图等。 第一部分&#xff1a;图表类型和选择 1. 柱状图 柱状图是用于比较类…

c++通过gsop调用基于https的webservice接口总结

ww哦步骤&#xff1a; 第一步&#xff1a;生成头文件 webservice接口一般会有一个对外接口文档。比如&#xff1a;http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?WSDL 问号后面的参数表示WSDL文档&#xff0c;是一个XML文档&#xff0c;看不懂配置没关系&a…

Kotlin实战之获取本地配置文件、远程Apollo配置失败问题排查

背景 Kotlin作为一门JVM脚本语言&#xff0c;收到很多Java开发者的青睐。 项目采用JavaKotlin混合编程。Spring Boot应用开发&#xff0c;不会发生变动的配置放在本地配置文件&#xff0c;可能会变化的配置放在远程Apollo Server。 问题 因为业务需要&#xff0c;需要增加一…

关于angular router-outlet

关于angular router-outlet Angular是一个现代化的前端框架&#xff0c;它提供了很多强大的工具来帮助我们开发出高效的Web应用。其中一个最常用的功能是路由&#xff08;routing&#xff09;系统&#xff0c;它允许我们在不同的URL之间导航并加载不同的组件。而<router-ou…

Java日志框架-JUL

JUL全称Java util logging 入门案例 先来看着入门案例&#xff0c;直接创建logger对象&#xff0c;然后传入日志级别和打印的信息&#xff0c;就能在控制台输出信息。 可以看出只输出了部分的信息&#xff0c;其实默认的日志控制器是有一个默认的日志级别的&#xff0c;默认就…

智慧水利利用4G物联网技术实现远程监测、控制、管理

智慧水利工业路由器是集合数据采集、实时监控、远程管理的4G物联网通讯设备&#xff0c;能够让传统水利系统实现智能化的实时监控和远程管理。工业路由器利用4G无线网络技术&#xff0c;能够实时传输数据和终端信息&#xff0c;为水利系统的运维提供有效的支持。 智慧水利系统是…

树莓派和windows之间文件传输

方案一&#xff1a;FileZilla 在电脑上下载FileZilla软件并打开&#xff0c;输入配置信息&#xff0c;用户名/密码、树莓派的IP地址,点击“快速连接” 方案二&#xff1a;samba 树莓派安装 samba 软件 sudo apt-get install samba samba-common-bin 修改配置文件 / etc /samba…

[Python]pytorch与C交互

文章目录 C库ctypes基础数据类型参数与返回值类型数组指针结构体类型回调函数工具函数 示例 ctypes是Python的外部函数&#xff0c;提供了与C兼容的类型&#xff0c;并允许调用DLL库中的函数。 C库 要使函数能被Python调用&#xff0c;需要编译为动态库&#xff1a; # -fPIC…