全新论坛MCU智学网上线,欢迎访问新论坛!稀缺资源、技术干货、参考设计、原厂资料尽在MCU智学网
更新自动建库工具PCB Footprint Expert 2023.13 Pro / Library Expert 破解版

用51单片机做的USB鼠标程序,对与玩USB从机开发的朋友很有参考价值

  [复制链接]
14306 17

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
用51单片机做的USB鼠标程序,对与玩USB从机开发的朋友很有参考价值
/******************************************************************
   本程序只供学习使用,未经作者许可,不得用于其它任何用途
config.h file
来源:MCU资讯论坛
作者:电脑圈圈
建立日期: 2008.06.27
修改日期: 2008.07.10
版本:V1.1
版权所有,盗版必究。
Copyright(C) 电脑圈圈 2008-2018
All rights reserved            
*******************************************************************/


以下是部分源代码全部代码见附件
  1. /******************************************************************
  2. 本程序只供学习使用,未经作者许可,不得用于其它任何用途
  3. main.c file
  4. 来源:MCU资讯论坛
  5. 作者:电脑圈圈
  6. 建立日期: 2008.06.27
  7. 修改日期: 2008.07.10
  8. 版本:V1.1
  9. 版权所有,盗版必究。
  10. Copyright(C) 电脑圈圈 2008-2018
  11. All rights reserved
  12. *******************************************************************/

  13. #include <AT89X52.H> //头文件
  14. #include "Key.h"
  15. #include "Led.h"
  16. #include "UART.h"
  17. #include "pdiusbd12.h"
  18. #include "UsbCore.h"
  19. #include "config.h"

  20. code uint8 HeadTable[][74]={
  21. "********************************************************************\r\n",
  22. "****** 《圈圈教你玩USB》之 USB鼠标 ******\r\n",
  23. "****** AT89S52 CPU ******\r\n",
  24. "****** 建立日期:",__DATE__," ******\r\n",
  25. "****** 建立时间:",__TIME__," ******\r\n",
  26. "****** 作者:电脑圈圈 ******\r\n",
  27. "****** 欢迎访问作者的 ******\r\n",
  28. "****** MCU资讯论坛:http://www.mcuzx.net/ ******\r\n",
  29. "****** MCU资讯论坛:http://www.mcuzx.net/ ******\r\n",
  30. "****** MCU资讯论坛:http://www.mcuzx.net/ ******\r\n",
  31. "****** 请按K1-K8分别进行测试 ******\r\n",
  32. "****** K1:光标左移 K2:光标右移 K3:光标上移 K4:光标下移 ******\r\n",
  33. "****** K5:滚轮下滚 K6:滚轮上滚 K7:鼠标左键 K8:鼠标右键 ******\r\n",
  34. "********************************************************************\r\n",
  35. };

  36. /********************************************************************
  37. 函数功能:根据按键情况返回报告的函数。
  38. 入口参数:无。
  39. 返 回:无。
  40. 备 注:无。
  41. ********************************************************************/
  42. void SendReport(void)
  43. {
  44. //需要返回的4字节报告的缓冲
  45. //Buf[0]的D0就是左键,D1就是右键,D2就是中键(这里没有)
  46. //Buf[1]为X轴,Buf[2]为Y轴,Buf[3]为滚轮
  47. uint8 Buf[4]={0,0,0,0};

  48. //我们不需要KEY1~KEY6按键改变的信息,所以先将它们清0
  49. KeyUp &=~(KEY1|KEY2|KEY3|KEY4|KEY5|KEY6);
  50. KeyDown &=~(KEY1|KEY2|KEY3|KEY4|KEY5|KEY6);

  51. //如果有按键按住,并且不是KEY7、KEY8(左、右键)
  52. //或者KEY7、KEY8任何一个键有变动的话,则需要返回报告
  53. if((KeyPress&(~(KEY7|KEY8)))||KeyUp||KeyDown)
  54. {
  55. if(KeyPress & KEY1) //如果KEY1按住,则光标需要左移,即X轴为负值。
  56. {
  57. Buf[1]=-1; //这里一次往左移动一个单位。
  58. }
  59. if(KeyPress & KEY2) //如果KEY2按住,则光标需要右移,即X轴为正值。
  60. {
  61. Buf[1]=1; //这里一次往右移动一个单位。
  62. }
  63. if(KeyPress & KEY3) //如果KEY3按住,则光标需要上移,即Y轴为负值。
  64. {
  65. Buf[2]=-1; //这里一次往上移动一个单位。
  66. }
  67. if(KeyPress & KEY4) //如果KEY4按住,则光标需要下移,即Y轴为正值。
  68. {
  69. Buf[2]=1; //这里一次往下移动一个单位。
  70. }
  71. if(KeyPress & KEY5) //如果KEY5按住,则滚轮下滚,即滚轮值为负。
  72. {
  73. Buf[3]=-1; //这里一次往下滚动一个单位。
  74. }
  75. if(KeyPress & KEY6) //如果KEY6按住,则滚轮上滚,既滚轮值为正
  76. {
  77. Buf[3]=1; //这里一次往上滚动一个单位。
  78. }
  79. if(KeyPress & KEY7) //鼠标左键
  80. {
  81. Buf[0]|=0x01; //D0为鼠标左键
  82. }
  83. if(KeyPress & KEY8) //鼠标右键
  84. {
  85. Buf[0]|=0x02; //D1为鼠标右键
  86. }
  87. //报告准备好了,通过端点1返回,长度为4字节。
  88. D12WriteEndpointBuffer(3,4,Buf);
  89. Ep1InIsBusy=1; //设置端点忙标志。
  90. }
  91. //记得清除KeyUp和KeyDown
  92. KeyUp=0;
  93. KeyDown=0;
  94. }
  95. ////////////////////////End of function//////////////////////////////

  96. /********************************************************************
  97. 函数功能:主函数。
  98. 入口参数:无。
  99. 返 回:无。
  100. 备 注:无。
  101. ********************************************************************/
  102. void main(void) //主函数
  103. {
  104. uint8 i;
  105. uint16 id;
  106. uint8 InterruptSource;

  107. EA=1; //打开中断
  108. InitKeyboard(); //初始化按键
  109. InitUART(); //初始化串口

  110. for(i=0;i<18;i++) //显示信息
  111. {
  112. Prints(HeadTable[i]);
  113. }

  114. id=D12ReadID();

  115. Prints("Your D12 chip\'s ID is: ");
  116. PrintShortIntHex(id);

  117. if(id==0x1012)
  118. {
  119. Prints(". ID is correct! Congratulations!\r\n\r\n");
  120. }
  121. else
  122. {
  123. Prints(". ID is incorrect! What a pity!\r\n\r\n");
  124. }

  125. UsbDisconnect(); //先断开USB连接
  126. UsbConnect(); //将USB连接上
  127. ConfigValue=0; //配置值初始化为0

  128. while(1) //死循环
  129. {
  130. if(D12GetIntPin()==0) //如果有中断发生
  131. {
  132. D12WriteCommand(READ_INTERRUPT_REGISTER); //写读中断寄存器的命令
  133. InterruptSource=D12ReadByte(); //读回第一字节的中断寄存器
  134. if(InterruptSource&0x80)UsbBusSuspend(); //总线挂起中断处理
  135. if(InterruptSource&0x40)UsbBusReset(); //总线复位中断处理
  136. if(InterruptSource&0x01)UsbEp0Out(); //端点0输出中断处理
  137. if(InterruptSource&0x02)UsbEp0In(); //端点0输入中断处理
  138. if(InterruptSource&0x04)UsbEp1Out(); //端点1输出中断处理
  139. if(InterruptSource&0x08)UsbEp1In(); //端点1输入中断处理
  140. if(InterruptSource&0x10)UsbEp2Out(); //端点2输出中断处理
  141. if(InterruptSource&0x20)UsbEp2In(); //端点2输入中断处理
  142. }
  143. if(ConfigValue!=0) //如果已经设置为非0的配置,则可以返回报告数据
  144. {
  145. LEDs=~KeyPress; //利用板上8个LED显示按键状态,按下时亮
  146. if(!Ep1InIsBusy) //如果端点1输入没有处于忙状态,则可以发送数据
  147. {
  148. KeyCanChange=0; //禁止按键扫描
  149. if(KeyUp||KeyDown||KeyPress) //如果有按键事件发生
  150. {
  151. SendReport(); //则返回报告
  152. }
  153. KeyCanChange=1; //允许按键扫描
  154. }
  155. }
  156. }
  157. }
  158. ////////////////////////End of function//////////////////////////////
复制代码

39709594UsbMouse.rar (102.82 KB, 下载次数: 224)

举报

回复

17 个评论

hpd***  新手上路  发表于 2010-5-27 13:48:27  | 显示全部楼层
不错!!!!!!!!!
smiles***  新手上路  发表于 2010-5-29 18:43:44  | 显示全部楼层
谢谢分享
学习一下
wuhu***  新手上路  发表于 2010-6-5 10:41:06  | 显示全部楼层
很感谢楼主的贴啊!最好每句代码交代一下就好了,让初学者能看得更加明白,学到更多东西!{:13_784:}
kevi***  新手上路  发表于 2010-7-24 12:25:40  | 显示全部楼层
谢谢分享 ................
wangb***  新手上路  发表于 2010-8-24 16:43:38  | 显示全部楼层
非常感谢...................
pxw***  新手上路  发表于 2010-8-27 18:50:43  | 显示全部楼层
回复 1# admin


    谢谢楼主分享,学习中。
lxq***  新手上路  发表于 2010-9-7 10:48:58  | 显示全部楼层
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
xie***  新手上路  发表于 2010-9-8 11:55:58  | 显示全部楼层
我下了,非常感谢我下了,非常感谢
wu***  新手上路  发表于 2010-9-18 07:25:50  | 显示全部楼层
我来学习。。。。。。。。。。。。。。。。。。。
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

打开支付宝扫一扫,最高立得1212元红包
搜索

图文热点

更多

社区学堂

更多

客服中心

QQ:187196467 服务时间:周一至周日 8:30-20:30

关注我们

关于我们
关于我们
友情链接
联系我们
帮助中心
网友中心
购买须知
支付方式
服务支持
资源下载
售后服务
定制流程
关注我们
官方微博
官方空间
官方微信
快速回复 返回顶部 返回列表