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

news2024/12/26 12:07:10

一个完整的嵌入式系统,包括任务执行部分和人机交互部分。在前四节中,我们已经讲解了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)
{
    //B1
    if (key[0].single_flag == 1)
    {
        LCD_Clear(Black);
        view++;
        choose = 'R';
        if (view > 2)
        {
            view = 0;
        }
        key[0].single_flag = 0;
    }

    //B2
    if (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;
    }

    //B3
    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;
    }

    //B4
    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;
    }
    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.coloradmin.cn/o/900027.html

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

相关文章

赏味不足:详细来聊下轻资产运作,我从不做重资产

来源&#xff1a;BV1F84y1g7u3 好 大家好&#xff0c;是这样子的 对吧&#xff0c;因为最近聊了也很多&#xff0c;然后我在过程当中也发现&#xff0c;很多人对于不管是创业还是做副业&#xff0c;还是说找一条多种路&#xff0c;就是说可能不是那么清晰&#xff0c;然后我在这…

使用Dockerfile部署java项目

1、移动java包到创建的目录下 2、编写Dockerfile文件 在同一目录下使用如下命令创建文件 touch Dockerfile 文件内容如下&#xff1a; #依赖的父镜像 FROM java:8 #作者 MAINTAINER maxurui #jar包添加到镜像中 ADD springboot3-0.0.1-SNAPSHOT.jar springboot3-0.0.1-SNAPSHO…

射频同轴线阻抗

射频同轴线阻抗 射频同轴线的阻抗与线的绝缘介质的介电常数有关&#xff0c;与线的屏蔽层半径与内部导线半径的比值有关&#xff1a; R 0 1 2 π μ ′ ϵ ′ ln ⁡ ( r 2 r 1 ) \begin{align} R_0\frac{1}{2\pi}\sqrt{\frac{\mu^{}}{\epsilon^{}}}\ln(\frac{r_2}{r_1}) \en…

图数据库_Neo4j中文版_Centos7.9安装Neo4j社区版3.5.9_基于jdk1.8---Neo4j图数据库工作笔记0012

由于我们在国内使用啊,具体还是要用中文版滴,找了好久这个neo4j,原来还是有中文版的, https://we-yun.com/doc/neo4j-chs/ 中文版下载地址在这里: 所有版本都在这里了,需要哪个自己去下载就可以了,要注意下载以后,参考: https://we-yun.com/blog/prod-56.html 在这个位置下载…

Linux系统--进程间通信

文章目录 什么是进程间通信匿名管道命名管道 system V共享内存 system V消息队列 信号量 一、什么是进程间通信 首先由于进程运行是具有独立性的&#xff0c;具有独立的页表&#xff0c;PCB和虚拟地址空间等&#xff0c;父子进程间数据互补干扰。这就让进程间通信难度加大。由…

C语言:字符函数和字符串函数

往期文章 C语言&#xff1a;初识C语言C语言&#xff1a;分支语句和循环语句C语言&#xff1a;函数C语言&#xff1a;数组C语言&#xff1a;操作符详解C语言&#xff1a;指针详解C语言&#xff1a;结构体C语言&#xff1a;数据的存储 目录 往期文章前言1. 函数介绍1.1 strlen1.…

最新觅知扶风视频解析计费系统源码V1.8.2 免授权优化版 附教程

最新觅知扶风视频解析计费系统源码V1.8.2 免授权优化版 附教程 之前有分享过 1.7.1 的扶风计费系统&#xff0c;那个版本很久了之前也一直没有更新&#xff0c;拿到源码之后进行优化&#xff0c;因历史版本的加载和原版的加载速度真的是慢的感人&#xff0c;因此从零开始进行去…

发布一个开源的新闻api(整理后就开源)

目录 说明: 基础说明 其他说明: 通用接口&#xff1a; 登录: 注册: 更改密码(需要token) 更换头像(需要token) 获取用户列表(需要token): 上传文件(5000端口): 获取文件(5000端口)源码文件&#xff0c;db文件均不能获取: 验证token(需要token): 获取系统时间: 文件…

STM32 CubeMX (第一步Freertos任务管理:创建、删除、挂起、恢复)

STM32 CubeMX Freertos STM32 CubeMX &#xff08;Freertos任务&#xff1a;创建、删除、挂起、恢复&#xff09; STM32 CubeMX Freertos前言一、STM32 CubeMX 配置时钟树配置HAL时基选择TIM1&#xff08;不要选择滴答定时器&#xff1b;滴答定时器留给OS系统做时基&#xff09…

Hlang--用Python写个编程语言-判断与循环

文章目录 前言语法描述判断循环词法解析语法解析定义节点生成节点判断节点循环节点解释器处理判断节点循环处理前言 okey,很好,在上一篇文章当中,我们实现了这个基本的逻辑运算,所以的话,在这里,我们将可以实现到我们的这个判断和循环了。由于这里的话,我们的操作其实和…

搭建私有镜像仓库Harbor

目录 系统环境&#xff1a; 安装Docker-Compose 下载并安装Harber 启动Harbor&#xff01;&#xff01;&#xff01; 系统环境&#xff1a; Centos7.9Docker-ce:24 安装Docker-Compose curl -L "https://github.com/docker/compose/releases/download/v2.20…

Debezium日常分享系列之:临时阻塞快照Ad-hoc blocking snapshots

Debezium日常分享系列之&#xff1a;临时阻塞快照Ad-hoc blocking snapshots 一、认识临时阻塞快照二、临时阻塞快照信号格式三、临时阻塞快照效果 一、认识临时阻塞快照 增量快照于大约两年前在 Debezium 1.6 中首次引入&#xff0c;并且在社区中仍然非常受欢迎&#xff0c;用…

【CAM】CAM(Class Activation Mapping)——可视化CNN的特征定位

文章目录 一、CAM(Class Activation Mapping)二、CAM技术实现2.1 网络修改2.2 微调2.2 特征提取 三、总结Reference 完整代码见Github &#xff1a;https://github.com/capsule2077/CAM-Visualization &#xff0c;如果有用可以点个Star&#xff0c;谢谢&#xff01; 一、CAM(C…

如何获取全国城市行政区划划分API接口?

随着大数据时代的到来&#xff0c;数据成为了各行各业必不可少的资源。特别是城市行政区划数据&#xff0c;它不仅是政府公共管理的基础&#xff0c;也是地理信息系统数据的基础&#xff0c;更是各行业进行市场调研和商业分析的重要数据资源。本篇文章将介绍一个城市行政区划划…

对象内存布局与对象头

对象内存布局 在Hotspot虚拟机里&#xff0c;对象在堆内存中的存储布局可以划分为三个部分&#xff1a;对象头、实例数据、对齐填充。 对象头 在64为系统中&#xff0c;Mark word 占了8个字节&#xff0c;cla ss Pointer 占了8个字节。从jdk1.8开始&#xff0c;存在指针压缩&am…

windows 下使用 nvm use切换无效

问题描述&#xff1a;windows 下使用 nvm use切换无效&#xff0c;其他例如nvm list,nvm install...却能够成功使用。 解决办法&#xff1a;修改用户变量和环境变量中NVM_SYMLINK的路径为你想要修改的版本所在路径。 例如&#xff1a; &#xff08;想修改的目标版本所在路径&am…

若依项目的介绍(前后端分离版本)

目录 一、若依介绍 &#xff08;一&#xff09;简单介绍 &#xff08;二&#xff09;若依版本 &#xff08;三&#xff09;Git远程拉取步骤 二、项目的技术介绍 &#xff08;一&#xff09;后端技术 1.spring boot 2.Spring Security安全控制 3.MyBatis 4.MySQL和R…

Android学习之路(5) UI控件之Button (按钮)与 ImageButton (图像按钮)

本节引言&#xff1a; 今天给大家介绍的Android基本控件中的两个按钮控件&#xff0c;Button普通按钮和ImageButton图像按钮&#xff1b; 其实ImageButton和Button的用法基本类似&#xff0c;至于与图片相关的则和后面ImageView相同&#xff0c;所以本节 只对Button进行讲解&am…

黑客、骇客、红蓝对抗中几百种渗透测试工具集合全精华最新整理以及各类CTF资料

黑客、骇客、红蓝对抗中几百种渗透测试工具集合全精华最新整理以及各类CTF资料。 WebGoat漏洞练习平台 https://github.com/WebGoat/WebGoat webgoat-legacy漏洞练习平台 https://github.com/WebGoat/WebGoat-Legacy zvuldirll漏洞练习平台 https://github.com/710leo/ZVul…

OJ练习第153题——加油站

加油站 力扣链接&#xff1a;134. 加油站 题目描述 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xf…