用51單片機做的USB鼠標程序,對與玩USB從機開發的朋友很有參考價值
/******************************************************************
本程序只供學習使用,未經作者許可,不得用于其它任何用途
config.h file
來源:
MCU資訊論壇
作者:電腦圈圈
建立日期: 2008.06.27
修改日期: 2008.07.10
版本:V1.1
版權所有,盜版必究。
Copyright(C) 電腦圈圈 2008-2018
All rights reserved
*******************************************************************/
以下是部分源代碼全部代碼見附件
- /******************************************************************
- 本程序只供學習使用,未經作者許可,不得用于其它任何用途
- main.c file
- 來源:MCU資訊論壇
- 作者:電腦圈圈
- 建立日期: 2008.06.27
- 修改日期: 2008.07.10
- 版本:V1.1
- 版權所有,盜版必究。
- Copyright(C) 電腦圈圈 2008-2018
- All rights reserved
- *******************************************************************/
- #include <AT89X52.H> //頭文件
- #include "Key.h"
- #include "Led.h"
- #include "UART.h"
- #include "pdiusbd12.h"
- #include "UsbCore.h"
- #include "config.h"
- code uint8 HeadTable[][74]={
- "********************************************************************\r\n",
- "****** 《圈圈教你玩USB》之 USB鼠標 ******\r\n",
- "****** AT89S52 CPU ******\r\n",
- "****** 建立日期:",__DATE__," ******\r\n",
- "****** 建立時間:",__TIME__," ******\r\n",
- "****** 作者:電腦圈圈 ******\r\n",
- "****** 歡迎訪問作者的 ******\r\n",
- "****** MCU資訊論壇:http://www.www.9936d.com/ ******\r\n",
- "****** MCU資訊論壇:http://www.www.9936d.com/ ******\r\n",
- "****** MCU資訊論壇:http://www.www.9936d.com/ ******\r\n",
- "****** 請按K1-K8分別進行測試 ******\r\n",
- "****** K1:光標左移 K2:光標右移 K3:光標上移 K4:光標下移 ******\r\n",
- "****** K5:滾輪下滾 K6:滾輪上滾 K7:鼠標左鍵 K8:鼠標右鍵 ******\r\n",
- "********************************************************************\r\n",
- };
- /********************************************************************
- 函數功能:根據按鍵情況返回報告的函數。
- 入口參數:無。
- 返 回:無。
- 備 注:無。
- ********************************************************************/
- void SendReport(void)
- {
- //需要返回的4字節報告的緩沖
- //Buf[0]的D0就是左鍵,D1就是右鍵,D2就是中鍵(這里沒有)
- //Buf[1]為X軸,Buf[2]為Y軸,Buf[3]為滾輪
- uint8 Buf[4]={0,0,0,0};
- //我們不需要KEY1~KEY6按鍵改變的信息,所以先將它們清0
- KeyUp &=~(KEY1|KEY2|KEY3|KEY4|KEY5|KEY6);
- KeyDown &=~(KEY1|KEY2|KEY3|KEY4|KEY5|KEY6);
- //如果有按鍵按住,并且不是KEY7、KEY8(左、右鍵)
- //或者KEY7、KEY8任何一個鍵有變動的話,則需要返回報告
- if((KeyPress&(~(KEY7|KEY8)))||KeyUp||KeyDown)
- {
- if(KeyPress & KEY1) //如果KEY1按住,則光標需要左移,即X軸為負值。
- {
- Buf[1]=-1; //這里一次往左移動一個單位。
- }
- if(KeyPress & KEY2) //如果KEY2按住,則光標需要右移,即X軸為正值。
- {
- Buf[1]=1; //這里一次往右移動一個單位。
- }
- if(KeyPress & KEY3) //如果KEY3按住,則光標需要上移,即Y軸為負值。
- {
- Buf[2]=-1; //這里一次往上移動一個單位。
- }
- if(KeyPress & KEY4) //如果KEY4按住,則光標需要下移,即Y軸為正值。
- {
- Buf[2]=1; //這里一次往下移動一個單位。
- }
- if(KeyPress & KEY5) //如果KEY5按住,則滾輪下滾,即滾輪值為負。
- {
- Buf[3]=-1; //這里一次往下滾動一個單位。
- }
- if(KeyPress & KEY6) //如果KEY6按住,則滾輪上滾,既滾輪值為正
- {
- Buf[3]=1; //這里一次往上滾動一個單位。
- }
- if(KeyPress & KEY7) //鼠標左鍵
- {
- Buf[0]|=0x01; //D0為鼠標左鍵
- }
- if(KeyPress & KEY8) //鼠標右鍵
- {
- Buf[0]|=0x02; //D1為鼠標右鍵
- }
- //報告準備好了,通過端點1返回,長度為4字節。
- D12WriteEndpointBuffer(3,4,Buf);
- Ep1InIsBusy=1; //設置端點忙標志。
- }
- //記得清除KeyUp和KeyDown
- KeyUp=0;
- KeyDown=0;
- }
- ////////////////////////End of function//////////////////////////////
- /********************************************************************
- 函數功能:主函數。
- 入口參數:無。
- 返 回:無。
- 備 注:無。
- ********************************************************************/
- void main(void) //主函數
- {
- uint8 i;
- uint16 id;
- uint8 InterruptSource;
- EA=1; //打開中斷
- InitKeyboard(); //初始化按鍵
- InitUART(); //初始化串口
- for(i=0;i<18;i++) //顯示信息
- {
- Prints(HeadTable[i]);
- }
- id=D12ReadID();
- Prints("Your D12 chip\'s ID is: ");
- PrintShortIntHex(id);
- if(id==0x1012)
- {
- Prints(". ID is correct! Congratulations!\r\n\r\n");
- }
- else
- {
- Prints(". ID is incorrect! What a pity!\r\n\r\n");
- }
- UsbDisconnect(); //先斷開USB連接
- UsbConnect(); //將USB連接上
- ConfigValue=0; //配置值初始化為0
- while(1) //死循環
- {
- if(D12GetIntPin()==0) //如果有中斷發生
- {
- D12WriteCommand(READ_INTERRUPT_REGISTER); //寫讀中斷寄存器的命令
- InterruptSource=D12ReadByte(); //讀回第一字節的中斷寄存器
- if(InterruptSource&0x80)UsbBusSuspend(); //總線掛起中斷處理
- if(InterruptSource&0x40)UsbBusReset(); //總線復位中斷處理
- if(InterruptSource&0x01)UsbEp0Out(); //端點0輸出中斷處理
- if(InterruptSource&0x02)UsbEp0In(); //端點0輸入中斷處理
- if(InterruptSource&0x04)UsbEp1Out(); //端點1輸出中斷處理
- if(InterruptSource&0x08)UsbEp1In(); //端點1輸入中斷處理
- if(InterruptSource&0x10)UsbEp2Out(); //端點2輸出中斷處理
- if(InterruptSource&0x20)UsbEp2In(); //端點2輸入中斷處理
- }
- if(ConfigValue!=0) //如果已經設置為非0的配置,則可以返回報告數據
- {
- LEDs=~KeyPress; //利用板上8個LED顯示按鍵狀態,按下時亮
- if(!Ep1InIsBusy) //如果端點1輸入沒有處于忙狀態,則可以發送數據
- {
- KeyCanChange=0; //禁止按鍵掃描
- if(KeyUp||KeyDown||KeyPress) //如果有按鍵事件發生
- {
- SendReport(); //則返回報告
- }
- KeyCanChange=1; //允許按鍵掃描
- }
- }
- }
- }
- ////////////////////////End of function//////////////////////////////
復制代碼
非常感謝...................
{:e163:}{:e163:}{:e163:}{:e163:}{:e163:}{:e163:}{:e163:}{:e163:}{:e163:}{:e163:}{:e163:}{:e163:}{:e163:}{:e163:}{:e163:}{:e163:}