久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8456|回復: 5
收起左側

CH554串口接收數據轉USB鍵值程序 CH559模擬USB復合設備,鍵鼠,支持類命令

[復制鏈接]
ID:407961 發表于 2018-12-3 13:04 | 顯示全部樓層 |閱讀模式
一個通過CH55X系列單片機接收串口數據轉HID鍵盤上傳程序
1、本例程基于USB單片機CH559、CH558、CH554編寫,所有版權歸WCH所有。

2、本例程實時更新,不另行通知。

  1. /********************************** (C) COPYRIGHT *******************************
  2. * File Name          :Composite_Dev.C
  3. * Author             : WCH
  4. * Version            : V1.0
  5. * Date               : 2017/01/20
  6. * Description        : CH559模擬USB復合設備,鍵鼠,支持類命令
  7. *******************************************************************************/

  8. #include "./Public/CH554.H"                                                      
  9. #include "./Public/DEBUG.H"
  10. #include <string.h>
  11. #include <stdio.h>

  12. #define THIS_ENDP0_SIZE         DEFAULT_ENDP0_SIZE
  13. #define CapsLockLED 0x02
  14. #define BUFMAX 16

  15. UINT8X  Ep0Buffer[8>(THIS_ENDP0_SIZE+2)?8:(THIS_ENDP0_SIZE+2)] _at_ 0x0000;    //端點0 OUT&IN緩沖區,必須是偶地址
  16. UINT8X  Ep1Buffer[64>(MAX_PACKET_SIZE+2)?64:(MAX_PACKET_SIZE+2)] _at_ 0x000a;  //端點1 IN緩沖區,必須是偶地址
  17. UINT8   SetupReq,SetupLen,Ready,Count,FLAG,UsbConfig,LED_VALID;
  18. PUINT8  pDescr;                                                                //USB配置標志
  19. USB_SETUP_REQ   SetupReqBuf;                                                   //暫存Setup包
  20. bit Ep2InKey;
  21. #define UsbSetupBuf     ((PUSB_SETUP_REQ)Ep0Buffer)
  22. #define DEBUG 0
  23. #pragma  NOAREGS
  24. /*設備描述符*/
  25. UINT8C DevDesc[18] = {0x12,0x01,0x10,0x01,0x00,0x00,0x00,0x08,
  26.                       0x3d,0x41,0x07,0x21,0x00,0x00,0x00,0x00,
  27.                       0x00,0x01
  28.                      };
  29. UINT8C CfgDesc[59] =
  30. {
  31.     0x09,0x02,0x22,0x00,0x01,0x01,0x00,0xA0,0x32,             //配置描述符
  32.     0x09,0x04,0x00,0x00,0x01,0x03,0x01,0x01,0x00,             //接口描述符,鍵盤
  33.     0x09,0x21,0x11,0x01,0x00,0x01,0x22,0x3e,0x00,             //HID類描述符
  34.     0x07,0x05,0x81,0x03,0x08,0x00,0x0a,                       //端點描述符
  35. };
  36. /*字符串描述符*/
  37. /*HID類報表描述符*/
  38. UINT8C KeyRepDesc[62] =
  39. {
  40.     0x05,0x01,0x09,0x06,0xA1,0x01,0x05,0x07,
  41.     0x19,0xe0,0x29,0xe7,0x15,0x00,0x25,0x01,
  42.     0x75,0x01,0x95,0x08,0x81,0x02,0x95,0x01,
  43.     0x75,0x08,0x81,0x01,0x95,0x03,0x75,0x01,
  44.     0x05,0x08,0x19,0x01,0x29,0x03,0x91,0x02,
  45.     0x95,0x05,0x75,0x01,0x91,0x01,0x95,0x06,
  46.     0x75,0x08,0x26,0xff,0x00,0x05,0x07,0x19,
  47.     0x00,0x29,0x91,0x81,0x00,0xC0
  48. };

  49. /*鍵盤數據*/
  50. UINT8 HIDKey[8] = {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0};
  51. UINT8 DataBuffer[BUFMAX];
  52. UINT8 DataLen =0;
  53. UINT8 RecvPoint =0;
  54. UINT8 SendPoint =0;


  55. /*******************************************************************************
  56. * Function Name  : USBDeviceInit()
  57. * Description    : USB設備模式配置,設備模式啟動,收發端點配置,中斷開啟
  58. * Input          : None
  59. * Output         : None
  60. * Return         : None
  61. *******************************************************************************/
  62. void USBDeviceInit()
  63. {
  64.           IE_USB = 0;
  65.           USB_CTRL = 0x00;                                                           // 先設定USB設備模式
  66.     UEP0_DMA = Ep0Buffer;                                                      //端點0數據傳輸地址
  67.     UEP1_DMA = Ep1Buffer;                                                      //端點1數據傳輸地址
  68.     UEP4_1_MOD = ~(bUEP4_RX_EN | bUEP4_TX_EN |bUEP1_RX_EN | bUEP1_BUF_MOD) | bUEP4_TX_EN;//端點1單64字節收發緩沖區,端點0收發
  69.     UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;                                 //OUT事務返回ACK,IN事務返回NAK
  70.     UEP1_CTRL = bUEP_T_TOG | UEP_T_RES_NAK;
  71.                
  72.           USB_DEV_AD = 0x00;
  73.           UDEV_CTRL = bUD_PD_DIS;                                                    // 禁止DP/DM下拉電阻
  74.           USB_CTRL = bUC_DEV_PU_EN | bUC_INT_BUSY | bUC_DMA_EN;                      // 啟動USB設備及DMA,在中斷期間中斷標志未清除前自動返回NAK
  75.           UDEV_CTRL |= bUD_PORT_EN;                                                  // 允許USB端口
  76.           USB_INT_FG = 0xFF;                                                         // 清中斷標志
  77.           USB_INT_EN = bUIE_SUSPEND | bUIE_TRANSFER | bUIE_BUS_RST;
  78.           IE_USB = 1;
  79. }
  80. /*******************************************************************************
  81. * Function Name  : Enp1IntIn()
  82. * Description    : USB設備模式端點1的中斷上傳
  83. * Input          : None
  84. * Output         : None
  85. * Return         : None
  86. *******************************************************************************/
  87. void Enp1IntIn( )
  88. {
  89.     memcpy( Ep1Buffer, HIDKey, sizeof(HIDKey));                              //加載上傳數據
  90.     UEP1_T_LEN = sizeof(HIDKey);                                             //上傳數據長度
  91.     UEP1_CTRL = UEP1_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_ACK;                //有數據時上傳數據并應答ACK
  92. }

  93. /*******************************************************************************
  94. * Function Name  : DeviceInterrupt()
  95. * Description    : CH559USB中斷處理函數
  96. *******************************************************************************/
  97. void    DeviceInterrupt( void ) interrupt INT_NO_USB using 1                      //USB中斷服務程序,使用寄存器組1
  98. {
  99.     UINT8 len;
  100.     if(UIF_TRANSFER)                                                            //USB傳輸完成標志
  101.     {
  102.         switch (USB_INT_ST & (MASK_UIS_TOKEN | MASK_UIS_ENDP))
  103.         {
  104.         case UIS_TOKEN_IN | 2:                                                  //endpoint 2# 中斷端點上傳
  105.             UEP2_T_LEN = 0;                                                     //預使用發送長度一定要清空
  106. //            UEP1_CTRL ^= bUEP_T_TOG;                                          //如果不設置自動翻轉則需要手動翻轉
  107.             UEP2_CTRL = UEP2_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_NAK;           //默認應答NAK
  108.             break;
  109.         case UIS_TOKEN_IN | 1:                                                  //endpoint 1# 中斷端點上傳
  110.             UEP1_T_LEN = 0;                                                     //預使用發送長度一定要清空
  111. //            UEP2_CTRL ^= bUEP_T_TOG;                                          //如果不設置自動翻轉則需要手動翻轉
  112.             UEP1_CTRL = UEP1_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_NAK;           //默認應答NAK
  113.             FLAG = 1;                                                           /*傳輸完成標志*/
  114.             break;
  115.         case UIS_TOKEN_SETUP | 0:                                                //SETUP事務
  116.             len = USB_RX_LEN;
  117.             if(len == (sizeof(USB_SETUP_REQ)))
  118.             {
  119.                 SetupLen = UsbSetupBuf->wLengthL;
  120.                 if(UsbSetupBuf->wLengthH || SetupLen > 0x7F )
  121.                 {
  122.                     SetupLen = 0x7F;    // 限制總長度
  123.                 }
  124.                 len = 0;                                                        // 默認為成功并且上傳0長度
  125.                 SetupReq = UsbSetupBuf->bRequest;                                                               
  126.                 if ( ( UsbSetupBuf->bRequestType & USB_REQ_TYP_MASK ) != USB_REQ_TYP_STANDARD )/* HID類命令 */
  127.                 {
  128.                                                                         switch( SetupReq )
  129.                                                                         {
  130.                                                                                 case 0x01://GetReport
  131.                                                                                                  break;
  132.                                                                                 case 0x02://GetIdle
  133.                                                                                                  break;        
  134.                                                                                 case 0x03://GetProtocol
  135.                                                                                                  break;                                
  136.                                                                                 case 0x09://SetReport                                                                                
  137.                                                                                                  break;
  138.                                                                                 case 0x0A://SetIdle
  139.                                                                                                  break;        
  140.                                                                                 case 0x0B://SetProtocol
  141.                                                                                                  break;
  142.                                                                                 default:
  143.                                                                                                  len = 0xFF;                                                                                                                       /*命令不支持*/                                       
  144.                                                                                                  break;
  145.                                                                   }        
  146.                 }
  147.                 else
  148.                 {//標準請求
  149.                     switch(SetupReq)                                        //請求碼
  150.                     {
  151.                     case USB_GET_DESCRIPTOR:
  152.                         switch(UsbSetupBuf->wValueH)
  153.                         {
  154.                         case 1:                                             //設備描述符
  155.                             pDescr = DevDesc;                               //把設備描述符送到要發送的緩沖區
  156.                             len = sizeof(DevDesc);
  157.                             break;
  158.                         case 2:                                             //配置描述符
  159.                             pDescr = CfgDesc;                               //把設備描述符送到要發送的緩沖區
  160.                             len = sizeof(CfgDesc);
  161.                             break;
  162.                         case 0x22:                                          //報表描述符
  163.                             if(UsbSetupBuf->wIndexL == 0)                   //接口0報表描述符
  164.                             {
  165.                                 pDescr = KeyRepDesc;                        //數據準備上傳
  166.                                 len = sizeof(KeyRepDesc);
  167.                                 Ready = 1;                                  //如果有更多接口,該標準位應該在最后一個接口配置完成后有效
  168.                                 IE_UART1 = 1;//開啟串口中斷                                                                                                                        
  169.                                                                                                                         
  170.                             }
  171.                             else
  172.                             {
  173.                                 len = 0xff;                                 //本程序只有2個接口,這句話正常不可能執行
  174.                             }
  175.                             break;
  176.                         default:
  177.                             len = 0xff;                                     //不支持的命令或者出錯
  178.                             break;
  179.                         }
  180.                         if ( SetupLen > len )
  181.                         {
  182.                             SetupLen = len;    //限制總長度
  183.                         }
  184.                         len = SetupLen >= 8 ? 8 : SetupLen;                  //本次傳輸長度
  185.                         memcpy(Ep0Buffer,pDescr,len);                        //加載上傳數據
  186.                         SetupLen -= len;
  187.                         pDescr += len;
  188.                         break;
  189.                     case USB_SET_ADDRESS:
  190.                         SetupLen = UsbSetupBuf->wValueL;                     //暫存USB設備地址
  191.                         break;
  192.                     case USB_GET_CONFIGURATION:
  193.                         Ep0Buffer[0] = UsbConfig;
  194.                         if ( SetupLen >= 1 )
  195.                         {
  196.                             len = 1;
  197.                         }
  198.                         break;
  199.                     case USB_SET_CONFIGURATION:
  200.                         UsbConfig = UsbSetupBuf->wValueL;
  201.                         break;
  202.                     case 0x0A:
  203.                         break;
  204.                     case USB_CLEAR_FEATURE:                                            //Clear Feature
  205.                         if ( ( UsbSetupBuf->bRequestType & USB_REQ_RECIP_MASK ) == USB_REQ_RECIP_ENDP )// 端點
  206.                         {
  207.                             switch( UsbSetupBuf->wIndexL )
  208.                             {
  209.                             case 0x82:
  210.                                 UEP2_CTRL = UEP2_CTRL & ~ ( bUEP_T_TOG | MASK_UEP_T_RES ) | UEP_T_RES_NAK;
  211.                                 break;
  212.                             case 0x81:
  213.                                 UEP1_CTRL = UEP1_CTRL & ~ ( bUEP_T_TOG | MASK_UEP_T_RES ) | UEP_T_RES_NAK;
  214.                                 break;
  215.                             case 0x01:
  216.                                 UEP1_CTRL = UEP1_CTRL & ~ ( bUEP_R_TOG | MASK_UEP_R_RES ) | UEP_R_RES_ACK;
  217.                                 break;
  218.                             default:
  219.                                 len = 0xFF;                                            // 不支持的端點
  220.                                 break;
  221.                             }
  222.                         }
  223.                         else
  224.                         {
  225.                             len = 0xFF;                                                // 不是端點不支持
  226.                         }
  227.                         break;
  228.                     case USB_SET_FEATURE:                                              /* Set Feature */
  229.                         if( ( UsbSetupBuf->bRequestType & 0x1F ) == 0x00 )             /* 設置設備 */
  230.                         {
  231.                             if( ( ( ( UINT16 )UsbSetupBuf->wValueH << 8 ) | UsbSetupBuf->wValueL ) == 0x01 )
  232.                             {
  233.                                 if( CfgDesc[ 7 ] & 0x20 )
  234.                                 {
  235.                                     /* 設置喚醒使能標志 */
  236.                                 }
  237.                                 else
  238.                                 {
  239.                                     len = 0xFF;                                        /* 操作失敗 */
  240.                                 }
  241.                             }
  242.                             else
  243.                             {
  244.                                 len = 0xFF;                                            /* 操作失敗 */
  245.                             }
  246.                         }
  247.                         else if( ( UsbSetupBuf->bRequestType & 0x1F ) == 0x02 )        /* 設置端點 */
  248.                         {
  249.                             if( ( ( ( UINT16 )UsbSetupBuf->wValueH << 8 ) | UsbSetupBuf->wValueL ) == 0x00 )
  250.                             {
  251.                                 switch( ( ( UINT16 )UsbSetupBuf->wIndexH << 8 ) | UsbSetupBuf->wIndexL )
  252.                                 {
  253.                                 case 0x82:
  254.                                     UEP2_CTRL = UEP2_CTRL & (~bUEP_T_TOG) | UEP_T_RES_STALL;/* 設置端點2 IN STALL */
  255.                                     break;
  256.                                 case 0x02:
  257.                                     UEP2_CTRL = UEP2_CTRL & (~bUEP_R_TOG) | UEP_R_RES_STALL;/* 設置端點2 OUT Stall */
  258.                                     break;
  259.                                 case 0x81:
  260.                                     UEP1_CTRL = UEP1_CTRL & (~bUEP_T_TOG) | UEP_T_RES_STALL;/* 設置端點1 IN STALL */
  261.                                     break;
  262.                                 default:
  263.                                     len = 0xFF;                               //操作失敗
  264.                                     break;
  265.                                 }
  266.                             }
  267.                             else
  268.                             {
  269.                                 len = 0xFF;                                   //操作失敗
  270.                             }
  271.                         }
  272.                         else
  273.                         {
  274.                             len = 0xFF;                                      //操作失敗
  275.                         }
  276.                         break;
  277.                     case USB_GET_STATUS:
  278.                         Ep0Buffer[0] = 0x00;
  279.                         Ep0Buffer[1] = 0x00;
  280.                         if ( SetupLen >= 2 )
  281.                         {
  282.                             len = 2;
  283.                         }
  284.                         else
  285.                         {
  286.                             len = SetupLen;
  287.                         }
  288.                         break;
  289.                     default:
  290.                         len = 0xff;                                           //操作失敗
  291.                         break;
  292.                     }
  293.                 }
  294.             }
  295.             else
  296.             {
  297.                 len = 0xff;                                                   //包長度錯誤
  298.             }
  299.             if(len == 0xff)
  300.             {
  301.                 SetupReq = 0xFF;
  302.                 UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_STALL | UEP_T_RES_STALL;//STALL
  303.             }
  304.             else if(len <= 8)                                                //上傳數據或者狀態階段返回0長度包
  305.             {
  306.                 UEP0_T_LEN = len;
  307.                 UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_ACK | UEP_T_RES_ACK;//默認數據包是DATA1,返回應答ACK
  308.             }
  309.             else
  310.             {
  311.                 UEP0_T_LEN = 0;  //雖然尚未到狀態階段,但是提前預置上傳0長度數據包以防主機提前進入狀態階段
  312.                 UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_ACK | UEP_T_RES_ACK;//默認數據包是DATA1,返回應答ACK
  313.             }
  314.             break;
  315.         case UIS_TOKEN_IN | 0:                                               //endpoint0 IN
  316.             switch(SetupReq)
  317.             {
  318.             case USB_GET_DESCRIPTOR:
  319.                 len = SetupLen >= 8 ? 8 : SetupLen;                          //本次傳輸長度
  320.                 memcpy( Ep0Buffer, pDescr, len );                            //加載上傳數據
  321.                 SetupLen -= len;
  322.                 pDescr += len;
  323.                 UEP0_T_LEN = len;
  324.                 UEP0_CTRL ^= bUEP_T_TOG;                                     //同步標志位翻轉
  325.                 break;
  326.             case USB_SET_ADDRESS:
  327.                 USB_DEV_AD = USB_DEV_AD & bUDA_GP_BIT | SetupLen;
  328.                 UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;
  329.                 break;
  330.             default:
  331.                 UEP0_T_LEN = 0;                                              //狀態階段完成中斷或者是強制上傳0長度數據包結束控制傳輸
  332.                 UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;
  333.                 break;
  334.             }
  335.             break;
  336.         case UIS_TOKEN_OUT | 0:  // endpoint0 OUT
  337.             len = USB_RX_LEN;
  338.             if((SetupReq == 0x09)&& (len == 1))
  339.             {
  340.               LED_VALID = Ep0Buffer[0];                                                        
  341.             }
  342.             else if((SetupReq == 0x09) && (len == 8)){//SetReport                                                
  343.             }                                                        
  344.             UEP0_T_LEN = 0;  //雖然尚未到狀態階段,但是提前預置上傳0長度數據包以防主機提前進入狀態階段
  345.             UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_ACK;//默認數據包是DATA0,返回應答ACK
  346.             break;
  347.         default:
  348.             break;
  349.         }
  350.         UIF_TRANSFER = 0;                                                 //寫0清空中斷
  351.     }
  352.     if(UIF_BUS_RST)                                                       //設備模式USB總線復位中斷
  353.     {
  354.         UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;
  355.         UEP1_CTRL = bUEP_AUTO_TOG | UEP_R_RES_ACK;
  356.         UEP2_CTRL = bUEP_AUTO_TOG | UEP_R_RES_ACK | UEP_T_RES_NAK;
  357.         USB_DEV_AD = 0x00;
  358.         UIF_SUSPEND = 0;
  359.         UIF_TRANSFER = 0;
  360.         UIF_BUS_RST = 0;                                                 //清中斷標志
  361.     }
  362.     if (UIF_SUSPEND)                                                     //USB總線掛起/喚醒完成
  363.     {
  364.         UIF_SUSPEND = 0;
  365.     }
  366.     else {                                                               //意外的中斷,不可能發生的情況
  367.         USB_INT_FG = 0xFF;                                               //清中斷標志
  368.     }
  369. }

  370. /*******************************************************************************
  371. * Function Name  : QueryUART1Interrupt(void)
  372. * Description    : UART1中斷服務程序
  373. *******************************************************************************/
  374. void  QueryUART1Interrupt( void ) interrupt INT_NO_UART1 using 2             //UART1中斷服務程序,使用寄存器組1
  375. {
  376.     if(U1RI)
  377.     {
  378.         U1RI = 0;
  379.         DataBuffer[RecvPoint++] = SBUF1;
  380.         DataLen++;
  381.         if(RecvPoint==BUFMAX) RecvPoint=0;                        
  382.     }
  383.     U1TI = 0;
  384. }

  385. /*******************************************************************************
  386. * Function Name  : KeyCodeCorrespond()
  387. * Description    : 鍵碼比對表,由數值對應鍵盤值。
  388. * Input          : UINT8 keyCode
  389. * Output         : None
  390. * Return         : None
  391. *******************************************************************************/
  392. void KeyCodeCorrespond(UINT8 keyCode)
  393. {
  394.         HIDKey[0] = 0;
  395.         if((keyCode>='a')&&(keyCode<='z')){                                       //鍵值a-z

  396.                 if(LED_VALID&0x02)
  397.                 {
  398.                         FLAG = 0;
  399.                         HIDKey[2] = 0x39;
  400.                         Enp1IntIn();
  401.                         while(FLAG == 0);
  402.                         FLAG = 0;        
  403.                         memset(&HIDKey[0],0,8);
  404.                         Enp1IntIn();               
  405.                         while(FLAG == 0);                                
  406.                 }
  407.                 keyCode -= 0x5D;
  408.                 HIDKey[2] = keyCode;                 
  409.                
  410.         }
  411.   else if((keyCode>='A')&&(keyCode<='Z')){                        
  412.                 if((LED_VALID&0x02) == 0)
  413.                 {
  414.                         FLAG = 0;
  415.                         HIDKey[2] = 0x39;
  416.                         Enp1IntIn();
  417.                         while(FLAG == 0);
  418.                         FLAG = 0;        
  419.                         memset(&HIDKey[0],0,8);
  420.                         Enp1IntIn();               
  421.                         while(FLAG == 0);                                
  422.                 }   
  423.          
  424.          
  425.           keyCode -= 0x3D;
  426.     HIDKey[2] = keyCode;  
  427. //    HIDKey[0]        = 0x02;                                                          //shift+               
  428.    
  429.   }
  430.   else if((keyCode>='1')&&(keyCode<='9')){
  431.                 keyCode -= 0x13;                                                        //字母區數字鍵
  432.                 HIDKey[2] = keyCode;                 
  433.         }
  434.         else if(keyCode=='0'){
  435.                 HIDKey[2] = 0x27;                 
  436.         }               
  437.         else if(keyCode <= 0x2f){               
  438.                 if(keyCode == 0x20){
  439.                         HIDKey[2] = 0x2C;                                                     //空格        
  440.                 }               
  441.                 else if(keyCode == 0x21){//'!'
  442.                         HIDKey[2] = 0x1E;
  443.                         HIDKey[0]        = 0x02;                                                          //shift+               
  444.                 }
  445.                 else if(keyCode == 0x22){//'"'
  446.                         HIDKey[2] = 0x34;
  447.                         HIDKey[0]        = 0x02;                                                          //shift+               
  448.                 }
  449.                 else if(keyCode == 0x23){//'#'
  450.                         HIDKey[2] = 0x20;
  451.                         HIDKey[0]        = 0x02;                                                          //shift+               
  452.                 }
  453.                 else if(keyCode == 0x24){//'


  454.                         HIDKey[2] = 0x21;
  455.                         HIDKey[0]        = 0x02;                                                          //shift+               
  456.                 }        
  457.                 else if(keyCode == 0x25){//'%'
  458.                         HIDKey[2] = 0x22;
  459.                         HIDKey[0]        = 0x02;                                                          //shift+               
  460.                 }
  461.                 else if(keyCode == 0x26){//'&'
  462.                         HIDKey[2] = 0x24;
  463.                         HIDKey[0]        = 0x02;                                                          //shift+               
  464.                 }
  465.                 else if(keyCode == 0x27){//'%'
  466.                         HIDKey[2] = 0x34;         
  467.                 }
  468.                 else if(keyCode == 0x28){/*(*/
  469.                         HIDKey[2] = 0x26;
  470.                         HIDKey[0]        = 0x02;                                                          //shift+               
  471.                 }
  472.                 else if(keyCode == 0x29){/*)*/
  473.                         HIDKey[2] = 0x27;
  474.                         HIDKey[0]        = 0x02;                                                          //shift+               
  475.                 }
  476.                 else if(keyCode == 0x2a){/***/
  477.                         HIDKey[2] = 0x25;
  478.                         HIDKey[0]        = 0x02;                                                          //shift+               
  479.                 }
  480.                 else if(keyCode == 0x2b){/*+*/
  481.                         HIDKey[2] = 0x2e;
  482.                         HIDKey[0]        = 0x02;                                                          //shift+               
  483.                 }        
  484.                 else if(keyCode == 0x2c){/*,*/
  485.                         HIDKey[2] = 0x36;         
  486.                 }        
  487.                 else if(keyCode == 0x2d){/*-*/
  488.                         HIDKey[2] = 0x2d;         
  489.                 }        
  490.                 else if(keyCode == 0x2e){/*,*/
  491.                         HIDKey[2] = 0x37;         
  492.                 }        
  493.                 else if(keyCode == 0x2f){/*/*/
  494.                         HIDKey[2] = 0x38;                 
  495.                 }               
  496.   }
  497.   else if(keyCode <= 0x3f){        
  498.                 if(keyCode == 0x3a){/*:*/
  499.                         HIDKey[2] = 0x33;         
  500.                         HIDKey[0]        |= 0x02;                                                          //shift+                        
  501.                 }
  502.                 else if(keyCode == 0x3b){/*;*/
  503.                         HIDKey[2] = 0x33;                        
  504.                 }        
  505.                 else if(keyCode == 0x3c){/*<*/
  506.                         HIDKey[2] = 0x36;         
  507.                         HIDKey[0]        |= 0x02;                                                          //shift+                        
  508.                 }
  509.                 else if(keyCode == 0x3d){/*=*/
  510.                         HIDKey[2] = 0x2e;                                 
  511.                 }        
  512.                 else if(keyCode == 0x3e){/*>*/
  513.                         HIDKey[2] = 0x37;         
  514.                         HIDKey[0]        |= 0x02;                                                          //shift+                        
  515.                 }
  516.                 else if(keyCode == 0x3f){/*?*/
  517.                         HIDKey[2] = 0x38;         
  518.                         HIDKey[0]        |= 0x02;                                                          //shift+                        
  519.                 }
  520.   }
  521.   else if(keyCode == 0x40){/*@*/
  522.     HIDKey[2] = 0x1f;         
  523.     HIDKey[0]        = 0x02;                                                          //shift+                          
  524.   }
  525.   else if((keyCode >= 0x5b)&&(keyCode <= 0x60)){        
  526.                 if(keyCode == 0x5b){/*[*/
  527.                         HIDKey[2] = 0x2f;                        
  528.                 }        
  529.                 else if(keyCode == 0x5c){/*\*/
  530.                         HIDKey[2] = 0x31;                        
  531.                 }
  532.                 else if(keyCode == 0x5d){/*:*/
  533.                         HIDKey[2] = 0x30;                 
  534.                 }        
  535.                 else if(keyCode == 0x5e){/*:*/
  536.                         HIDKey[2] = 0x23;         
  537.                         HIDKey[0]        = 0x02;                                                          //shift+                        
  538.                 }
  539.                 else if(keyCode == 0x5f){/*:*/
  540.                         HIDKey[2] = 0x2d;         
  541.                         HIDKey[0]        = 0x02;                                                          //shift+                        
  542.                 }
  543.                 else if(keyCode == 0x60){/*`*/
  544.                         HIDKey[2] = 0x35;                        
  545.                 }        
  546.         }
  547.   else if((keyCode >= 0x7b)&&(keyCode <= 0x7f)){
  548.                 if(keyCode == 0x7b){/*{*/
  549.                         HIDKey[2] = 0x2f;         
  550.                         HIDKey[0]        = 0x02;                                                          //shift+                        
  551.                 }
  552.                 else if(keyCode == 0x7c){/*|*/
  553.                         HIDKey[2] = 0x31;         
  554.                         HIDKey[0]        = 0x02;                                                          //shift+                        
  555.                 }
  556.                 else if(keyCode == 0x7d){/*}*/
  557.                         HIDKey[2] = 0x30;         
  558.                         HIDKey[0]        = 0x02;                                                          //shift+                        
  559.                 }
  560.                 else if(keyCode == 0x7e){/*~*/
  561.                         HIDKey[2] = 0x35;         
  562.                         HIDKey[0]        = 0x02;                                                          //shift+                        
  563.                 }
  564.                 else if(keyCode == 0x7f){/*{*/
  565.                         HIDKey[2] = 0x4c;                        
  566.                 }
  567.         }
  568.   else if((keyCode >= 0x80)&&(keyCode <= 0x87)){/*left ctl*/        
  569.     keyCode &= 0x0f;
  570.     HIDKey[0]        = (1<<keyCode);                                                  //                        
  571.   }
  572.   else if((keyCode >= 0xd7)&&(keyCode <= 0xda)){/**/
  573.     keyCode -= 0x88;                 
  574.     HIDKey[2]        = keyCode;                                                         
  575.   }
  576.   else if((keyCode >= 0xb0)&&(keyCode <= 0xb3)){/**/
  577.     keyCode -= 0x88;                 
  578.     HIDKey[2]        = keyCode;        
  579.   }
  580.   else if((keyCode >= 0xd1)&&(keyCode <= 0xd5)){/**/
  581.     keyCode -= 0x88;                 
  582.     HIDKey[2]        = keyCode;                                                         
  583.   }
  584.   else if((keyCode >= 0xC1)&&(keyCode <= 0xCD)){/**/
  585.     keyCode -= 0x88;                 
  586.     HIDKey[2]        = keyCode;                                                         
  587.   }

  588. }


  589. void HIDValueHandle()
  590. {
  591.         DataLen--;        

  592.         KeyCodeCorrespond(DataBuffer[SendPoint]);
  593.         
  594.         SendPoint++;
  595.         if(SendPoint>=BUFMAX) SendPoint=0;

  596.         FLAG = 0;
  597.         Enp1IntIn();
  598.         while(FLAG == 0);
  599.         FLAG = 0;        
  600.         memset(&HIDKey[0],0,8);
  601.         Enp1IntIn();               
  602.         while(FLAG == 0);               
  603.         
  604. }

  605. main()
  606. {
  607.     CfgFsys( );                                                           //CH559時鐘選擇配置
  608.     mDelaymS(5);                                                          //修改主頻等待內部晶振穩定,必加        
  609.     mInitSTDIO( );                                                        //串口0初始化        
  610.     printf("start\n");
  611.         USBDeviceInit();                                                      //USB設備模式初始化
  612.     UART1Setup();
  613.     EA = 1;                                                               //允許單片機中斷
  614.     IP_EX = bIP_UART1;//串口優先等級高
  615.     UEP1_T_LEN = 0;                                                       //預使用發送長度一定要清空
  616.     FLAG = 0;
  617.     Ready = 0;
  618.         LED_VALID = 1;   //給一個默認值
  619.     while(1)
  620. ……………………

  621. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

全部資料51hei下載地址:
CH554串口接收數據轉USB鍵值上傳201808.zip (135.46 KB, 下載次數: 102)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:483484 發表于 2019-3-2 23:16 | 顯示全部樓層
能找你做個usb幽靈鍵鼠嗎 類似飛易來或文盒誠意我qq 1662003456
回復

使用道具 舉報

ID:611832 發表于 2019-9-15 22:31 來自手機 | 顯示全部樓層
pttderen 發表于 2019-3-2 23:16
能找你做個usb幽靈鍵鼠嗎 類似飛易來或文盒誠意我qq 1662003456

做好了嗎?求分享
回復

使用道具 舉報

ID:612579 發表于 2019-9-17 14:52 | 顯示全部樓層
想做個串口轉USB HID,這個能用嗎?
回復

使用道具 舉報

ID:811328 發表于 2020-8-4 20:18 | 顯示全部樓層
樓主能幫我修復一下鍵鼠模擬的BUG嗎 , 源碼出了問題
求解決,可以的話留下QQ我加你
回復

使用道具 舉報

ID:944652 發表于 2021-6-29 12:27 | 顯示全部樓層
很想做個串口轉USB HID的鍵盤
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品美女久久久久aⅴ国产馆 | 欧美激情综合 | 久久中文免费视频 | 欧美精品一区在线 | 一区二区在线观看av | 99视频在线免费观看 | 视频一区中文字幕 | 欧美激情视频一区二区三区在线播放 | 九色视频网站 | www操操 | 国产一区999 | 久久精品一区 | 成人在线中文字幕 | 精品99爱视频在线观看 | 亚洲精品一区二区三区在线 | 日韩成人在线免费视频 | 91伊人| 亚洲一区二区三区视频 | 精品国产欧美一区二区三区成人 | 午夜影院操 | 日韩中文字幕一区二区 | 精品产国自在拍 | 国产良家自拍 | 国产精品一码二码三码在线 | 国产成人精品一区二区三区网站观看 | 无码日韩精品一区二区免费 | 在线精品一区二区 | 日韩一区二区三区在线视频 | 97人人澡人人爽91综合色 | 亚洲影音 | 久久久久国产精品午夜一区 | 成人一区二区三区在线观看 | 在线播放国产一区二区三区 | 96久久久久久 | 伊人久久大香线 | 成人小视频在线 | 国产高清视频一区二区 | 日日欧美| 国产日韩精品视频 | 亚洲第一网站 | 精品视频在线免费观看 |