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

一个完整的嵌入式系统,包括任务执行部分和人机交互部分。在前四节中,我们已经讲解了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 */

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《游戏编程模式》学习笔记(七)状态模式 State Pattern

状态模式的定义 允许对象在当内部状态改变时改变其行为&#xff0c;就好像此对象改变了自己的类一样。 举个例子 在书的示例里要求你写一个人物控制器&#xff0c;实现跳跃功能 直觉上来说&#xff0c;我们代码会这么写&#xff1a; void Heroine::handleInput(Input input…

汽车OTA活动高质量发展的“常”与“新”

伴随着车主的频繁崔更&#xff0c;车企除了卷硬件、拼价格&#xff0c;逐渐将精力转移到汽车全生命周期的常用常新。时至下半年&#xff0c;车企OTA圈愈发热闹&#xff0c;以新势力、新实力为代表新一代车企&#xff0c;OTA运营活动逐渐进入高质量发展期。 所谓高质量&#xf…

mongodb.使用自带命令工具导出导入数据

在一次数据更新中&#xff0c;同事把老数据进行了清空操作&#xff0c;但是新的逻辑数据由于某种原因&#xff08;好像是她的电脑中病毒了&#xff09;&#xff0c;一直无法正常连接数据库进行数据插入&#xff0c;然后下午2点左右要给甲方演示&#xff0c;所以要紧急恢复本地的…

历数浙大MPA提前批面试的三大变化

从2019年招生开始&#xff0c;浙大mpa项目的招生趋势一直处于稳增状态&#xff0c;特别是提前批面试政策的出现&#xff0c;更加为项目的整体招录添上神奇的一笔。为什么要举行提面&#xff1f;一方面报考的人数比较多&#xff0c;有了选拔的余地和基础&#xff1b;另一方面也能…

国产32位单片机XL32F001,带1 路 12bit ADC,I2C、SPI、USART 等外设

XL32F001 系列单片机采用高性能的 32 位 ARM Cortex-M0内核&#xff0c;宽电压工作范围的 MCU。嵌入 24KbytesFlash 和 3Kbytes SRAM 存储器&#xff0c;最高工作频率 24MHz。包含多种不同封装类型多款产品。芯片集成 I2C、SPI、USART 等通讯外设&#xff0c;1 路 12bit ADC&am…

牛客OJ题 打印日期

⭐️ 题目描述 &#x1f31f; OJ链接&#xff1a;https://www.nowcoder.com/practice/b1f7a77416194fd3abd63737cdfcf82b?tpId69&&tqId29669&rp1&ru/activity/oj&qru/ta/hust-kaoyan/question-ranking 思路&#xff1a; 默认从一月的天数开始&#xff0c…

【zabbix企业级监控】

目录 Zabbix Zabbix特点 实验环境准备 Server端 agent端 server端 配置阿里云yum源 启动LAMP对应服务 准备java环境 源码安装zabbix Mariadb数据库授权 创建zabbix程序用户并授权防止权限报错 修改zabbix配置文件 配置php与apache web安装zabbix Zabbix页面优化…

bert,transformer架构图及面试题

Transformer详解 - mathor atten之后经过一个全连接层残差层归一化 class BertSelfOutput(nn.Module):def __init__(self, config):super().__init__()self.dense nn.Linear(config.hidden_size, config.hidden_size)self.LayerNorm nn.LayerNorm(config.hidden_size, epscon…

Ghost-free High Dynamic Range Imaging withContext-aware Transformer

Abstract 高动态范围(HDR)去鬼算法旨在生成具有真实感细节的无鬼HDR图像。 受感受野局部性的限制&#xff0c;现有的基于CNN的方法在大运动和严重饱和度的情况下容易产生重影伪影和强度畸变。 本文提出了一种新的上下文感知视觉转换器&#xff08;CA-VIT&#xff09;用于高动态…

最小化安装移动云大云操作系统--BCLinux-R8-U8-Server-x86_64-230802版

CentOS 结束技术支持&#xff0c;转为RHEL的前置stream版本后&#xff0c;国内开源Linux服务器OS生态转向了开源龙蜥和开源欧拉两大开源社区&#xff0c;对应衍生出了一系列商用Linux服务器系统。BC-Linux V8.8是中国移动基于龙蜥社区Anolis OS 8.8版本深度定制的企业级X86服务…

SQL力扣练习(十一)

目录 1.树节点(608) 示例 1 解法一(case when) 解法二(not in) 2.判断三角形(610) 示例 1 解法一(case when) 解法二(if) 解法三(嵌套if) 3.只出现一次的最大数字(619) 示例 1 解法一(count limit) 解法二(max) 4.有趣的电影(620) 解法一 5.换座位(626) 示例 …

[鹤城杯 2021]Middle magic 解题思路过程

过程 打开题目&#xff0c;是一道PHP的代码审计。代码如下&#xff1a; <?php highlight_file(__FILE__); include "./flag.php"; include "./result.php"; if(isset($_GET[aaa]) && strlen($_GET[aaa]) < 20){$aaa preg_replace(/^(.*)…

CG MAGIC分享为什么使用3d Max渲染,呈现白蒙蒙的?

使用3d Max渲染&#xff0c;有小伙伴反映&#xff0c;为什么渲染过程中&#xff0c;max渲染&#xff0c;总是出现白蒙蒙的的效果呢&#xff1f; 渲染出这白白一片是什么原因导致的呢&#xff1f; 想要解决的朋友&#xff0c;点进来&#xff0c;看看CG MAGIC小编整理的解决方法…

第八章LVS中的DR模式详解

1&#xff0c;LVS-DR数据包的流向分析 总结&#xff1a; &#xff08;1&#xff09;客户端发送请求到 Director Server&#xff08;负载均衡器&#xff09;&#xff0c;请求的数据报文&#xff08;源 IP 是 CIP,目标 IP 是 VIP&#xff09;到达内核空间。 &#xff08;2&#…

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

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

Day14 01-Shell脚本编程详解

文章目录 第一章 Shell编程【重点】1.1. Shell的概念介绍1.1.1. 命令解释器4.1.1.2. Shell脚本 1.2. Shell编程规范1.2.1. 脚本文件的结构1.2.2. 脚本文件的执行 1.3. Shell的变量1.3.1. 变量的用法1.3.2. 变量的分类1.3.3. 局部变量1.3.4. 环境变量1.3.5. 位置参数变量1.3.6. …

旅行越野SUV——捷途旅行者即将与大家见面!

从2020年开始,国内车市踊跃出许多性格鲜明的车型,例如坦克300、极氪001、蔚来ET5旅行版以及五菱悦野,虽然它们属于小众车型,但奈何销量都非常亮眼,这也从另一角度证明现如今的年轻消费群体很喜欢特点鲜明的汽车产品。前段时间,捷途汽车发布的捷途旅行者,一款定位旅行越野SUV的新…

SpringBoot + Vue 微人事(十)

职位管理前后端接口对接 先把table中的数据展示出来&#xff0c;table里面的数据实际上是positions里面的数据&#xff0c;就是要给positions:[] 赋上值 可以在methods中定义一个initPosition方法 methods:{//定义一个初始化positions的方法initPositions(){//发送一个get请求…

Java开源项目mall学习笔记(1)——项目初始化

一、学习声明与项目介绍 该笔记是记录学习开源项目mall过程的文档笔记&#xff0c;完全原创&#xff0c;转载请声明。同时也对开源项目的作者表示感谢&#xff01; mall: &#x1f525; mall项目是一套基于 SpringBoot Vue uni-app 实现的电商系统&#xff0c;包括前台商城项…

android resoure资源图片颜色值错乱

最近androidstudio开发&#xff0c;添加一些颜色值或者drawable资源文件时&#xff0c;运行app,颜色值或者图片对应不上&#xff0c;暂时找不到原因&#xff0c;望告知。 暂时解决方法&#xff1a;