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

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

目录

上一张试卷

知识点讲解

用户界面设计

[1. 使用LCD/OLED屏幕显示信息](#1. 使用LCD/OLED屏幕显示信息)

[2. 设计按键、触摸屏等人机交互界面](#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. 设计一个基于触摸屏的用户界面,允许用户从几个预设选项中选择一个。界面应该包含一个主屏幕和至少两个子屏幕。每个屏幕都应该有返回主屏幕的按钮。

相关推荐
lucy1530275107918 分钟前
刷式直流电机驱动芯片,适用于打印机、电器、工业设备以及其他小型机器中——GC8870
人工智能·stm32·单片机·嵌入式硬件·机器人
皮皮黄-机电工程师1 小时前
单片机控制步进电机 A4988 Proteus仿真
单片机·proteus·步进电机·a4988
誓约酱1 小时前
Linux下字符设备驱动编写(RK3568)
linux·运维·服务器·c语言·c++·嵌入式硬件·物联网
一只搬砖的猹1 小时前
项目实战——使用python脚本完成指定OTA或者其他功能的自动化断电上电测试
linux·单片机·嵌入式硬件·python自动化·rtos·嵌入式软件·ota
一口一口吃成大V1 小时前
FPGA随记——时钟时序一些基本知识
单片机·嵌入式硬件
菜哥万岁万岁万万岁3 小时前
STM32 USB组合设备 MSC CDC
stm32·单片机·嵌入式硬件
wenchm3 小时前
细说STM32F407单片机以DMA方式读写外部SRAM的方法
stm32·单片机·嵌入式硬件
电气_空空3 小时前
基于单片机的无人值守输液监控系统软件设计
单片机·嵌入式硬件·毕业设计·毕设
半个番茄3 小时前
STM32: 输入捕获基本结构
stm32·单片机
2301_805962933 小时前
NRF24L01模块STM32调试心得-调试顺序
stm32·单片机·嵌入式硬件