




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 基于单片机技术的基于单片机技术的 PCPC 无线鼠标附录无线鼠标附录 摘要 摘要 本文所描述的无线鼠标由发射和接收两部分组成 通过红外无线鼠标的各控 制键 左右上下移动键 左右键 向下及向上翻页键 进行红外编码 然后通过 38KHz 红外载波以原码和重发码得形式连续对外发送 以防止数据在传送过程中出 现错误 在接收部分通过红外接收头校正放大之后 51 单片机芯片解码 然后通过 PDIUSBD12 芯片 把控制指令转化成计算机 USB 口能够接收的信号然后通过 USB 向 计算机发送无线遥控鼠标的各个控制功能指令 最终达到红外无线鼠标的功能 关键词关键词 红外线 PDIUSBD12 单片机 PDIUSBDI2 的中断服务程序的中断服务程序 中断服务程序代码处理由 PDIUSBD12 产生的中断 它将数据从 PDIUSBD12 的内 FIFO 取回到 CPU 存储器 并建立正确的事件标志 以通知相应的子程序进行处理 下面为中断服务程序 if D12GetIntPin 0 如果有中断发生 D12WriteCommand READ INTERRUPT REGISTER 写读中断寄存器的命令 InterruptSource D12ReadByte 读回第一字节的中断寄存器 if InterruptSource 总线挂起中断处理 if InterruptSource 总线复位中断处理 if InterruptSource 端点 0 输出中断处理 if InterruptSource 端点 0 输入中断处理 if InterruptSource 端点 1 输出中断处理 if InterruptSource 端点 1 输入中断处理 if InterruptSource 端点 2 输出中断处理 if InterruptSource 端点 2 输入中断处理 下面是各个子函数的程序 函数功能 USB 断开连接函数 入口参数 无 返 回 无 备 注 无 void UsbDisconnect void ifdef DEBUG0 Prints 断开 USB 连接 r n endif D12WriteCommand D12 SET MODE 写设置模式命令 D12WriteByte 0 x06 设置模式的第一字节 2 D12WriteByte 0 x47 设置模式的第二字节 DelayXms 1000 延迟 1 秒 End of function 函数功能 USB 连接函数 入口参数 无 返 回 无 备 注 无 void UsbConnect void ifdef DEBUG0 Prints 连接 USB r n endif D12WriteCommand D12 SET MODE 写设置模式命令 D12WriteByte 0 x16 设置模式的第一字节 D12WriteByte 0 x47 设置模式的第二字节 End of function 函数功能 总线挂起中断处理函数 入口参数 无 返 回 无 备 注 无 void UsbBusSuspend void ifdef DEBUG0 Prints USB 总线挂起 r n endif End of function 函数功能 总线复位中断处理函数 入口参数 无 返 回 无 备 注 无 void UsbBusReset void 3 ifdef DEBUG0 Prints USB 总线复位 r n endif Ep1InIsBusy 0 复位后端点 1 输入缓冲区空闲 End of function 函数功能 根据 pData 和 SendLength 将数据发送到端点 0 的函数 入口参数 无 返 回 无 备 注 无 void UsbEp0SendData void 将数据写到端点中去准备发送 写之前要先判断一下需要发送的数据是否比端点 0 最大长度大 如果超过端点大小 则一次只能发送 最大包长的数据 端点 0 的最大包长在 DeviceDescriptor 7 if SendLength DeviceDescriptor 7 按最大包长度发送 D12WriteEndpointBuffer 1 DeviceDescriptor 7 pSendData 发送后剩余字节数减少最大包长 SendLength DeviceDescriptor 7 发送一次后指针位置要调整 pSendData DeviceDescriptor 7 else if SendLength 0 不够最大包长 可以直接发送 D12WriteEndpointBuffer 1 SendLength pSendData 发送完毕后 SendLength 长度变为 0 SendLength 0 else 如果要发送的数据包长度为 0 if NeedZeroPacket 1 如果需要发送 0 长度数据 D12WriteEndpointBuffer 1 0 pSendData 发送 0 长度数据包 NeedZeroPacket 0 清需要发送 0 长度数据包标志 4 End of function 函数功能 端点 0 输出中断处理函数 入口参数 无 返 回 无 备 注 无 void UsbEp0Out void ifdef DEBUG0 Prints USB 端点 0 输出中断 r n endif 读取端点 0 输出最后传输状态 该操作清除中断标志 并判断第 5 位是否为 1 如果是 则说明是建立包 if D12ReadEndpointLastStatus 0 读建立过程数据 D12AcknowledgeSetup 应答建立包 D12ClearBuffer 清缓冲区 将缓冲数据填到设备请求的各字段中 bmRequestType Buffer 0 bRequest Buffer 1 wValue Buffer 2 uint16 Buffer 3 8 wIndex Buffer 4 uint16 Buffer 5 8 wLength Buffer 6 uint16 Buffer 7 5 endif USB 协议定义了几个标准输入请求 我们实现这些标准请求即可 请求的代码在 bRequest 中 对不同的请求代码进行散转 事实上 我们还需要对接收者进行散转 因为不同的请求接收者 5 是不一样的 接收者在 bmRequestType 的 D4 D0 位中定义 我们这里为了简化操作 有些就省略了对接收者的判断 例如获取描述符的请求 只根据描述符的类型来区别 switch bRequest case GET CONFIGURATION 获取配置 ifdef DEBUG0 Prints 获取配置 r n endif break case GET DESCRIPTOR 获取描述符 ifdef DEBUG0 Prints 获取描述符 endif 对描述符类型进行散转 对于全速设备 标准请求只支持发送到设备的设备 配置 字符串三种描述符 switch wValue 8 endif pSendData DeviceDescriptor 需要发送的数据 判断请求的字节数是否比实际需要发送的字节数多 这里请求的是设备描述符 因此数据长度就是 DeviceDescriptor 0 如果请求的比实际的长 那么只返回实际长度的数据 if wLength DeviceDescriptor 0 SendLength DeviceDescriptor 0 if SendLength DeviceDescriptor 7 0 并且刚好是整数个数 据包时 NeedZeroPacket 1 需要返回 0 长度的数据包 else SendLength wLength 将数据通过 EP0 返回 UsbEp0SendData break 6 case CONFIGURATION DESCRIPTOR 配置描述符 ifdef DEBUG0 Prints 配置描述符 r n endif pSendData ConfigurationDescriptor 需要发送的数据为配置描 述符 判断请求的字节数是否比实际需要发送的字节数多 这里请求的是配置描述符集合 因此数据长度就是 ConfigurationDescriptor 3 256 ConfigurationDescriptor 2 如果请求的比实际的长 那么只返回实际长度的数据 SendLength ConfigurationDescriptor 3 SendLength SendLength 256 ConfigurationDescriptor 2 if wLength SendLength if SendLength DeviceDescriptor 7 0 并且刚好是整数个数 据包时 NeedZeroPacket 1 需要返回 0 长度的数据包 else SendLength wLength 将数据通过 EP0 返回 UsbEp0SendData break case STRING DESCRIPTOR 字符串描述符 ifdef DEBUG0 Prints 字符串描述符 endif switch wValue endif pSendData LanguageId SendLength LanguageId 0 break 7 case 1 厂商字符串的索引值为 1 所以这里为厂商字符串 ifdef DEBUG0 Prints 厂商描述 r n endif pSendData ManufacturerStringDescriptor SendLength ManufacturerStringDescriptor 0 break case 2 产品字符串的索引值为 2 所以这里为产品字符串 ifdef DEBUG0 Prints 产品描述 r n endif pSendData ProductStringDescriptor SendLength ProductStringDescriptor 0 break case 3 产品序列号的索引值为 3 所以这里为序列号 ifdef DEBUG0 Prints 产品序列号 r n endif pSendData SerialNumberStringDescriptor SendLength SerialNumberStringDescriptor 0 break default ifdef DEBUG0 Prints 未知的索引值 r n endif 对于未知索引值的请求 返回一个 0 长度的包 SendLength 0 NeedZeroPacket 1 break 判断请求的字节数是否比实际需要发送的字节数多 如果请求的比实际的长 那么只返回实际长度的数据 if wLength SendLength if SendLength DeviceDescriptor 7 0 并且刚好是整数个数 据包时 NeedZeroPacket 1 需要返回 0 长度的数据包 else 8 SendLength wLength 将数据通过 EP0 返回 UsbEp0SendData break case REPORT DESCRIPTOR 报告描述符 ifdef DEBUG0 Prints 报告描述符 r n endif pSendData ReportDescriptor 需要发送的数据为报告描述符 SendLength sizeof ReportDescriptor 需要返回的数据长度 判断请求的字节数是否比实际需要发送的字节数多 如果请求的比实际的长 那么只返回实际长度的数据 if wLength SendLength if SendLength DeviceDescriptor 7 0 并且刚好是整数个数 据包时 NeedZeroPacket 1 需要返回 0 长度的数据包 else SendLength wLength 将数据通过 EP0 返回 UsbEp0SendData break default 其它描述符 ifdef DEBUG0 Prints 其他描述符 描述符代码 PrintHex wValue 8 Prints r n endif break break case GET INTERFACE 获取接口 ifdef DEBUG0 Prints 获取接口 r n 9 endif break case GET STATUS 获取状态 ifdef DEBUG0 Prints 获取状态 r n endif break case SYNCH FRAME 同步帧 ifdef DEBUG0 Prints 同步帧 r n endif break default 未定义的标准请求 ifdef DEBUG0 Prints 错误 未定义的标准输入请求 r n endif break break case 1 类请求 ifdef DEBUG0 Prints USB 类输入请求 r n endif break case 2 厂商请求 ifdef DEBUG0 Prints USB 厂商输入请求 r n endif break default 未定义的请求 这里只显示一个报错信息 ifdef DEBUG0 Prints 错误 未定义的输入请求 r n endif break 否则说明是输出请求 else if bmRequestType endif USB 协议定义了几个标准输出请求 我们实现这些标准请求即可 请求的代码在 bRequest 中 对不同的请求代码进行散转 switch bRequest case CLEAR FEATURE 清除特性 ifdef DEBUG0 Prints 清除特性 r n endif break case SET ADDRESS 设置地址 ifdef DEBUG0 Prints 设置地址 地址为 PrintHex wValue 显示所设置的地址 Prints r n endif D12SetAddress wValue wValue 中的低字节是设置的地址值 设置地址没有数据过程 直接进入到状态过程 返回一个 0 长度的数 据包 SendLength 0 NeedZeroPacket 1 将数据通过 EP0 返回 UsbEp0SendData break case SET CONFIGURATION 设置配置 ifdef DEBUG0 Prints 设置配置 r n endif 使能非 0 端点 非 0 端点只有在设置为非 0 的配置后才能使能 wValue 的低字节为配置的值 如果该值为非 0 才能使能非 0 端点 保存当前配置值 ConfigValue wValue D12SetEndpointEnable ConfigValue 返回一个 0 长度的状态数据包 11 SendLength 0 NeedZeroPacket 1 将数据通过 EP0 返回 UsbEp0SendData break case SET DESCRIPTOR 设置描述符 ifdef DEBUG0 Prints 设置描述符 r n endif break case SET FEATURE 设置特性 ifdef DEBUG0 Prints 设置特性 r n endif break case SET INTERFACE 设置接口 ifdef DEBUG0 Prints 设置接口 r n endif break default 未定义的标准请求 ifdef DEBUG0 Prints 错误 未定义的标准输出请求 r n endif break break case 1 类请求 ifdef DEBUG0 Prints USB 类输出请求 endif switch bRequest case SET IDLE ifdef DEBUG0 Prints 设置空闲 r n endif 只需要返回一个 0 长度的数据包即可 SendLength 0 12 NeedZeroPacket 1 将数据通过 EP0 返回 UsbEp0SendData break default ifdef DEBUG0 Prints 未知请求 r n endif break break case 2 厂商请求 ifdef DEBUG0 Prints USB 厂商输出请求 r n endif break default 未定义的请求 这里只显示一个报错信息 ifdef DEBUG0 Prints 错误 未定义的输出请求 r n endif break 普通数据输出 else if D12ReadEndpointLastStatus 0 D12ClearBu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 药店活动策划方案怎么做的
- 客服咨询系统设计方案
- 2025呼伦贝尔莫旗达瓦山文化旅游投资有限责任公司招聘7人考前自测高频考点模拟试题及答案详解(各地真题)
- 投资咨询调查方案模板范文
- 2025福建省人力资源发展集团有限公司邵武分公司招聘考试参考试题及答案解析
- 教育咨询师辅导方案
- 英腾医学护理学题库及答案解析
- 儿童护理学期末考题库及答案解析
- 骨科患者便秘试题及答案
- 2025年法律职业资格之法律职业客观题二真题细选附答案完
- GB/T 46239.1-2025物流企业数字化第1部分:通用要求
- 2025年核电池行业研究报告及未来发展趋势预测
- 语文园地三 教学设计 2025-2026学年小学语文一年级上册 统编版
- 2025重庆机场集团有限公司社会招聘150人(第二次)考试参考题库及答案解析
- 2025年二外小升初真题卷及答案
- 技术方案评审与验收标准模板
- 中水资源化综合利用建设项目规划设计方案
- 政府采购管理 课件 第十三章 政府采购绩效评价
- 绿化种植安全教育培训课件
- 织袜工作业指导书
- 湖湘文化教学课件
评论
0/150
提交评论