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

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

目录

上一张试卷

知识点讲解

用户界面设计

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_MINvoid 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.mzph.cn/bicheng/67737.shtml

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

相关文章

Ubuntu Bash工具

Ubuntu Bash工具 &#x1f4bb;⚡ Ubuntu Bash 工具&#x1f528; 指令列表1. &#x1f50b; 查看电池信息 (-b)2. &#x1f4bb; 查看 CPU 和内存使用情况 (-m)3. &#x1f504; 旋转屏幕 (-r)4. &#x1f513; 解锁屏幕 (-s)5. &#x1f310; 设置代理 (-p <proxy_url>…

【GoLang】两个字符串如何比较大小?以及字典顺序的比较规则

在 Go 语言中&#xff0c;字符串的比较是基于字典顺序进行的。 字典顺序的比较规则&#xff1a; 比较两个字符串从左到右逐个字符的Unicode码点值&#xff0c; 若比较结果不相等则将此结果作为字符串大小的结果&#xff0c; 若比较结果相等则比较下一位&#xff0c; 若其中一个…

《机器学习》——贝叶斯算法

贝叶斯简介 贝叶斯公式&#xff0c;又称贝叶斯定理、贝叶斯法则&#xff0c;最初是用来描述两个事件的条件概率间的关系的公式&#xff0c;后来被人们发现具有很深刻的实际意义和应用价值。该公式的实际内涵是&#xff0c;支持某项属性的事件发生得愈多&#xff0c;则该属性成…

matlab离线安装硬件支持包

MATLAB 硬件支持包离线安装 本文章提供matlab硬件支持包离线安装教程&#xff0c;因为我的matlab安装的某种原因&#xff08;破解&#xff09;&#xff0c;不支持硬件支持包的安装&#xff0c;相信也有很多相同情况的朋友&#xff0c;所以记录一下我是如何离线安装的&#xff…

Infineon PSoC 4 CapSense ModusToolbox IDE - 系统生态篇

本文档说明了 ModusToolbox 软体环境的 4 个层面&#xff0c;该环境为 CapSense 设备和生态系统提供支援。本文是 Infineon PSoC 4 CapSense ModusToolbox IDE-系统介绍的延伸篇 (Infineon PSoC 4 CapSense ModusToolbox IDE -系统介绍篇 - 大大通(简体站))。 什么是ModusToolb…

使用PVE快速创建虚拟机集群并搭建docker环境

安装Linux系统 这里以安装龙蜥操作系统AnolisOS8.9为例加以说明。 通过PVE后台上传操作系统ISO镜像。 然后在PVE上【创建虚拟机】&#xff0c;选定上传的龙蜥操作系统镜像进行系统安装。 注意&#xff1a;在安装过程中&#xff0c;要设定语言、时区、超管用户root的密码、普…

ElasticSearch内存占用率过高怎么办?

文章目录 1&#xff0c;先用top看看各个进程的内存占用情况2&#xff0c;不能简单的杀死进程&#xff0c;然后再重启。3&#xff0c;查看一下ElasticSearch进程的具体启动情况4&#xff0c;修改Elasticsearch 的Java堆内存 1&#xff0c;先用top看看各个进程的内存占用情况 先…

OpenHarmony AVScreenCaptureRecorder录屏开发指导

一、简介 OpenHarmony 5.0新增了AVScreenCaptureRecorder ArkTs API。用户可以调用录屏AVScreenCaptureRecorder API录制屏幕&#xff0c;采集音频源数据&#xff0c;获取封装后的音视频文件&#xff0c;然后通过文件的形式流转到其他模块进行播放或处理&#xff0c;用于以文件…

【Spring】构造方法注入 属性加final

在Spring框架中&#xff0c;构造方法注入是一种常见的依赖注入方式。通过构造方法注入&#xff0c;Spring容器会在创建Bean时自动调用相应的构造方法&#xff0c;并将所需的依赖作为参数传入。关于构造方法注入时属性是否加final关键字&#xff0c;主要有以下几点区别&#xff…

一.MySQL程序简介

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

G1垃圾回收器的FullGC

如何确定GarbageFirst回收器发生的是FullGC ? 必须出现FullGC字样才算是FUllGC&#xff0c;例如下图&#xff1a;因为内存分配失败&#xff08;Allocation Failure&#xff09;导致 如果不出现FullGC的字样说明它不是FUllGC&#xff0c;并不像Serial GC、ParallelGC的在老年代…

Sql 创建用户

Sql server 创建用户 Sql server 创建用户SQL MI 创建用户修改其他用户密码 Sql server 创建用户 在对应的数据库执行&#xff0c;该用户得到该库的所有权限 test.database.chinacloudapi.cn DB–01 DB–02 创建服务器登录用户 CREATE LOGIN test WITH PASSWORD zDgXI7rsafkak…

腾讯云AI代码助手编程挑战赛-武器大师

作品简介 对话过程能够介绍二战 各种武器 冷战 武器 现代的 各种武器装备&#xff0c;陆海空三军都知道。 技术架构 使用全后端分离的架构&#xff0c;前端使用Vue脚手架&#xff0c;腾讯云修改样式css 开发环境、开发流程 系统&#xff1a;win11 开发工具&#xff1a;VS…

Maven核心插件之maven-resources-plugin

前言 Maven 插件是 Maven 构建系统的重要组成部分&#xff0c;它们为 Maven 提供了丰富的功能和扩展能力&#xff0c;使得 Maven 不仅是一个构建工具&#xff0c;更是一个强大的项目管理平台。在 Maven 项目中&#xff0c;插件的使用通常通过配置 pom.xml 文件来完成。每个插件…

Golang的文件加密技术研究与应用

Golang的文件加密技术研究与应用 一、加密技术概述 文件加密的重要性 文件加密是指通过对文件进行加密操作&#xff0c;将文件内容转化为一段难以理解的数据。这样可以保护文件的隐私和安全&#xff0c;防止文件被未授权的用户访问和窃取。在日常工作和生活中&#xff0c;我们经…

Redis之秒杀活动

目录 全局唯一ID&#xff1a; 为什么 count 不可能为 null&#xff1f; 为什么返回值是 timestamp << COUNT_BITS | count&#xff1f; 整体的逻辑 (1) 生成时间戳 (2) 生成序列号 (3) 拼接时间戳和序列号 超卖问题&#xff1a; 基于版本号的乐观锁 CAS思想 …

VSCode 在Windows下开发时使用Cmake Tools时输出Log乱码以及CPP文件乱码的终极解决方案

在Windows11上使用VSCode开发C程序的时候&#xff0c;由于使用到了Cmake Tools插件&#xff0c;在编译运行的时候&#xff0c;会出现输出日志乱码的情况&#xff0c;那么如何解决呢&#xff1f; 这里提供了解决方案&#xff1a; 当Settings里的Cmake: Output Log Encoding里设…

【C++经典例题】求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a; 期待您的关注 题目描述&#xff1a; 原题链接&#xff1a; 求123...n_牛客题霸_牛客网 (nowcoder.com) 解题思路&#xff1a; …

STM32 单片机 练习项目 LED灯闪烁LED流水灯蜂鸣器 未完待续

个人学习笔记 文件路径&#xff1a;程序源码\STM32Project-DAP&DAPmini\1-1 接线图 3-1LED闪烁图片 新建项目 新建项目文件 选择F103C8芯片 关闭弹出窗口 拷贝资料 在项目内新建3个文件夹 Start、Library、User Start文件拷贝 从资料中拷贝文件 文件路径&#xff1a;固…

DAY15 神经网络的参数和变量

DAY15 神经网络的参数和变量 一、参数和变量 在神经网络中&#xff0c;参数和变量是两个关键概念&#xff0c;它们分别指代不同类型的数据和设置。 参数&#xff08;Parameters&#xff09; 定义&#xff1a;参数是指在训练过程中学习到的模型内部变量&#xff0c;这些变量…