速通蓝桥杯嵌入式省一教程:(五)用按键和屏幕实现嵌入式交互系统
一个完整的嵌入式系统,包括任务执行部分和人机交互部分。在前四节中,我们已经讲解了LED、LCD和按键,用这三者就能够实现一个人机交互系统,也即搭建整个嵌入式系统的框架。在后续,只要将各个功能加入到这个交互系统中,即可完成整个嵌入式系统的设计。因此,尽管你什么都不会,只会使用LED、LCD和按键,也至少能获得省三或省二的奖项。下面我们就以第十四届省赛题为例,看看如何实现一个完善的交互系统。
首先我们来看第一个要求:按下B1切换界面:
结合第二节: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; //标志位清零(重要!)
}
再来看第二个要求:
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:
结合要求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:
要求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);***************/LED_Off(LD2);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);}else 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);}else 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 */
相关文章:

速通蓝桥杯嵌入式省一教程:(五)用按键和屏幕实现嵌入式交互系统
一个完整的嵌入式系统,包括任务执行部分和人机交互部分。在前四节中,我们已经讲解了LED、LCD和按键,用这三者就能够实现一个人机交互系统,也即搭建整个嵌入式系统的框架。在后续,只要将各个功能加入到这个交互系统中&a…...

虚拟拍摄,如何用stable diffusion制作自己的形象照?
最近收到了某活动的嘉宾邀请,我将分享: 主题:生成式人工智能的创新实践 简要描述:从品牌营销、智能体、数字内容创作、下一代社区范式等方面,分享LLM与图像等生成式模型的落地应用与实践经验。 领域/研究方向ÿ…...

开启AI创新之旅!“华为云杯”2023人工智能应用创新大赛等你来挑战
简介 近年来,人工智能技术的发展如日中天,深刻地改变着我们的生活方式和产业格局。 为了培养AI人才,持续赋能AI企业,推进国家新一代人工智能开放创新平台建设,打造更加完善的AI技术创新生态,华为…...

npm和node版本升级教程
cmd中查看本地安装的node版本 node -v //查询node的位置 where node2.官网下载所需要的node版本,安装在刚查出来的文件夹下,即覆盖掉原来的版本 3.查看node版本是否已经更新 4.查看npm版本是否和node版本相匹配 cnpm install -g npm...

C++入门篇9---list
list是带头双向循环链表 一、list的相关接口及其功能 1. 构造函数 函数声明功能说明list(size_type n,const value_type& valvalue_type())构造的list中包含n个值为val的元素list()构造空的listlist(const list& x)拷贝构造list(InputIterator first, InputIterator…...

STM32基于CubeIDE和HAL库 基础入门学习笔记:物联网项目开发流程和思路
文章目录: 第一部分:项目开始前的计划与准备 1.项目策划和开发规范 1.1 项目要求文档 1.2 技术实现文档 1.3 开发规范 2.创建项目工程与日志 第二部分:调通硬件电路与驱动程序 第三部分:编写最基础的应用程序 第四部分&…...
Hive on Spark (1)
spark中executor和driver分别有什么作用? Spark中Executor 在 Apache Spark 中,Executor 是分布式计算框架中的一个关键组件,用于在集群中执行具体的计算任务。每个 Executor 都在独立的 JVM 进程中运行,可以在集群的多台机器上…...

PostgreSQL基本操作总结
安装按PostgreSQL数据库后,会默认创建用户postgres和数据库postgres,这个用户是超级用户,权限最高,可以创建其他用户和权限,在实际开发过程中,会新创建用户和业务数据库,本文主要介绍用户权限和…...
Jakarta 的 Servlet 下BeanUtils的日期处理 和JSTL 的使用
jsp优于性能等问题已经不被spring boot等支持,如果想使用jsp和jstl标签库需要引入一下依赖。 <!-- 用jakarta.servlet.jsp.jstl,用org.glassfish.web--><dependency><groupId>jakarta.servlet.jsp.jstl</groupId><art…...

聚焦电力行业CentOS迁移,麒麟信安受邀参加第六届电力信息通信新技术大会暨数字化发展论坛并发表主题演讲
为加快推进“双碳”目标下的新型能源体系和新型电力系统建设,深化新一代数字技术与电力业务的融合发展,促进电力行业关键技术自主创新、安全可控,助力电力企业数字化转型升级和高质量发展,2023年8月9-11日,第六届电力信…...
华为OD真题--分月饼--带答案
1. 华为OD机考题 答案 2023华为OD统一考试(AB卷)题库清单-带答案(持续更新) 2023年华为OD真题机考题库大全-带答案(持续更新) 2. 面试题 一手真实java面试题:2023年各大公司java面试真题汇总--…...

帆软大屏2.0企业制作
 数字化观点中心 / 当前页 如何从0-1制作数据大屏,我用大白话给你解释清楚了 文 | 商业智能BI相关文章 阅读次数:18,192 次浏览 2023-06-08 11:51:49 好莱坞大片《摩天营救》中有这么一个场景:  你可以看见反派大b…...

【学习笔记之opcua】使用Python获取opcua数据
Python与OPC UA的应用 示例代码 将代码放入spyder中运行后,出现下面这个错误 没有‘opcua’,那我们就下载pip install opcua 之后出现下面这个错误 问问题大不,安装语句写错了 正经安装语句是 !pip install opcua 读取opcua协议数据测试 …...
apache doris和StarRocks的区别
记录一下最新要用到2个新数据库的区别 Apache Doris是一个分布式的列式存储系统,它的设计目标是提供大规模数据处理的可靠性和高性能。Doris采用了集群方式,通过将数据分布在多个机器上进行处理来提高性能,并提供了SQL查询接口方便用户使用。…...

文心一言最新重磅发布!
8月16日,由深度学习技术及应用国家工程研究中心主办的WAVE SUMMIT深度学习开发者大会2023举办。百度首席技术官、深度学习技术及应用国家工程研究中心主任王海峰以《大语言模型为通用人工智能带来曙光》为题,阐述了大语言模型具备理解、生成、逻辑、记忆…...
css整体使用
文章目录 html与csshtml、css与排版响应式与自适应布局自适应布局响应式布局 css规则class、id、以及默认的标签名的优先级 css书写位置flex整体逻辑 bootstrap资源 html与css html负责网页功能,css负责网页美化;浏览器本身有一套默认的css样式…...
LeetCode1578. 使绳子变成彩色的最短时间
思路 拆除成本 全部拆除 - 最大的不拆除在统计成本的同时,维持一个成本的最大值 代码 class Solution {public int minCost(String colors, int[] neededTime) {int res 0;int i 0;int len colors.length();while (i < len) {int max -1;int sum 0;char…...
如何在机器学习中实现分类?
机器学习和统计学中的分类是一种监督学习方法,其中计算机程序从给定的数据中学习并进行新的观察或分类。在本文中,我们将详细了解机器学习中的分类。 本博客涵盖以下主题: 目录 什么是机器学习中的分类? 机器学习中的分类术语 分类算法...

华为网络篇 RIP的负载均衡-29
难度2复杂度2 目录 一、实验原理 二、实验拓扑 三、实验步骤 四、实验过程 总结 一、实验原理 RIP是使用跳数(经过路由的数量)作为metric值的,当网络上存在去往目标的路由有两条以上都是相同metric时,就出现了流量负载均衡。…...
前端面试的性能优化部分(10)每天10个小知识点
目录 系列文章目录前端面试的性能优化部分(1)每天10个小知识点前端面试的性能优化部分(2)每天10个小知识点前端面试的性能优化部分(3)每天10个小知识点前端面试的性能优化部分(4)每天…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...