一、任务
设计并制作一个基于 32×32 点阵 LED 模块的书写显示屏,其系统结构如图 1 所示。在控制器的管理下,LED 点阵模块显示屏工作在人眼不易觉察的扫描微亮和人眼可见的显示点亮模式下;当光笔触及 LED 点阵模块表面时,先由光笔检测触及位置处 LED 点的扫描微亮以获取其行列坐标,再依据功能需求决定该坐标处的 LED 是否点亮至人眼可见的显示状态(如图 1 中光笔接触处的深色 LED 点已被点亮),从而在屏上实现“点亮、划亮、反显、整屏擦除、笔画擦除、连写多字、对象拖移”等书写显示功能。
二、要求
1.基本要求
(1)在“点亮”功能下,当光笔接触屏上某点 LED 时,能即时点亮该点 LED,并在控制器上同步显示该点 LED 的行列坐标值(左上角定为行列坐标原点)。
(2)在“划亮”功能下,当光笔在屏上快速划过时,能同步点亮划过的各点 LED,其速度要求 2s 内能划过并点亮 40 点 LED。
(3)在“反显”功能下,能对屏上显示的信息实现反相显示(即:字体笔画处不亮,无笔画处高亮)。
(4)在“整屏擦除”功能下,能实现对屏上所显示信息的整屏擦除。
2.发挥部分
(1)在“笔画擦除”功能下,能用光笔擦除屏上所显汉字的笔画。
(2)在“连写多字”功能下,能结合自选的擦除方式,在 30s 内在屏上以“划亮”方式逐个写出四个汉字(总笔画数不大于 30)且存入机内,写完后再将所存四字在屏上逐个轮流显示。
(3)在“对象拖移”功能下,能用光笔将选定显示内容在屏上进行拖移。先用光笔以“划亮”方式在屏上圈定欲拖移显示对象,再用光笔将该对象拖移到屏上另一位置。
(4)当环境光强改变时,能自动连续调节屏上显示亮度。
(5)当光笔连续未接触屏面的时间超过 1~5min 时(此时间可由控制器设定),能自动关闭屏上显示,并使整个系统进入休眠状态,此时系统工作电流应不大于5mA。
(6)其他。
三、说明
1.设计制作时所用 LED 点阵模块的发光颜色不限。
2.各种功能的切换方式自定,但应力求操作简便。
3.在各种功能的实际操作过程中,必要时可用按键或其他控制方式进行辅助。例如,“连写多字”时,写完一字后用自定义控制方式存入该字并清屏,然后再写下一字。
4.系统应采用 5V 单电源供电。
5.设计制作时应在电路板上留有系统耗电参数的测试点。
6.设计报告正文中应包括系统总体框图、核心电路原理图、主要流程图、主要的测试结果。完整的电路原理图、重要的源程序和完整的测试结果用附件给出。
GPT-4o给出的设计方案:
设计一个基于32×32点阵LED的书写显示屏系统,主要包括控制器、32×32 LED点阵屏和光笔。系统可以通过光笔触摸屏幕上的LED来书写和画图,控制器管理显示效果和相关功能。
系统通过光笔的触碰检测确定发光点所在位置,并点亮对应的LED。用户可以通过拖动光笔在屏幕上进行绘图和书写,控制器可以将图像数据转换成LED矩阵上的显示。考虑到系统的稳定性、响应速度和功耗,设计时需重点考虑电源管理和信号处理。
LED矩阵驱动电路:
光笔检测电路:
控制器电路:
74HC595移位寄存器:
ULN2803达林顿阵列:
STM32系列MCU:
以下是STM32进行LED矩阵控制和光笔位置检测的C代码示例:
#include "stm32f1xx.h"
#define ROWS 32
#define COLS 32
// 初始化函数
void System_Init(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_SPI1_Init();
}
// LED矩阵显示函数
void LED_Display(uint8_t matrix[][COLS]) {
for (int row = 0; row < ROWS; row++) {
for (int col = 0; col < COLS; col++) {
// 仅举例,具体逻辑依实现而定
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); // 选通信号
// 通过SPI发送寄存器数据
HAL_SPI_Transmit(&hspi1, &matrix[row][col], 1, HAL_MAX_DELAY);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
}
}
}
// 光笔位置检测函数
void Pen_Detect(void) {
// 假设通过ADC检测光敏电阻值,取光笔位置
HAL_ADC_Start(&hadc1);
if (HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY) == HAL_OK) {
uint32_t pinValue = HAL_ADC_GetValue(&hadc1);
// 处理PIN的取值,根据实际情况实现
}
}
int main(void) {
System_Init();
uint8_t ledMatrix[ROWS][COLS] = {0};
while (1) {
Pen_Detect();
LED_Display(ledMatrix);
HAL_Delay(100); // 适当的延迟,根据实际情况调整
}
}
void SystemClock_Config(void) {
// 系统时钟配置
}
void MX_GPIO_Init(void) {
// GPIO初始化函数
}
void MX_SPI1_Init(void) {
// SPI初始化函数
}
void MX_ADC1_Init(void) {
// ADC初始化函数
}
本题考察的主要知识点