亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? usbcore.c

?? HID USB鍵盤單片機固件程序
?? C
?? 第 1 頁 / 共 3 頁
字號:
 //bmAttributes字段。D1~D0為端點傳輸類型選擇。
 //該端點為中斷端點。中斷端點的編號為3。其它位保留為0。
 0x03,
 
 //wMaxPacketSize字段。該端點的最大包長。端點1的最大包長為16字節。
 //注意低字節在先。
 0x10,
 0x00,
 
 //bInterval字段。端點查詢的時間,我們設置為10個幀時間,即10ms。
 0x0A,
 
 /**********************輸出端點描述符***********************/
 //bLength字段。端點描述符長度為7字節。
 0x07,
 
 //bDescriptorType字段。端點描述符編號為0x05。
 0x05,
 
 //bEndpointAddress字段。端點的地址。我們使用D12的輸出端點1。
 //D7位表示數據方向,輸出端點D7為0。所以輸出端點1的地址為0x01。
 0x01,
 
 //bmAttributes字段。D1~D0為端點傳輸類型選擇。
 //該端點為中斷端點。中斷端點的編號為3。其它位保留為0。
 0x03,
 
 //wMaxPacketSize字段。該端點的最大包長。端點1的最大包長為16字節。
 //注意低字節在先。
 0x10,
 0x00,
 
 //bInterval字段。端點查詢的時間,我們設置為10個幀時間,即10ms。
 0x0A
};
////////////////////////配置描述符集合完畢//////////////////////////

/************************語言ID的定義********************/
code uint8 LanguageId[4]=
{
 0x04, //本描述符的長度
 0x03, //字符串描述符
 //0x0409為美式英語的ID
 0x09,
 0x04
};
////////////////////////語言ID完畢//////////////////////////////////

/**************************************************/
/*********        本轉換結果來自         **********/
/********* Http://computer00.21ic.org    **********/
/*********        作者: 電腦圈圈         **********/
/*********         歡迎大家使用          **********/
/*********    版權所有,盜版請寫明出處   **********/
/**************************************************/

//http://computer00.21ic.org/user1/2198/archives/2007/42769.html
//字符串“電腦圈圈的USB專區 Http://group.ednchina.com/93/”的Unicode編碼
//8位小端格式
code uint8 ManufacturerStringDescriptor[82]={
82,         //該描述符的長度為82字節
0x03,       //字符串描述符的類型編碼為0x03
0x35, 0x75, //電
0x11, 0x81, //腦
0x08, 0x57, //圈
0x08, 0x57, //圈
0x84, 0x76, //的
0x55, 0x00, //U
0x53, 0x00, //S
0x42, 0x00, //B
0x13, 0x4e, //專
0x3a, 0x53, //區
0x20, 0x00, // 
0x48, 0x00, //H
0x74, 0x00, //t
0x74, 0x00, //t
0x70, 0x00, //p
0x3a, 0x00, //:
0x2f, 0x00, ///
0x2f, 0x00, ///
0x67, 0x00, //g
0x72, 0x00, //r
0x6f, 0x00, //o
0x75, 0x00, //u
0x70, 0x00, //p
0x2e, 0x00, //.
0x65, 0x00, //e
0x64, 0x00, //d
0x6e, 0x00, //n
0x63, 0x00, //c
0x68, 0x00, //h
0x69, 0x00, //i
0x6e, 0x00, //n
0x61, 0x00, //a
0x2e, 0x00, //.
0x63, 0x00, //c
0x6f, 0x00, //o
0x6d, 0x00, //m
0x2f, 0x00, ///
0x39, 0x00, //9
0x33, 0x00, //3
0x2f, 0x00  ///
};
/////////////////////////廠商字符串結束/////////////////////////////

//字符串“《圈圈教你玩USB》之USB鍵盤”的Unicode編碼
//8位小端格式
code uint8 ProductStringDescriptor[34]={
34,         //該描述符的長度為34字節
0x03,       //字符串描述符的類型編碼為0x03
0x0a, 0x30, //《
0x08, 0x57, //圈
0x08, 0x57, //圈
0x59, 0x65, //教
0x60, 0x4f, //你
0xa9, 0x73, //玩
0x55, 0x00, //U
0x53, 0x00, //S
0x42, 0x00, //B
0x0b, 0x30, //》
0x4b, 0x4e, //之
0x55, 0x00, //U
0x53, 0x00, //S
0x42, 0x00, //B
0x2e, 0x95, //鍵
0xd8, 0x76  //盤
};
////////////////////////產品字符串結束////////////////////////////

//字符串“2008-07-12”的Unicode編碼
//8位小端格式
code uint8 SerialNumberStringDescriptor[22]={
22,         //該描述符的長度為22字節
0x03,       //字符串描述符的類型編碼為0x03
0x32, 0x00, //2
0x30, 0x00, //0
0x30, 0x00, //0
0x38, 0x00, //8
0x2d, 0x00, //-
0x30, 0x00, //0
0x37, 0x00, //7
0x2d, 0x00, //-
0x31, 0x00, //1
0x32, 0x00  //2
};
//////////////////////產品序列號字符串結束/////////////////////////

/********************************************************************
函數功能:延時x毫秒函數。
入口參數:x:延時的毫秒數。
返    回:無。
備    注:無。
********************************************************************/
void DelayXms(uint16 x)                
{
 uint16 i;
 uint16 j;
 for(i=0;i<x;i++)
 for(j=0;j<227;j++); //循環語句延時
}
////////////////////////End of function//////////////////////////////

/********************************************************************
函數功能:USB斷開連接函數。
入口參數:無。
返    回:無。
備    注:無。
********************************************************************/
void UsbDisconnect(void)
{
#ifdef DEBUG0
 Prints("斷開USB連接。\r\n");
#endif
 D12WriteCommand(D12_SET_MODE);  //寫設置模式命令
 D12WriteByte(0x06); //設置模式的第一字節
 D12WriteByte(0x47); //設置模式的第二字節
 DelayXms(1000);  //延遲1秒
}
////////////////////////End of function//////////////////////////////

/********************************************************************
函數功能:USB連接函數。
入口參數:無。
返    回:無。
備    注:無。
********************************************************************/
void UsbConnect(void)
{
#ifdef DEBUG0
 Prints("連接USB。\r\n");
#endif
 D12WriteCommand(D12_SET_MODE);  //寫設置模式命令
 D12WriteByte(0x16); //設置模式的第一字節
 D12WriteByte(0x47); //設置模式的第二字節
}
////////////////////////End of function//////////////////////////////

/********************************************************************
函數功能:總線掛起中斷處理函數。
入口參數:無。
返    回:無。
備    注:無。
********************************************************************/
void UsbBusSuspend(void)
{
#ifdef DEBUG0
 Prints("USB總線掛起。\r\n");
#endif
}
////////////////////////End of function//////////////////////////////

/********************************************************************
函數功能:總線復位中斷處理函數。
入口參數:無。
返    回:無。
備    注:無。
********************************************************************/
void UsbBusReset(void)
{
#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長度數據包標志
   }
  }
 }
}
////////////////////////End of function//////////////////////////////

/********************************************************************
函數功能:端點0輸出中斷處理函數。
入口參數:無。
返    回:無。
備    注:無。
********************************************************************/
void UsbEp0Out(void)
{
#ifdef DEBUG0
 Prints("USB端點0輸出中斷。\r\n");
#endif
 //讀取端點0輸出最后傳輸狀態,該操作清除中斷標志
 //并判斷第5位是否為1,如果是,則說明是建立包
 if(D12ReadEndpointLastStatus(0)&0x20)
 {
  D12ReadEndpointBuffer(0,16,Buffer); //讀建立過程數據
  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])<<8);
  //下面的代碼判斷具體的請求,并根據不同的請求進行相關操作
  //如果D7位為1,則說明是輸入請求
  if((bmRequestType&0x80)==0x80)
  {
   //根據bmRequestType的D6~5位散轉,D6~5位表示請求的類型
   //0為標準請求,1為類請求,2為廠商請求。
   switch((bmRequestType>>5)&0x03)
   {
    case 0:  //標準請求
     #ifdef DEBUG0
      Prints("USB標準輸入請求:");
     #endif
     //USB協議定義了幾個標準輸入請求,我們實現這些標準請求即可
     //請求的代碼在bRequest中,對不同的請求代碼進行散轉
     //事實上,我們還需要對接收者進行散轉,因為不同的請求接收者
     //是不一樣的。接收者在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)&0xFF)
        {
         case DEVICE_DESCRIPTOR: //設備描述符
          #ifdef DEBUG0
           Prints("設備描述符。\r\n");
          #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;
         
         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) //并且剛好是整數個數據包時
           {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产日韩精品一区二区浪潮av| 午夜精品福利视频网站| 天堂影院一区二区| 成人激情免费网站| 91麻豆精品国产91久久久久久| 国产日韩精品久久久| 日本成人在线一区| 色婷婷av久久久久久久| 久久久久久久久久看片| 日韩福利视频网| 在线观看中文字幕不卡| 欧美经典一区二区| 蜜桃一区二区三区在线观看| 在线视频一区二区三| 国产精品国产三级国产普通话三级 | 欧美日本在线播放| 中文字幕精品在线不卡| 国产综合一区二区| 日韩欧美国产综合在线一区二区三区 | 欧美成人性战久久| 亚洲国产精品久久久久秋霞影院| 国产白丝网站精品污在线入口| 欧美二区在线观看| 一区二区三区在线免费| av毛片久久久久**hd| 欧美国产乱子伦| 国产黄色精品视频| 久久久久久**毛片大全| 韩国成人在线视频| 精品国产伦理网| 毛片不卡一区二区| 日韩视频中午一区| 美脚の诱脚舐め脚责91| 日韩三区在线观看| 麻豆91精品91久久久的内涵| 56国语精品自产拍在线观看| 亚洲国产日韩在线一区模特| 色狠狠一区二区| 一个色综合网站| 欧美日韩中字一区| 香蕉久久夜色精品国产使用方法 | 一区二区三区毛片| 欧美性猛交xxxxxxxx| 亚洲大片精品永久免费| 欧美人体做爰大胆视频| 蜜臀久久99精品久久久久久9| 日韩一卡二卡三卡四卡| 久久国产精品免费| 久久久久久97三级| 91在线视频观看| 亚洲午夜久久久久久久久电影院| 欧美三级日韩三级| 久久国产婷婷国产香蕉| 国产丝袜在线精品| 96av麻豆蜜桃一区二区| 亚洲永久免费av| 日韩一区二区三免费高清| 国产精品一区二区视频| 国产精品夫妻自拍| 欧美午夜精品一区二区三区| 日韩国产精品久久久| 精品国产免费视频| 91论坛在线播放| 日韩av电影一区| 国产视频一区在线观看| 91丨porny丨国产| 日韩电影在线观看一区| 久久精品日产第一区二区三区高清版| 成人性色生活片| 五月婷婷久久丁香| 中文文精品字幕一区二区| 在线观看视频一区二区| 精品一区二区三区av| 中文字幕一区av| 91麻豆精品国产91久久久使用方法| 国产一区二区三区视频在线播放| 中文字幕亚洲一区二区av在线 | 成人av网站免费| 手机精品视频在线观看| 国产精品欧美极品| 欧美精品丝袜中出| 99免费精品视频| 久久精品国产澳门| 夜夜精品浪潮av一区二区三区 | 欧美精三区欧美精三区| 大尺度一区二区| 精品一区二区三区免费观看| 亚洲免费视频成人| 欧美极品少妇xxxxⅹ高跟鞋| 7777精品伊人久久久大香线蕉完整版| 福利一区福利二区| 日韩专区一卡二卡| 一级中文字幕一区二区| 国产精品欧美经典| 久久久精品免费观看| 欧美人与z0zoxxxx视频| 91黄色免费网站| 成人精品gif动图一区| 经典三级一区二区| 日韩高清一区在线| 亚洲一区在线观看免费观看电影高清| 国产日韩高清在线| 久久先锋影音av鲁色资源网| 欧美日本一区二区在线观看| 色婷婷一区二区三区四区| 岛国精品在线观看| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 久久精品国产99| 天堂蜜桃一区二区三区| 午夜久久久久久电影| 中文字幕亚洲视频| 亚洲视频在线一区二区| 综合自拍亚洲综合图不卡区| 欧美高清在线精品一区| 国产偷国产偷精品高清尤物 | 亚洲婷婷在线视频| 国产精品青草久久| 自拍偷在线精品自拍偷无码专区| 国产精品污网站| 国产精品国产三级国产普通话蜜臀| 国产日韩欧美在线一区| 国产欧美va欧美不卡在线| 久久综合av免费| 久久久久国产精品麻豆ai换脸| 精品国产一区二区三区不卡| 日韩欧美亚洲一区二区| 日韩免费高清av| 国产日韩高清在线| 亚洲三级在线免费| 一区二区欧美在线观看| 亚洲不卡一区二区三区| 美女免费视频一区| 国产精品18久久久久久久网站| 国产成人综合在线观看| 成人在线一区二区三区| 在线看一区二区| 欧美一区欧美二区| 国产欧美一区二区三区网站| 欧美国产激情一区二区三区蜜月| 亚洲欧美综合网| 亚洲3atv精品一区二区三区| 精品一区在线看| 国产不卡在线视频| 欧美系列亚洲系列| 日韩三级电影网址| 国产精品欧美一区喷水| 亚洲第一电影网| 国产一区二区网址| 91福利视频久久久久| 欧美一级国产精品| 自拍偷拍欧美激情| 美女视频一区在线观看| 成人精品国产一区二区4080| 欧美日韩一区三区| 国产午夜精品福利| 亚洲成av人片在www色猫咪| 麻豆视频一区二区| 一区二区三区四区在线播放 | 91精品午夜视频| 亚洲国产精品成人久久综合一区| 最新国产精品久久精品| 日韩电影在线观看一区| 99久久久国产精品| 91精品国产一区二区三区香蕉| 久久久久9999亚洲精品| 午夜精品久久久| 成人av电影免费在线播放| 91精选在线观看| 国产精品欧美极品| 久久不见久久见免费视频7| 色综合天天性综合| 亚洲精品在线观看网站| 亚洲综合在线第一页| 国产.欧美.日韩| 日韩欧美激情在线| 亚洲一区二区三区不卡国产欧美 | 欧美激情中文不卡| 日本不卡一区二区三区高清视频| jlzzjlzz国产精品久久| 日韩亚洲欧美在线| 五月婷婷久久丁香| 色婷婷综合久久久久中文一区二区 | 一区二区三区精品视频在线| 懂色av一区二区夜夜嗨| 日韩手机在线导航| 天天综合色天天综合色h| 色88888久久久久久影院按摩| 久久免费午夜影院| 蜜臀av性久久久久av蜜臀妖精| 精品视频免费看| 亚洲综合免费观看高清完整版 | 欧美日韩国产区一| 亚洲黄色免费网站| 97超碰欧美中文字幕| 国产精品久久久久久久久动漫| 国产一区二区三区在线看麻豆| 日韩精品一区二区三区视频播放| 日韩和欧美的一区| 欧美一区二区三区爱爱| 蜜桃精品在线观看|