基于PIC16C54的串行鼠标控制器设计与实现

📅 2026/7/1 11:44:13
基于PIC16C54的串行鼠标控制器设计与实现
1. 项目概述从“古董”芯片到实用控制器最近在整理工作室的旧物时翻出了一批老旧的PIC16C54单片机。这枚芯片在今天看来性能平平但在上世纪90年代它可是8位微控制器领域的明星产品以其低成本、高可靠性和精简的指令集广泛应用于消费电子和工业控制。看着这些芯片一个想法冒了出来能否用它们来实现一个经典的串行鼠标控制器这不仅仅是为了“废物利用”更是一次对底层硬件通信协议的深度探索。在USB和无线技术一统天下的今天重新审视RS-232串行鼠标这种“古老”的交互设备能让我们更深刻地理解从物理层编码到主机协议栈的完整数据链路这对于嵌入式开发人员理解现代HID人机接口设备协议的精髓有着不可替代的启蒙价值。这个项目就是基于PIC16C54设计并实现一个完整的串行鼠标控制器。它需要完成从光学或机械编码器信号采集、数据打包到按照微软串行鼠标协议Microsoft Serial Mouse Protocol通过RS-232接口与PC通信的全过程。最终的目标是制作出一个即插即用、无需额外驱动的标准串行鼠标它能在任何支持该协议的旧式PC或现代PC通过USB转串口适配器上正常工作。这个过程涉及微控制器编程、定时器精准控制、串行通信协议解析以及低功耗设计等多个核心环节是一个综合性极强的嵌入式系统实战案例。2. 核心设计思路与方案选型2.1 为何选择PIC16C54在开始设计前首先要回答一个问题为什么是PIC16C54市面上有那么多性能更强、外设更丰富的现代MCU。选择它主要基于以下几点考量教学与复古价值PIC16C54的架构非常经典和简洁。它采用RISC指令集仅33条指令易于学习和理解。通过它来实现一个相对复杂的协议栈能迫使开发者深入思考每一个字节和每一位的用途而不是依赖现成的库函数。这对于夯实嵌入式基础至关重要。资源恰好够用一个串行鼠标的功能其实非常纯粹采样两个方向的位移X, Y和两个按键状态左键、右键然后以固定的波特率通常是1200bps发送数据包。PIC16C54拥有512x12位的程序存储器、25字节的RAM、12个I/O引脚和一个简单的定时器。经过精心设计这些资源足以完成任务。RAM用于存储位移累积值和状态标志I/O口用于连接编码器和串行输出定时器用于产生精确的波特率时钟和采样间隔。低成本与高可靠性对于个人项目或小批量制作成本是重要因素。PIC16C54及其开发环境成本极低。同时其OTP一次性可编程或窗口式CERDIP封装版本在稳定性上历经时间考验。挑战性与成就感用有限的资源实现一个标准化的、能与庞大PC生态系统交互的设备其挑战带来的成就感是使用现代MCU所无法比拟的。2.2 系统整体架构设计整个控制器的架构可以划分为三个层次信号输入层、核心处理层和通信输出层。信号输入层负责与鼠标的机械结构交互。对于滚球机械鼠标通常使用两个正交编码器分别对应X轴和Y轴来检测滚球的转动。每个编码器输出两路相位差90度的方波信号A相和B相。通过检测这两路信号的边沿和相位关系可以判断移动的方向和距离。对于早期的光电鼠标则是通过检测光栅盘的脉冲。本设计以更通用的机械编码器为例。PIC16C54的I/O口需要配置为输入并启用引脚变化中断以实时捕获编码器的脉冲。核心处理层是PIC16C54内部固件实现的核心。它需要完成以下任务位移计数与方向判断在中断服务程序中根据A、B两相的当前状态和历史状态判断此次跳变是正转位移1还是反转位移-1。这里需要实现一个四状态00, 01, 11, 10的格雷码解码状态机这是确保计数准确、消除抖动的关键。按键状态采样周期性如每10ms扫描连接鼠标左键和右键的I/O引脚状态。数据包组装按照微软串行鼠标协议将累积的X位移、Y位移、按键状态组合成一个3字节或4字节的数据包。协议规定数据包以特定的起始位和停止位封装。定时与调度利用内部定时器产生两个关键时基一是用于周期性如每秒40-60次报告数据包的“报告定时器”二是用于产生精确的RS-232发送波特率1200bps的“波特率发生器”。通信输出层负责将组装好的数据包通过RS-232电平发送给PC。PIC16C54没有硬件UART因此必须使用软件模拟即“位碰撞”Bit Banging。这需要将一个I/O口配置为输出并严格按照1200bps的时序每位约833微秒逐位发送起始位、8个数据位、停止位。虽然精度要求不如高速通信苛刻但稳定的时序是通信成功的基石。注意微软串行鼠标协议是一个相对简单的协议数据包格式固定。但不同操作系统和应用程序对其兼容性有细微差别。最通用的方式是采用“标准3字节模式”这也是我们设计的重点。3. 硬件电路设计与关键器件解析3.1 主控与最小系统电路PIC16C54采用5V供电典型工作电流在2-5mA。最小系统电路包括电源7805线性稳压器将外部7-12V输入降至稳定的5V并搭配100μF电解电容和0.1μF陶瓷电容进行滤波。时钟为了获得稳定的定时我们选择4MHz的陶瓷谐振器连接在OSC1和OSC2引脚。4MHz时钟经内部4分频后指令周期为1μs便于进行精确的微秒级延时计算。复位采用简单的RC复位电路10kΩ电阻上拉至VDD0.1μF电容接地到VSS并在MCLR引脚增加一个手动复位按钮。I/O分配这是设计的核心。我们需要提前规划好每个引脚的用途RA0,RA1: 连接X轴编码器的A相、B相。RA2,RA3: 连接Y轴编码器的A相、B相。RA4(开漏输出): 可作为按键状态输入或备用。RB0,RB1: 连接鼠标左键和右键常态高电平按下时接地。RB2: 作为软件UART的TX数据输出引脚连接至RS-232电平转换芯片的输入。RB3-RB7: 可用于状态指示LED、配置跳线或预留。3.2 编码器接口与按键电路编码器通常有5根线VCC, GND, A相, B相, C相中间按键通常不用。我们将A、B相分别通过一个上拉电阻如10kΩ接至VCC然后直接连接到PIC的RA0-RA3。PIC的I/O口内部有弱上拉功能但为了信号稳定外部上拉电阻仍是好习惯。编码器在转动时A、B相会产生方波。按键电路更为简单。鼠标微动开关一端接地另一端通过一个上拉电阻如4.7kΩ接至VCC中间点连接到PIC的RB0或RB1。当按键未按下时PIC读到高电平按下时读到低电平。3.3 RS-232电平转换电路PC的串口使用RS-232电平逻辑“1”为-3V至-15V逻辑“0”为3V至15V与PIC的TTL电平0V/5V不兼容。因此必须使用电平转换芯片。最经典、成本最低的方案是使用MAX232或其兼容芯片如SP3232。它内部包含电荷泵仅需外接5个0.1μF或1μF的电容即可将5V转换为±10V左右的RS-232电平。电路连接非常简单PIC的RB2软件TX连接至MAX232的T1IN引脚MAX232的T1OUT引脚连接至DB-9母头的第3脚TXD。DB-9的第5脚GND接系统地线。注意串行鼠标协议中鼠标是作为数据终端设备DTE因此它使用TXD线向PC数据通信设备DCE发送数据。有些资料会混淆务必确认。3.4 电源与抗干扰设计鼠标线通常较长容易引入干扰。在电源入口处除了稳压滤波建议增加一个磁珠或小电感如10μH来抑制高频噪声。在PIC的每个电源引脚附近都必须放置一个0.1μF的陶瓷电容以提供快速的局部电荷补偿这是保证单片机稳定运行、防止程序跑飞的关键。对于编码器信号线如果环境干扰严重可以在信号线与地之间并联一个几十皮法的小电容以滤除毛刺。但电容值不宜过大否则会削弱正常脉冲的边沿。4. 固件设计与核心代码实现4.1 开发环境与工具链对于PIC16C54我们使用Microchip现为Microchip Technology官方的MPLAB X IDE配合其汇编器MPASM。虽然也可以用C语言如HI-TECH PICC但对于这种资源极度受限、需要精确控制时序的项目汇编语言是更优的选择。它能让我们完全掌控每条指令的周期和内存的使用。首先在MPLAB X中新建一个汇编项目选择正确的器件型号PIC16C54。项目的主要文件将是一个.asm汇编源文件。4.2 初始化与变量定义程序从复位向量开始。首先进行关键的初始化操作LIST PPIC16C54 #INCLUDE P16C5X.INC ; 变量定义在通用寄存器区域 (0x0C 开始) CBLOCK 0x0C X_COUNT_L ; X轴位移低字节有符号 X_COUNT_H ; X轴位移高字节符号扩展 Y_COUNT_L ; Y轴位移低字节有符号 Y_COUNT_H ; Y轴位移高字节符号扩展 BUTTONS ; 按键状态字节 REPORT_FLAG ; 报告定时器标志 TEMP ; 临时变量 TX_BUFFER ; 发送字节缓冲区 BIT_COUNT ; 发送位计数器 ENDC ORG 0x000 ; 复位向量 GOTO MAIN ORG 0x004 ; 中断向量PIC16C54只有定时器溢出可能中断 GOTO ISR MAIN: ; 1. 设置I/O方向 MOVLW b11110011 ; RA0,RA1,RA2,RA3输入(编码器) RA4输出 RB0,RB1输入(按键) RB2输出(TX) TRIS PORTA MOVLW b11111011 ; RB2输出其他输入 TRIS PORTB ; 2. 关闭比较器如果存在 MOVLW 0x07 OPTION ; 将W寄存器的值写入OPTION寄存器关闭T0CK内部上拉设置预分频器给TMR0 ; 3. 初始化变量 CLRF X_COUNT_L CLRF X_COUNT_H CLRF Y_COUNT_L CLRF Y_COUNT_H CLRF BUTTONS CLRF REPORT_FLAG ; 4. 配置定时器TMR0 ; 假设4MHz晶振指令周期1us。 ; 我们希望报告率约为50Hz即20ms一次。 ; 将TMR0预分频设为1:256则TMR0每256us溢出一次。 ; 需要溢出约78次 (20ms / 256us ≈ 78) 产生一次报告。 ; 我们在中断中用一个计数器实现。 MOVLW b11010111 ; 内部时钟源预分频器分配给TMR0比例1:256 OPTION CLRF TMR0 ; 5. 开启TMR0溢出中断 MOVLW b10100000 ; 开启全局中断和TMR0中断 MOVWF INTCON ; 主循环开始 MAIN_LOOP: ; 检查报告标志 BTFSS REPORT_FLAG, 0 GOTO MAIN_LOOP ; 清除报告标志 BCF REPORT_FLAG, 0 ; 调用数据打包和发送函数 CALL PACK_AND_SEND GOTO MAIN_LOOP4.3 编码器解码与位移计数这是项目的核心算法。我们需要为X轴和Y轴分别维护一个状态机。以X轴为例; 假设上次读取的X轴状态保存在变量 X_LAST_STATE 中仅用低2位 ; 当前状态从PORTA的RA0和RA1读取 READ_X_ENCODER: MOVF PORTA, W ANDLW b00000011 ; 只取RA0, RA1 MOVWF TEMP ; TEMP 当前状态 (AB) ; 计算状态变化 (旧状态 2) | 新状态形成一个4位的索引 SWAPF X_LAST_STATE, W ANDLW b11000000 ; 将旧状态移到高2位 IORWF TEMP, W ; W (旧状态高2位) | (新状态低2位) ANDLW b00001111 ; 确保只有低4位有效 ; 使用查表法判断方向 CALL ENCODER_LOOKUP ; 根据W中的4位索引返回-1, 0, 1 ; 假设查表结果在W中0表示无变化1表示12表示-1或其他约定 ADDWF X_COUNT_L, F ; 加到X位移低字节 BTFSC STATUS, C ; 检查低字节加法是否进位 INCF X_COUNT_H, F ; 有进位高字节加1 ; 还需要处理借位当方向为负时这里省略细节... ; 更新旧状态 MOVF TEMP, W MOVWF X_LAST_STATE RETURN ENCODER_LOOKUP: ADDWF PCL, F ; 程序计数器加索引实现查表跳转 RETLW 0 ; 索引0: 00-00 (无变化) RETLW 0 ; 索引1: 00-01 (正转?) RETLW 0 ; 索引2: 00-10 (反转?) RETLW 0 ; 索引3: 00-11 (非法) RETLW 0 ; 索引4: 01-00 (反转?) RETLW 0 ; 索引5: 01-01 (无变化) RETLW 1 ; 索引6: 01-11 (正转) **关键点** RETLW 0 ; 索引7: 01-10 (非法) ; ... 继续填充完整的16项查找表 ; 正确的表项需要根据编码器相位关系A领先B为正转来定义。实操心得编码器解码的稳定性取决于两个因素消抖和状态机正确性。机械编码器在触点闭合/断开时会产生抖动即短时间内产生多个边沿。我们的状态机是边沿触发必须在硬件并联小电容或软件在检测到变化后延时几毫秒再采样上做消抖处理。查表法是最可靠的方式预先计算出所有16种状态转移对应的位移1, -1, 0可以避免复杂的条件判断提高代码效率和可靠性。4.4 微软串行鼠标协议与数据打包微软串行鼠标协议采用7个数据位、1个停止位、无奇偶校验、1200bps。每个数据包包含3个或4个字节我们实现标准的3字节模式字节1:1LBRBY7Y6X7X6最高位固定为1作为同步位。LB,RB: 左键和右键状态1表示按下。Y7,Y6,X7,X6: Y和X位移的最高两位符号扩展位。字节2:0X5X4X3X2X1X0最高位固定为0。X5-X0: X位移的低6位补码形式范围-32到31。超过此范围的位移需要分多个包发送。字节3:0Y5Y4Y3Y2Y1Y0最高位固定为0。Y5-Y0: Y位移的低6位。数据打包函数PACK_AND_SEND的任务就是将X_COUNT、Y_COUNT和BUTTONS变量按照上述格式组装成3个字节然后调用发送函数依次发出。发送前需要将位移计数器清零。PACK_AND_SEND: ; 1. 组装字节1 MOVF BUTTONS, W ; 假设BUTTONS的bit0左键bit1右键 ANDLW b00000011 ; 只取低两位 MOVWF TX_BUFFER RRF TX_BUFFER, F ; 循环右移为放入数据包做准备 RRF TX_BUFFER, F ; 现在TX_BUFFER低2位是按键 ; 接下来需要将X_COUNT_H和Y_COUNT_H的符号位最高位取出放到正确位置 ; ... (具体位操作略) BSF TX_BUFFER, 7 ; 设置字节1的最高位为1 CALL SEND_BYTE ; 发送字节1 ; 2. 组装字节2 (X位移低6位) MOVF X_COUNT_L, W ANDLW b00111111 ; 取低6位 BCF STATUS, C ; 确保最高位为0 CALL SEND_BYTE ; 发送字节2 ; 3. 组装字节3 (Y位移低6位) MOVF Y_COUNT_L, W ANDLW b00111111 ; 取低6位 BCF STATUS, C ; 确保最高位为0 CALL SEND_BYTE ; 发送字节3 ; 4. 清空位移计数器准备下一次累积 CLRF X_COUNT_L CLRF X_COUNT_H CLRF Y_COUNT_L CLRF Y_COUNT_H RETURN4.5 软件UART位碰撞发送实现由于没有硬件UART我们必须用代码模拟。1200bps意味着每位持续时间为1/1200 ≈ 833.33微秒。在4MHz时钟指令周期1μs下我们可以用循环延时来产生这个时序。; 发送一个字节数据在W寄存器低7位最高位会被忽略因为我们控制它为0 SEND_BYTE: MOVWF TX_BUFFER MOVLW 8 ; 发送8位数据实际协议是7位但加上起始停止位共10位我们按8位处理方便计算 MOVWF BIT_COUNT ; 发送起始位 (逻辑0) BCF PORTB, 2 ; 将TX引脚拉低 CALL DELAY_833US ; 延时1位时间 SEND_LOOP: RRF TX_BUFFER, F ; 将最低位移入进位位C BTFSC STATUS, C ; 判断C是0还是1 GOTO SEND_ONE SEND_ZERO: BCF PORTB, 2 ; 发送0 GOTO SEND_NEXT SEND_ONE: BSF PORTB, 2 ; 发送1 SEND_NEXT: CALL DELAY_833US ; 延时1位时间 DECFSZ BIT_COUNT, F ; 位计数器减1为0则跳过 GOTO SEND_LOOP ; 发送停止位 (逻辑1) BSF PORTB, 2 CALL DELAY_833US ; 延时1位时间 ; 可以再加一个位时间的空闲时间确保停止位完整 CALL DELAY_833US RETURN ; 精确的833.33微秒延时子程序 ; 4MHz下1个指令周期1us。需要精确计算循环次数。 DELAY_833US: MOVLW D208 ; 需要调整这个常数来校准延时 MOVWF TEMP_DLY DELAY_LOOP: NOP ; 1 cycle DECFSZ TEMP_DLY, F ; 1 cycle (2 if skipping) GOTO DELAY_LOOP ; 2 cycles RETURN ; 2 cycles ; 总周期数 3 (208 * (112)) - 1 2 ≈ 833 cycles注意事项软件UART的时序精度完全依赖于延时循环的准确性。在编写DELAY_833US时必须精确计算每条指令的周期数。在MPLAB X的模拟器Simulator中可以单步执行并观察周期计数器反复调整MOVLW的常数直到延时接近833.33微秒。此外在发送过程中必须禁止所有中断否则中断服务程序会打断延时导致波特率严重失准。可以在SEND_BYTE函数的开头用BCF INTCON, GIE关闭全局中断发送完毕后再用BSF INTCON, GIE开启。4.6 定时器中断与系统调度定时器TMR0的中断服务程序ISR负责两件事一是累积时间产生周期性的报告标志二是周期性扫描按键状态。ISR: ; 检查中断源是否为TMR0溢出 BTFSS INTCON, T0IF GOTO ISR_END ; 不是TMR0中断退出PIC16C54中断源少通常就是它 ; 清除TMR0溢出标志 BCF INTCON, T0IF ; 重装TMR0初值以产生更精确的溢出周期如果需要 ; MOVLW D‘100’ ; MOVWF TMR0 ; 报告定时器递减 DECFSZ REPORT_COUNTER, F ; REPORT_COUNTER是一个预置为78的变量 GOTO CHECK_BUTTONS ; 计数器减到0设置报告标志 MOVLW D‘78’ MOVWF REPORT_COUNTER ; 重装计数器 BSF REPORT_FLAG, 0 ; 置位报告标志 CHECK_BUTTONS: ; 每隔几次中断例如4次约1ms扫描一次按键实现软件消抖 DECFSZ BUTTON_COUNTER, F GOTO ISR_END MOVLW D‘4’ MOVWF BUTTON_COUNTER ; 读取按键状态进行消抖判断例如连续读到3次相同状态才确认 ; ... (按键消抖逻辑略) ISR_END: RETFIE5. 调试、测试与性能优化5.1 硬件调试与信号测量焊接完成后不要急于编程。先进行基础硬件测试上电测试测量5V和3.3V如果有电源是否稳定纹波是否在可接受范围50mV。时钟测试用示波器测量OSC1或OSC2引脚确认是否有稳定的4MHz正弦波或方波。编码器信号手动转动编码器用示波器或逻辑分析仪观察连接到PIC的A、B相信号确认是相位差90度的方波且没有过多的抖动。RS-232输出将MAX232的T1OUT引脚连接到PC串口的RXD第2脚或通过USB转串口工具接入电脑。用示波器测量该引脚在单片机发送数据时应能看到-10V到10V之间的电平跳变。5.2 软件调试与逻辑分析软件调试是难点。由于PIC16C54没有在线调试功能我们主要依靠软件模拟器Simulator在MPLAB X Simulator中单步执行代码观察寄存器、变量的变化特别是编码器状态机、位移计数器和数据打包逻辑。可以设置PORTA的输入激励来模拟编码器转动。“LED调试法”利用空闲的I/O口连接LED。在代码关键位置如进入中断、发送数据包开始/结束点亮或熄灭LED通过观察LED的闪烁情况来判断程序流程。逻辑分析仪这是最强大的工具。将逻辑分析仪的探头连接到PIC的TX引脚RB2和编码器A、B相。可以同时捕获脉冲信号和串行数据直观地看到位移变化如何触发数据包发送以及数据包的内容是否符合协议。通过解码功能可以直接将串行数据流翻译成字节极大提升调试效率。5.3 通信协议验证与PC端测试制作完成后需要在真实的PC环境中测试。连接将鼠标的DB-9插头插入PC的COM口或通过USB转串口适配器连接。终端软件打开如Tera Term、PuTTY或SecureCRT等串口终端软件。设置端口为对应的COM口波特率1200数据位7停止位1无奇偶校验无流控。观察数据移动或点击鼠标在终端软件中应该看到一串连续的十六进制数据流。根据协议解析前几个字节应该能对应上你的操作例如向右移动应看到X位移为正值的包。操作系统识别在Windows的“设备管理器”中当你插入鼠标并移动时可能会检测到“串行鼠标”或“PS/2兼容鼠标”如果系统自动进行了协议转换。在较老的Windows系统或Linux中可能需要配置鼠标协议为“Microsoft Serial Mouse”。5.4 常见问题与排查技巧实录在实现过程中你几乎一定会遇到以下问题。这里是我的排查记录问题1PC完全检测不到鼠标。排查检查物理连接确认DB-9接头是公头还是母头线序是否正确鼠标TXD接PC RXD。使用万用表通断档检查电缆。检查电平用示波器测MAX232的T1OUT引脚。静止时应为负电压-5V至-12V逻辑1。发送数据时应有正负跳变。如果一直是正电压或0V可能是MAX232损坏或电容连接错误。检查数据用逻辑分析仪抓取TX引脚数据。确认是否有数据发出波特率是否是准确的1200bps位宽833μs起始位低电平和停止位高电平是否正确检查协议确认数据包格式完全符合微软协议。特别是字节1的最高位必须是1字节2和3的最高位必须是0。很多兼容性问题都出在这里。问题2鼠标指针移动不顺畅、跳跃或反向。排查编码器解码错误这是最常见原因。用逻辑分析仪同时抓取编码器A、B相和内部位移计数器。手动缓慢转动编码器一格观察计数器是1、-1还是跳变了多个值。检查状态机查表是否正确特别是正转和反转的索引。消抖不足快速晃动鼠标指针乱跳。需要在编码器中断服务程序中加入简单的延时消抖或者采用“两次采样一致才确认”的算法。位移溢出我们的位移计数器是8位或16位有符号数。如果一次报告间隔内位移超过31或-32就需要在单个数据包中发送这个极值并将剩余位移累积到下一个包。如果处理不当会导致移动加速或丢失。确保PACK_AND_SEND函数正确处理了位移范围。报告率不稳定如果定时器中断被其他操作如过长的发送延时阻塞会导致报告间隔不均匀指针移动卡顿。确保中断服务程序尽可能短发送字节函数中关闭中断的时间也不能过长。问题3按键单击变成双击或无效。排查按键消抖机械微动开关抖动可达数毫秒。必须实现软件消抖。我的方法是每隔1ms扫描一次按键当连续扫描到3次相同的按下状态才认为按键有效按下释放同理。将消抖后的稳定状态存入BUTTONS变量。接线错误确认按键按下时PIC读到的是低电平。检查上拉电阻是否接好。问题4功耗偏高。优化 PIC16C54有睡眠模式。在鼠标静止一段时间后可以停止定时器让单片机进入SLEEP模式。当有任何编码器变化或按键按下时通过引脚变化中断唤醒单片机。这能显著降低整体功耗。在初始化时开启RA端口的引脚变化中断并在主循环中无任务时执行SLEEP指令。6. 项目总结与扩展思考经过从电路设计、PCB绘制、焊接、到汇编编程、调试测试的全过程一个基于PIC16C54的串行鼠标控制器终于能稳定可靠地工作了。这个过程让我对几个关键点有了更深的体会一是资源受限下的系统设计必须精打细算每一个字节的RAM和每一条指令的周期二是底层协议的重要性亲手实现一遍微软鼠标协议比读十遍协议文档理解得更透彻三是调试技巧的积累在没有高级调试工具时LED和逻辑分析仪就是最好的朋友。这个项目本身已经完成但它可以作为一个起点进行更多有趣的扩展协议扩展实现更复杂的“3键滚轮”的Mouse Systems协议或Logitech扩展协议。性能提升尝试将报告率从50Hz提升到100Hz甚至更高让指针移动更跟手。这需要对代码进行深度优化甚至考虑使用更快的时钟。无线化将PIC16C54与一个简单的ASK/OOK射频发射模块如PT2262/2272结合制作一个2.4GHz或433MHz的无线串行鼠标接收器探索更早期的无线输入设备原理。教学工具将这个项目做成一个完整的开发板配上详细的教程成为嵌入式入门和计算机外设原理的绝佳教具。最后关于工具链虽然MPLAB X和汇编器是官方选择但对于初学者也可以尝试使用开源的gpasm汇编器和gputils工具链在Linux或Windows命令行环境下进行开发配合一款廉价的PIC编程器如PICKit 3克隆版整个开发成本可以压得非常低。技术的乐趣往往就藏在这些亲手将想法变为现实的过程之中。