Funpack5-2 基于Microchip EV41C56A触摸按键的电报模拟器设计
该项目使用了Microchip EV41C56A触摸按键,实现了电报模拟器的设计,它的主要功能为:通过触摸按键按下的时间,进行解码,并通过串口输出。
标签
Funpack活动
Microchip
触摸
PIC32CM5164LS00048
电报
CX反C
更新2026-06-17
23

一、项目概述

本项目基于Microchip EV41C56A开发板(PIC32CM5164LS00048单片机),利用板载触摸按键实现一个简易电报模拟器。

  • 通过识别短按与长按,分别产生摩斯码的“点”(·)和“横”(-)。
  • 在按键释放后自动将输入的摩斯序列解码为英文字母(A-Z)。
  • 将字母通过串口输出。
  • 板载LED实时指示触摸状态(按下亮、松开灭)。

二、硬件介绍

项目中使用的硬件及其作用如下表所示:

硬件模块

型号/位置

作用

主控MCU

PIC32CM5164LS00048(ARM Cortex-M23)

运行主程序、处理触摸检测、解码摩斯码、控制串口通信

触摸按键

PA22引脚,板载自容式触摸传感器

检测用户手指触摸,产生触摸状态信号

用户LED

PA15引脚,黄色LED

实时指示触摸状态(按下点亮,松开熄灭)

USB转串口

板载nEDBG(CDC虚拟串口)

通过USB将解码后的字母发送至PC串口终端显示

片上外设

PTC(外设触摸控制器)、SysTick定时器、SERCOM3(USART)

触摸数据采集、系统时间基准、串口数据发送

三、方案框图

下图展示了系统的整体结构:

deepseek_mermaid_20260614_ee8d5b.png

系统运行流程:用户触摸按键 → PTC采集原始信号 → 触摸库滤波、去抖后输出触摸状态 → 主程序根据按下/释放时间差判定短按/长按,记录摩斯符号 → 释放后超时触发解码 → 通过串口输出字母,同时LED实时跟随触摸状态亮灭。

四、项目设计思路

  1. 触摸检测:利用Microchip的Touch Library,配置单通道自容式触摸(DEF_SENSOR_TYPE = NODE_SELFCAP),由PTC外设自动完成测量,库函数返回稳定可靠的触摸标志。
  2. 时间基准:为实现精确的长短按判断(阈值250ms)和释放超时(800ms),启用Cortex-M23内核的SysTick定时器,配置为1ms中断,累加全局毫秒计数器g_sys_ms
  3. 摩斯码解码:预定义A-Z的摩斯码表(0=点,1=横,0xFF结束)。用户输入的序列存储在current_seq数组中,释放超时后与码表逐字母比对,匹配则输出对应字母,否则输出“?”。
  4. 实时LED反馈:在主循环的每一次触摸测量完成后,直接根据touched标志更新LED状态,实现按压即亮、松开即灭的无延迟响应。
  5. 串口输出:利用MCC配置的SERCOM3_USART驱动,将解码后的字母以<字母>\r\n格式发送到虚拟串口,方便在PC上查看。

五、调试软件介绍

  • MPLAB X IDE:集成开发环境,用于代码编写、编译、下载、调试。
  • MCC(MPLAB Code Configurator):图形化外设配置工具,用于配置时钟、PTC、SERCOM3、SysTick、GPIO引脚等,并自动生成底层驱动代码。
  • Touch Library:提供触摸算法库,包含滤波、校准、防抖等功能,简化触摸应用开发。
  • 点线面串口调试助手:用于接收并显示解码后的字母。


六、软件流程图

主程序软件流程如下图所示:

deepseek_mermaid_20260614_196774.png

七、关键代码介绍

  1. 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; }
  1. 长短按判定与符号记录:在释放事件中计算按下时长。
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;
}
  1. 摩斯码解码函数:与预定义码表比对。
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 '?';
}
  1. 实时LED控制:每次触摸状态更新时立即设置。
if (touched) LED_ON(); else LED_OFF();

八、MCC代码生成操作解析

image.png

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

image.png

2.配置SysTick定时器

image.png

3.配置模拟输入按键

image.png

image.png

4.配置引脚

image.png

九、功能展示图及说明

1.初始状态

image.png

image.png

开发板上电,串口助手显示“Telegraph Ready (LED on while touched)”。LED熄灭。

2.按键触摸状态

短按示例:手指快速点击触摸按键(<250ms)后松开。LED在按下期间亮起,松开立即熄灭。串口无立即输出,但内部记录一个“点”(.)。

长按示例:手指按住触摸按键(>250ms)后松开。LED在按下期间亮起,松开立即熄灭。串口无立即输出,内部记录一个“横”(-)。

image.png

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

image.png

依次输入短按(.)、短按(.)、短按(.)、短按(.)并松开。等待约800ms后,内部解读并通过串口字母“A”。

依次输入短按(.)并松开。等待约800ms后,内部解读并通过串口字母“E”。

依次输入短按(.)、长按(-)短按(.)、短按(.)并松开。等待约800ms后,内部解读并通过串口字母“L”。

依次输入短按(.)、长按(-)短按(.)、短按(.)并松开。等待约800ms后,内部解读并通过串口字母“L”。

依次输入长按(-)长按(-)长按(-)并松开。等待约800ms后,内部解读并通过串口字母“O”。

无效序列:若输入无法匹配任何字母(例如“.-.-”),则输出“?”。

十、心得体会

通过本次项目,我深入学习了基于Microchip ARM Cortex-M23平台的触摸应用开发流程,掌握了以下关键点:

  1. 触摸库的使用:QTouch Modular Library提供了完整的触摸采集、滤波、校准、防抖功能,开发者无需关注底层PTC寄存器操作,只需调用初始化、处理和状态读取函数即可快速实现稳定的触摸检测。
  2. 定时器与状态机设计:利用SysTick提供1ms精度的时间基准,配合简单的状态机(等待、按下、释放、超时),能够可靠地识别长短按和字符间隔,代码逻辑清晰且易于扩展。
  3. 硬件与软件协同:LED实时反馈极大提升了交互体验,让用户明确感知触摸是否被识别。通过串口输出调试信息,可以快速验证解码正确性。
  4. 问题调试能力:在解决编译错误、编码问题、阈值调整等过程中,我学会了分析编译输出、查阅库文档、以及根据实际手感优化参数。特别是中断优先级的配置(SysTick优先级低于PTC),保证了触摸数据的实时性和准确性。
  5. 模块化编程思想:将摩斯码表、时间基准、串口输出等封装为独立函数,主循环逻辑简洁,便于维护和迁移。
附件下载
Hello.zip
源代码
团队介绍
一个热爱嵌入式的爱好者
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号