找回密碼
         注冊會員
        搜索附件  
        MCU資訊論壇 附件中心 單片機論壇 51單片機論壇 39709594UsbMouse.rar

        39709594UsbMouse.rar

         

        用51單片機做的USB鼠標程序,對與玩USB從機開發的朋友很有參考價值:
        用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.www.9936d.com/ ******\r\n",
        29. "****** MCU資訊論壇:http://www.www.9936d.com/ ******\r\n",
        30. "****** MCU資訊論壇:http://www.www.9936d.com/ ******\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//////////////////////////////
        復制代碼

        不錯!!!!!!!!!
        很感謝樓主的貼啊!最好每句代碼交代一下就好了,讓初學者能看得更加明白,學到更多東西!{:13_784:}
        非常感謝...................
        回復 1# admin


            謝謝樓主分享,學習中。
        DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
        我下了,非常感謝我下了,非常感謝
        我來學習。。。。。。。。。。。。。。。。。。。
        多謝!!!!!!!!!!!!
        回復 admin 的帖子

        真在找這方面的資料,非常感謝
        {:e163:}{:e163:}{:e163:}{:e163:}{:e163:}{:e163:}{:e163:}{:e163:}{:e163:}{:e163:}{:e163:}{:e163:}{:e163:}{:e163:}{:e163:}{:e163:}

        QQ|手機版|MCU資訊論壇 ( 京ICP備18035221號-2 )|網站地圖

        GMT+8, 2025-3-18 12:46 , Processed in 0.040668 second(s), 8 queries , Redis On.

        Powered by Discuz! X3.5

        © 2001-2024 Discuz! Team.

        返回頂部
        国产精品日本欧美一区二区| 男人日女人在线免费观看| 老司机午夜精品视频你懂的| 亚洲性日韩精品国产一区二区 | 91精品国产91热久久久久福利| 国产成人精品无人区一区| 欧美成人精品高清在线播放| 亚洲精品乱码久久久久久蜜桃图片 | 亚洲精品tv久久久久| 日本伊人精品一区二区三区| 国产乱码精品一区二区三区四川人| 国产精品推荐天天看天天爽| 日本一区二区三区免费观看| 9久久9久久精品| 久久人搡人人玩人妻精品首页| 亚洲AV永久无码精品| 尤物国产在线精品福利一区| 午夜精品一区二区三区在线视| 精品久久久久久成人AV| 国产精品你懂的在线播放| 亚洲精品美女久久久久99| 99久久精品费精品国产| 女无遮挡h肉动漫在线观看| 国产成人精品日本亚洲专| 久久久久国产精品三级网| 精品调教CHINESEGAY| 国产乱人伦精品一区二区在线观看 | 亚洲日韩精品无码专区网址| 国产精品怡红院永久免费| 欧美精品色精品一区二区三区| 久久99久久99精品免视看动漫| 国产精品色视频ⅹxxx | 亚洲国产精品一区| 在线影院国内精品| 亚洲精品无码不卡| 中文字幕乱码中文乱码51精品| 99re只有精品8中文| 5566av来看电影| 国产成人精品免高潮在线观看| 亚洲精品你懂的在线观看| 国产精品日日摸夜夜添夜夜添1国产精品va欧美精|