一、项目概述
本项目基于Microchip EV41C56A开发板(PIC32CM5164LS00048单片机),利用板载触摸按键实现一个简易电报模拟器。
- 通过识别短按与长按,分别产生摩斯码的“点”(·)和“横”(-)。
- 在按键释放后自动将输入的摩斯序列解码为英文字母(A-Z)。
- 将字母通过串口输出。
- 板载LED实时指示触摸状态(按下亮、松开灭)。
二、硬件介绍

项目中使用的硬件及其作用如下表所示:
硬件模块 | 型号/位置 | 作用 |
|---|---|---|
主控MCU | PIC32CM5164LS00048(ARM Cortex-M23) | 运行主程序、处理触摸检测、解码摩斯码、控制串口通信 |
触摸按键 | PA22引脚,板载自容式触摸传感器 | 检测用户手指触摸,产生触摸状态信号 |
用户LED | PA15引脚,黄色LED | 实时指示触摸状态(按下点亮,松开熄灭) |
USB转串口 | 板载nEDBG(CDC虚拟串口) | 通过USB将解码后的字母发送至PC串口终端显示 |
片上外设 | PTC(外设触摸控制器)、SysTick定时器、SERCOM3(USART) | 触摸数据采集、系统时间基准、串口数据发送 |
三、方案框图
下图展示了系统的整体结构:

系统运行流程:用户触摸按键 → PTC采集原始信号 → 触摸库滤波、去抖后输出触摸状态 → 主程序根据按下/释放时间差判定短按/长按,记录摩斯符号 → 释放后超时触发解码 → 通过串口输出字母,同时LED实时跟随触摸状态亮灭。
四、项目设计思路
- 触摸检测:利用Microchip的Touch Library,配置单通道自容式触摸(
DEF_SENSOR_TYPE = NODE_SELFCAP),由PTC外设自动完成测量,库函数返回稳定可靠的触摸标志。 - 时间基准:为实现精确的长短按判断(阈值250ms)和释放超时(800ms),启用Cortex-M23内核的SysTick定时器,配置为1ms中断,累加全局毫秒计数器
g_sys_ms。 - 摩斯码解码:预定义A-Z的摩斯码表(0=点,1=横,0xFF结束)。用户输入的序列存储在
current_seq数组中,释放超时后与码表逐字母比对,匹配则输出对应字母,否则输出“?”。 - 实时LED反馈:在主循环的每一次触摸测量完成后,直接根据
touched标志更新LED状态,实现按压即亮、松开即灭的无延迟响应。 - 串口输出:利用MCC配置的SERCOM3_USART驱动,将解码后的字母以
<字母>\r\n格式发送到虚拟串口,方便在PC上查看。
五、调试软件介绍
- MPLAB X IDE:集成开发环境,用于代码编写、编译、下载、调试。
- MCC(MPLAB Code Configurator):图形化外设配置工具,用于配置时钟、PTC、SERCOM3、SysTick、GPIO引脚等,并自动生成底层驱动代码。
- Touch Library:提供触摸算法库,包含滤波、校准、防抖等功能,简化触摸应用开发。
- 点线面串口调试助手:用于接收并显示解码后的字母。
六、软件流程图
主程序软件流程如下图所示:

七、关键代码介绍
- SysTick中断服务函数:提供毫秒级时间基准。
volatile uint32_t g_sys_ms = 0;
void SysTick_Handler(void) { g_sys_ms++; }
static inline uint32_t get_ms(void) { return g_sys_ms; }
- 长短按判定与符号记录:在释放事件中计算按下时长。
if (last_touch && !touched) { // 释放事件
uint32_t duration = now - press_start_ms;
if (duration < SHORT_PRESS_MS)
add_symbol(0); // 点
else
add_symbol(1); // 横
release_ms = now;
wait_timeout = true;
}
- 摩斯码解码函数:与预定义码表比对。
static char decode_sequence(void) {
for (int i = 0; i < 26; i++) {
uint8_t j = 0;
while (morse_code[i][j] != 0xFF && j < seq_len &&
morse_code[i][j] == current_seq[j]) j++;
if (morse_code[i][j] == 0xFF && j == seq_len)
return 'A' + i;
}
return '?';
}
- 实时LED控制:每次触摸状态更新时立即设置。
if (touched) LED_ON(); else LED_OFF();
八、MCC代码生成操作解析

1.生成UART工程代码,使用SERCOM3

2.配置SysTick定时器

3.配置模拟输入按键


4.配置引脚

九、功能展示图及说明
1.初始状态:


开发板上电,串口助手显示“Telegraph Ready (LED on while touched)”。LED熄灭。
2.按键触摸状态
短按示例:手指快速点击触摸按键(<250ms)后松开。LED在按下期间亮起,松开立即熄灭。串口无立即输出,但内部记录一个“点”(.)。
长按示例:手指按住触摸按键(>250ms)后松开。LED在按下期间亮起,松开立即熄灭。串口无立即输出,内部记录一个“横”(-)。

3.字母解读和串口输出状态

依次输入短按(.)、短按(.)、短按(.)、短按(.)并松开。等待约800ms后,内部解读并通过串口字母“A”。
依次输入短按(.)并松开。等待约800ms后,内部解读并通过串口字母“E”。
依次输入短按(.)、长按(-)、短按(.)、短按(.)并松开。等待约800ms后,内部解读并通过串口字母“L”。
依次输入短按(.)、长按(-)、短按(.)、短按(.)并松开。等待约800ms后,内部解读并通过串口字母“L”。
依次输入长按(-)、长按(-)、长按(-)并松开。等待约800ms后,内部解读并通过串口字母“O”。
无效序列:若输入无法匹配任何字母(例如“.-.-”),则输出“?”。
十、心得体会
通过本次项目,我深入学习了基于Microchip ARM Cortex-M23平台的触摸应用开发流程,掌握了以下关键点:
- 触摸库的使用:QTouch Modular Library提供了完整的触摸采集、滤波、校准、防抖功能,开发者无需关注底层PTC寄存器操作,只需调用初始化、处理和状态读取函数即可快速实现稳定的触摸检测。
- 定时器与状态机设计:利用SysTick提供1ms精度的时间基准,配合简单的状态机(等待、按下、释放、超时),能够可靠地识别长短按和字符间隔,代码逻辑清晰且易于扩展。
- 硬件与软件协同:LED实时反馈极大提升了交互体验,让用户明确感知触摸是否被识别。通过串口输出调试信息,可以快速验证解码正确性。
- 问题调试能力:在解决编译错误、编码问题、阈值调整等过程中,我学会了分析编译输出、查阅库文档、以及根据实际手感优化参数。特别是中断优先级的配置(SysTick优先级低于PTC),保证了触摸数据的实时性和准确性。
- 模块化编程思想:将摩斯码表、时间基准、串口输出等封装为独立函数,主循环逻辑简洁,便于维护和迁移。