32单片机从入门到精通之用户界面——用户界面(十四)

news2025/1/10 19:28:49

不论你现在处于什么样的困境和挑战,不要放弃希望和努力。成功之路不会一帆风顺,但是只要你坚定信念,勇敢面对困难,努力奋斗,就一定能够战胜困难,迈向成功的道路。困难和挫折只是暂时的,而坚持和努力却是一种习惯和态度。每一次的失败和困境都是让你更强大的机会,它们会塑造你的性格,磨砺你的毅力。相信自己的能力,相信未来的可能性,不断追求进步和成长。无论前方有多少坎坷和挑战,只要你有梦想,并且用行动去追逐,你一定会找到属于自己的成功之路。不管有多困难,不管有多远,只要坚持就能迎来胜利的曙光。相信自己,勇往直前,你就能创造一个更加美好的未来。

目录

上一张试卷

知识点讲解

用户界面设计

1. 使用LCD/OLED屏幕显示信息

2. 设计按键、触摸屏等人机交互界面

试卷

一、选择题(每题2分,共10分)

二、简答题(每题10分,共30分)

三、编程题(每题15分,共30分)

四、设计题(每题15分,共30分)


上一张试卷

一、选择题(每题2分,共10分)

  1. 平均值的公式是:

     

    B. mean = (x1 + x2 + ... + xn) / n

  2. 查找一组数据的最大值的方法是:

     

    A. 遍历数组并更新最大值

  3. 一阶低通滤波器的主要作用是:

     

    B. 减少高频噪声

  4. 在嵌入式系统中,为了节省资源而选择不使用浮点运算时,通常会采用:

     

    B. 定点数运算

  5. 浮点单元(FPU)能够支持的标准浮点数运算是:

     

    A. IEEE 754

二、简答题(每题10分,共30分)

  1. 在嵌入式系统中计算平均值可以简单地通过遍历数值列表,将所有数值累加到一个变量中,然后除以数值的数量。需要注意的是,由于嵌入式系统的限制,可能需要考虑整数溢出的问题,因此在进行累加操作时应确保不会发生溢出。
#include <stdio.h>

float calculate_mean(int values[], int count) {
    long sum = 0; // 使用long类型来减少溢出的风险
    for (int i = 0; i < count; ++i) {
        sum += values[i];
    }
    return (float)sum / count;
}

int main() {
    int numbers[] = {1, 2, 3, 4, 5};
    int size = sizeof(numbers) / sizeof(numbers[0]);
    float mean = calculate_mean(numbers, size);
    printf("Mean: %f\n", mean);
    return 0;
}
  1. 找到一组数值的最大值和最小值可以通过遍历数组一次,并同时比较每个元素来确定最大值和最小值。
#include <stdio.h>
#include <limits.h> // 用于INT_MAX 和 INT_MIN

void find_max_min(int values[], int count, int *max, int *min) {
    *max = INT_MIN;
    *min = INT_MAX;
    for (int i = 0; i < count; ++i) {
        if (values[i] > *max) *max = values[i];
        if (values[i] < *min) *min = values[i];
    }
}

int main() {
    int numbers[] = {1, 2, 3, 4, 5};
    int size = sizeof(numbers) / sizeof(numbers[0]);
    int max, min;
    find_max_min(numbers, size, &max, &min);
    printf("Max: %d, Min: %d\n", max, min);
    return 0;
}
  1. 一阶低通滤波器的工作原理是允许信号中的低频成分通过,而衰减高于特定频率的高频成分。它在嵌入式应用中常用于平滑传感器读数,去除不必要的噪音。其实现方式通常是递归或非递归的数字滤波器算法。
#define ALPHA 0.1 // 滤波系数,决定了滤波器的截止频率

float low_pass_filter(float new_value, float old_filtered_value) {
    return (ALPHA * new_value) + ((1 - ALPHA) * old_filtered_value);
}

// 注意:这段代码假定你已经有了初始的old_filtered_value。

三、编程题(每题15分,共30分)

  1. 初始化数组并计算平均值:
#include <stdio.h>

int main() {
    int numbers[] = {1, 2, 3, 4, 5};
    int size = sizeof(numbers) / sizeof(numbers[0]);
    float sum = 0;

    for (int i = 0; i < size; ++i) {
        sum += numbers[i];
    }

    float mean = sum / size;
    printf("Average: %f\n", mean);
    return 0;
}
  1. 获取用户输入,动态分配数组,找到最大值和最小值:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int main() {
    int count;
    printf("Enter the number of integers you want to input: ");
    scanf("%d", &count);

    int *numbers = (int *)malloc(count * sizeof(int));
    if (numbers == NULL) {
        fprintf(stderr, "Memory allocation failed.\n");
        return 1;
    }

    printf("Enter %d integers:\n", count);
    for (int i = 0; i < count; ++i) {
        scanf("%d", &numbers[i]);
    }

    int max = INT_MIN, min = INT_MAX;
    for (int i = 0; i < count; ++i) {
        if (numbers[i] > max) max = numbers[i];
        if (numbers[i] < min) min = numbers[i];
    }

    printf("Max: %d, Min: %d\n", max, min);
    free(numbers); // 不要忘记释放动态分配的内存
    return 0;
}

这张试卷涵盖了基础数学概念、算法设计、嵌入式系统开发的知识以及C语言编程技能,旨在测试考生对这些领域的理解和实际编程能力。

知识点讲解

用户界面设计

在嵌入式系统中,用户界面(UI)的设计对于提升用户体验至关重要。良好的UI不仅能让设备更加直观易用,还能提高用户的满意度和操作效率。以下是关于如何使用LCD/OLED屏幕显示信息以及设计按键、触摸屏等人机交互界面的详细讲解。

1. 使用LCD/OLED屏幕显示信息

知识点讲解:

  • 选择合适的屏幕类型:根据应用需求选择LCD或OLED屏幕。OLED具有更高的对比度和更薄的设计,而LCD可能成本更低且适合户外使用。
  • 图形库的支持:为了简化开发过程,通常会使用专门的图形库来处理屏幕上的文本和图形绘制。例如,在Arduino平台上,可以使用LiquidCrystal库来控制字符型LCD显示屏,或者使用如Adafruit_GFX和特定屏幕驱动库(如Adafruit_SSD1306)来操作OLED显示器。

代码及注释:

#include <Wire.h>
#include <Adafruit_GFX.h>    // 图形库基础类
#include <Adafruit_SSD1306.h> // SSD1306 OLED显示屏专用库

#define SCREEN_WIDTH 128      // 屏幕宽度
#define SCREEN_HEIGHT 64      // 屏幕高度

// 创建一个SSD1306对象
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

void setup() {
  // 初始化I2C总线
  Wire.begin();
  
  // 初始化OLED屏幕
  if(!display.begin(SSD1306_I2C_ADDRESS, SSD1306_RESET)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // 如果初始化失败,则停止程序执行
  }
  display.clearDisplay(); // 清除屏幕内容
  
  // 设置字体大小、颜色和光标位置
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0,0);
  
  // 打印初始信息到屏幕上
  display.println("Hello, World!");
  display.display(); // 更新屏幕显示
}

void loop() {
  // 主循环可以添加更多显示逻辑
}

知识点补充:

  • display.clearDisplay():清除屏幕上的所有内容,准备新的绘图。
  • display.setTextSize():设置文本大小,默认为1倍。
  • display.setTextColor():设置文本颜色,可以是白色、黑色等。
  • display.setCursor():设定下一个字符将被打印的位置。
  • display.println():向屏幕输出一行文本,并自动换行。
  • display.display():刷新屏幕以显示最新绘制的内容。
2. 设计按键、触摸屏等人机交互界面

知识点讲解:

  • 物理按键:可以直接连接到微控制器的数字输入引脚,并通过编程检测其状态变化。按键通常用于简单的导航或确认操作。
  • 触摸屏:需要更复杂的接口,比如电阻式或电容式触摸屏,它们通常通过I2C或SPI与MCU通信。对于触摸屏,还需要额外的驱动程序来解析触摸事件。
  • 响应速度和实时性:确保所有输入设备的中断服务程序快速响应,不影响系统的实时性能;同时保持UI更新及时准确。
  • 用户体验优化:考虑用户习惯,设计直观的布局和交互方式,减少误操作的可能性。

代码及注释:

#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_STMPE610.h> // STMPE610触摸控制器专用库

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
Adafruit_STMPE610 ts = Adafruit_STMPE610(&Wire);

const int BUTTON_PIN = 2; // 定义按键连接的引脚
const int TOUCH_THRESHOLD = 100; // 触摸灵敏度阈值

void setup() {
  // 初始化显示和触摸屏
  if(!display.begin(SSD1306_I2C_ADDRESS, SSD1306_RESET)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  display.clearDisplay();

  pinMode(BUTTON_PIN, INPUT_PULLUP); // 按键配置为上拉输入
}

void loop() {
  // 检测按钮按下
  if (digitalRead(BUTTON_PIN) == LOW) { // 当按键被按下时
    // 执行相应动作,例如切换页面或触发某个功能
    delay(200); // 防抖动延时
  }

  // 获取触摸点坐标
  TS_Point p = ts.getPoint();
  if (p.z > TOUCH_THRESHOLD) { // 检查是否真的触碰了屏幕
    // 根据触摸位置执行不同操作,例如:
    // 点击区域判断、菜单选择等
  }
}

知识点补充:

  • pinMode(BUTTON_PIN, INPUT_PULLUP):设置按键引脚为输入模式,并启用内部上拉电阻。
  • digitalRead(BUTTON_PIN):读取按键的状态,LOW表示按键被按下。
  • delay(200):防抖动延迟,避免由于机械按键的弹跳导致多次触发。
  • TS_Point p = ts.getPoint():从触摸屏获取触摸点的信息,包括X、Y坐标和压力值。
  • if (p.z > TOUCH_THRESHOLD):检查触摸的压力值是否超过了预设的阈值,以确定是否为有效触摸。

通过上述内容,我们了解了如何在嵌入式系统中实现基本的用户界面功能,包括显示信息和人机交互。这些知识和技术可以帮助开发者创建出既实用又友好的HMI,从而显著提升产品的整体性能和用户体验。如果有任何疑问或者需要进一步的帮助,请随时告诉我!

试卷

一、选择题(每题2分,共10分)

  1. 在嵌入式系统中,哪种屏幕类型通常具有更高的对比度和更薄的设计?

    • A. LCD
    • B. OLED
    • C. CRT
    • D. LED
  2. 使用Adafruit_SSD1306库控制OLED显示屏时,以下哪个函数用于清除屏幕内容?

    • A. display.clear()
    • B. display.clearDisplay()
    • C. display.erase()
    • D. display.reset()
  3. 触摸屏的灵敏度可以通过调整哪个参数来改变?

    • A. TOUCH_THRESHOLD
    • B. SCREEN_WIDTH
    • C. SCREEN_HEIGHT
    • D. BUTTON_PIN
  4. 对于按键输入,Arduino中的INPUT_PULLUP模式的作用是什么?

    • A. 内部拉低电阻
    • B. 内部上拉电阻
    • C. 外部中断触发
    • D. 数字引脚输出高电平
  5. 下列哪一项不是触摸屏接口常见的通信协议?

    • A. I2C
    • B. SPI
    • C. UART
    • D. USB

二、简答题(每题10分,共30分)

  1. 描述如何在嵌入式系统中使用LCD/OLED屏幕显示信息,并说明可能需要的图形库支持。

  2. 解释如何设计按键、触摸屏等人机交互界面以增强用户体验,并讨论如何集成到嵌入式系统中。

  3. 说明在设计用户界面时应考虑哪些因素来优化用户体验。


三、编程题(每题15分,共30分)

  1. 编写一段C语言代码,初始化一个OLED屏幕并打印“Hello, World!”。确保代码包括必要的库导入、屏幕初始化、文本设置以及更新显示。

  2. 编写一段C语言代码,检测一个物理按键的状态并在按键按下时通过OLED屏幕显示一条消息。同时,确保代码能够处理按键抖动问题。


四、设计题(每题15分,共30分)

  1. 设计一个简单的菜单系统,该系统使用四个按键进行导航(上、下、确认、返回)。要求在OLED屏幕上显示当前选中的菜单项,并在按下确认键时执行相应的操作。

  2. 设计一个基于触摸屏的用户界面,允许用户从几个预设选项中选择一个。界面应该包含一个主屏幕和至少两个子屏幕。每个屏幕都应该有返回主屏幕的按钮。

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

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

相关文章

React中createRoot函数原理解读——Element对象与Fiber对象、FiberRootNode与HostRootNode

【2024最新版】React18 核心源码分析教程&#xff08;全61集&#xff09; Element对象与Fiber对象 在 React 中&#xff0c;Element 对象 和 Fiber 对象 是核心概念&#xff0c;用于实现 React 的高效渲染和更新机制。以下是它们的详细解读&#xff1a; 1. Element 对象 定…

急速了解什么是GPU服务器

GPU服务器是一种专门配置了高性能图形处理器&#xff08;GPU&#xff09;的服务器&#xff0c;旨在提供高性能计算、深度学习、科学计算等多种场景的计算服务。与传统的CPU服务器相比&#xff0c;GPU服务器在处理并行密集型计算任务时具有显著优势。本文将详细介绍GPU服务器的定…

一.MySQL程序简介

整体介绍 1.服务端mysqld(可执行文件) mysqld --verbose --help 2.客户端mysql(可执行文件) 3.其它工具包程序

腾讯云AI代码助手编程挑战赛-凯撒密码解码编码器

作品简介 在CTFer选手比赛做crypto的题目时&#xff0c;一些题目需要自己去解密&#xff0c;但是解密的工具大部分在线上&#xff0c;而在比赛过程中大部分又是无网环境&#xff0c;所以根据要求做了这个工具 技术架构 python语言的tk库来完成的GUI页面设计&#xff0c;通过…

深度学习第三弹:python入门与线性表示代码

一、python入门 1.熟悉基础数据结构——整型数据&#xff0c;浮点型数据&#xff0c;列表&#xff0c;字典&#xff0c;字符串&#xff1b;了解列表及字典的切片&#xff0c;插入&#xff0c;删除操作。 list1 [1, 2, 3, 4, 5] for each in list1:print(each) print(list1[1…

常见的端口号大全,2025年整理

端口号是网络通信的基础&#xff0c;它定义了不同服务的入口和出口。了解服务端口号不仅有助于网络配置&#xff0c;还能提升问题排查效率。在实际应用中&#xff0c;熟悉常见端口号可以帮助你快速定位网络故障、优化服务性能&#xff0c;并确保网络安全。 一、常见的网络服务…

Android adb shell GPU信息

Android adb shell GPU信息 先 adb shell 进入控制台。 然后&#xff1a; dumpsys | grep GLES Android adb shell命令捕获systemtrace_android 抓trace-CSDN博客文章浏览阅读2.5k次&#xff0c;点赞2次&#xff0c;收藏8次。本文介绍了如何使用adbshell命令配合perfetto工…

【LeetCode】力扣刷题热题100道(21-25题)附源码 接雨水 合并区间 字母异位词 滑动窗口 覆盖子串(C++)

目录 1.接雨水 2.合井区间 3.找到字符串中所有字母异位词 4.滑动窗口最大值 5.最小覆盖子串 1.接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 代码如下所示&#xff1a; class Solution {…

01-51单片机LED与独立按键

一、单片机概述 注意&#xff1a;个人学习笔记&#xff0c;里面涉及到的C语言和进程转换相关的知识在C语言部分已经写了&#xff0c;这里是默认都会的状态学习单片机。 1.什么是单片机 单片机&#xff0c;英文Micro Controller Unit&#xff0c;简称MCU。其内部集成了CPU、R…

Linux内核编程(二十一)USB应用及驱动开发

一、基础知识 1. USB接口是什么&#xff1f; USB接口&#xff08;Universal Serial Bus&#xff09;是一种通用串行总线&#xff0c;广泛使用的接口标准&#xff0c;主要用于连接计算机与外围设备&#xff08;如键盘、鼠标、打印机、存储设备等&#xff09;之间的数据传输和电…

ModelScope创空间使用

文章目录 前言 一、ModelScope是什么&#xff1f; 二、使用步骤 1.注册ModelScope 2.新建创空间 3.创空间基本说明 4.部署创空间 5.访问创空间 三、其他补充说明 总结 前言 随着AI大模型的应用越来越广泛&#xff0c;模型应用部署的需求也越来越多&#xff0c;包括h…

记1(监督学习+一元线性回归

目录 1、基础概念2、一元线性回归 1、基础概念 机器学习&#xff08;Machine Learning&#xff09;&#xff1a;通过学习算法从数据中学习模型的过程 例如从“房价y~面积x”的关系中学习&#xff1a; 建立模型&#xff1a;ywxb 学习模型&#xff1a;确定w&#xff0c;b&#x…

服务器双网卡NCCL通过交换机通信

1、NCCL变量设置 export CUDA_DEVICE_MAX_CONNECTIONS1 export NCCL_SOCKET_IFNAMEeno2 export NCCL_IB_DISABLE0 #export NCCL_NETIB export NCCL_IB_HCAmlx5_0,mlx5_1 export NCCL_IB_GID_INDEX3 export NCCL_DEBUGINFOGPUS_PER_NODE4MASTER_ADDR192.168.1.2 MASTER_PORT600…

PySide6 Qt for Python Qt Quick参考网址

Qt QML BOOK&#xff1a; 《Qt for Python》 -Building an Application https://www.qt.io/product/qt6/qml-book/ch19-python-build-app#signals-and-slots Qt for Python&#xff1a;与C版本的差异即BUG处理&#xff08;常见的DLL文件确实的问题等&#xff09; Qt for Pyt…

NineData云原生智能数据管理平台新功能发布|2024年12月版

本月发布 7 项更新&#xff0c;其中重点发布 2 项、功能优化 5 项。 重点发布 数据库 Devops - Oracle 非表对象支持可视化创建与管理 Oracle 非表对象&#xff0c;包括视图&#xff08;View&#xff09;、包&#xff08;Package&#xff09;、存储过程&#xff08;Procedur…

【Elasticsearch7.11】postman批量导入少量数据

JSON 文件内的数据格式&#xff0c;json文件数据条数不要过多&#xff0c;会请求参数过大&#xff0c;最好控制再10000以内。 {"index":{"_id":"baec07466732902d22a24ba01ff09751"}} {"uuid":"baec07466732902d22a24ba01ff0975…

用Kimi做研究:准实验设计的智能解决方案

目录 1.研究策略设计 2.过程框架设计 3.背景变量 4.细节设计 准实验设计是一种介于实验与观察研究之间的研究方法&#xff0c;准实验设计是在无法完全控制实验条件的情况下进行因果关系的探索。与传统实验设计相比&#xff0c;准实验设计不具备随机分配实验对象到各处理组的…

零基础入门Erlang

1.Erlang介绍 Index - Erlang/OTP Erlang是一种通用的面向并发的编程语言 Erlang是一个结构化&#xff0c;动态类型编程语言&#xff0c;内建并行计算支持 使用Erlang来编写分布式应用要简单的多&#xff0c;因为它的分布式机制是透明的 1.1 为什么选择Erlang 需要处理大量…

JavaWeb开发(九)JSP技术

1. JavaWeb JSP技术 1.1. JSP简介 1.1.1. 什么是JSP JSP全名为Java Server Page 是为了简化servlet的工作而出现的替代品。在JSP中java代码与HTML共同存在&#xff0c;其中HTML代码用于展示静态的内容&#xff0c;java代码用来展示动态的内容。 1.1.2. 为什么出现JSP技术 19…

鸿蒙UI开发——Toast即时提示框的使用

1、概 述 Toast提示又称即时反馈&#xff0c;是一种临时性的消息提示框&#xff0c;用于向用户显示简短的操作反馈或状态信息。它通常在屏幕的底部或顶部短暂弹出&#xff0c;随后在一段时间后自动消失。即时反馈的主要目的是提供简洁、不打扰的信息反馈&#xff0c;避免干扰用…