標(biāo)題:
CH554串口接收數(shù)據(jù)轉(zhuǎn)USB鍵值程序 CH559模擬USB復(fù)合設(shè)備,鍵鼠,支持類命令
[打印本頁]
作者:
xs_wape
時(shí)間:
2018-12-3 13:04
標(biāo)題:
CH554串口接收數(shù)據(jù)轉(zhuǎn)USB鍵值程序 CH559模擬USB復(fù)合設(shè)備,鍵鼠,支持類命令
一個通過CH55X系列單片機(jī)接收串口數(shù)據(jù)轉(zhuǎn)HID鍵盤上傳程序
1、本例程基于USB單片機(jī)CH559、CH558、CH554編寫,所有版權(quán)歸WCH所有。
2、本例程實(shí)時(shí)更新,不另行通知。
/********************************** (C) COPYRIGHT *******************************
* File Name :Composite_Dev.C
* Author : WCH
* Version : V1.0
* Date : 2017/01/20
* Description : CH559模擬USB復(fù)合設(shè)備,鍵鼠,支持類命令
*******************************************************************************/
#include "./Public/CH554.H"
#include "./Public/DEBUG.H"
#include <string.h>
#include <stdio.h>
#define THIS_ENDP0_SIZE DEFAULT_ENDP0_SIZE
#define CapsLockLED 0x02
#define BUFMAX 16
UINT8X Ep0Buffer[8>(THIS_ENDP0_SIZE+2)?8:(THIS_ENDP0_SIZE+2)] _at_ 0x0000; //端點(diǎn)0 OUT&IN緩沖區(qū),必須是偶地址
UINT8X Ep1Buffer[64>(MAX_PACKET_SIZE+2)?64:(MAX_PACKET_SIZE+2)] _at_ 0x000a; //端點(diǎn)1 IN緩沖區(qū),必須是偶地址
UINT8 SetupReq,SetupLen,Ready,Count,FLAG,UsbConfig,LED_VALID;
PUINT8 pDescr; //USB配置標(biāo)志
USB_SETUP_REQ SetupReqBuf; //暫存Setup包
bit Ep2InKey;
#define UsbSetupBuf ((PUSB_SETUP_REQ)Ep0Buffer)
#define DEBUG 0
#pragma NOAREGS
/*設(shè)備描述符*/
UINT8C DevDesc[18] = {0x12,0x01,0x10,0x01,0x00,0x00,0x00,0x08,
0x3d,0x41,0x07,0x21,0x00,0x00,0x00,0x00,
0x00,0x01
};
UINT8C CfgDesc[59] =
{
0x09,0x02,0x22,0x00,0x01,0x01,0x00,0xA0,0x32, //配置描述符
0x09,0x04,0x00,0x00,0x01,0x03,0x01,0x01,0x00, //接口描述符,鍵盤
0x09,0x21,0x11,0x01,0x00,0x01,0x22,0x3e,0x00, //HID類描述符
0x07,0x05,0x81,0x03,0x08,0x00,0x0a, //端點(diǎn)描述符
};
/*字符串描述符*/
/*HID類報(bào)表描述符*/
UINT8C KeyRepDesc[62] =
{
0x05,0x01,0x09,0x06,0xA1,0x01,0x05,0x07,
0x19,0xe0,0x29,0xe7,0x15,0x00,0x25,0x01,
0x75,0x01,0x95,0x08,0x81,0x02,0x95,0x01,
0x75,0x08,0x81,0x01,0x95,0x03,0x75,0x01,
0x05,0x08,0x19,0x01,0x29,0x03,0x91,0x02,
0x95,0x05,0x75,0x01,0x91,0x01,0x95,0x06,
0x75,0x08,0x26,0xff,0x00,0x05,0x07,0x19,
0x00,0x29,0x91,0x81,0x00,0xC0
};
/*鍵盤數(shù)據(jù)*/
UINT8 HIDKey[8] = {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0};
UINT8 DataBuffer[BUFMAX];
UINT8 DataLen =0;
UINT8 RecvPoint =0;
UINT8 SendPoint =0;
/*******************************************************************************
* Function Name : USBDeviceInit()
* Description : USB設(shè)備模式配置,設(shè)備模式啟動,收發(fā)端點(diǎn)配置,中斷開啟
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void USBDeviceInit()
{
IE_USB = 0;
USB_CTRL = 0x00; // 先設(shè)定USB設(shè)備模式
UEP0_DMA = Ep0Buffer; //端點(diǎn)0數(shù)據(jù)傳輸?shù)刂?br />
UEP1_DMA = Ep1Buffer; //端點(diǎn)1數(shù)據(jù)傳輸?shù)刂?br />
UEP4_1_MOD = ~(bUEP4_RX_EN | bUEP4_TX_EN |bUEP1_RX_EN | bUEP1_BUF_MOD) | bUEP4_TX_EN;//端點(diǎn)1單64字節(jié)收發(fā)緩沖區(qū),端點(diǎn)0收發(fā)
UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK; //OUT事務(wù)返回ACK,IN事務(wù)返回NAK
UEP1_CTRL = bUEP_T_TOG | UEP_T_RES_NAK;
USB_DEV_AD = 0x00;
UDEV_CTRL = bUD_PD_DIS; // 禁止DP/DM下拉電阻
USB_CTRL = bUC_DEV_PU_EN | bUC_INT_BUSY | bUC_DMA_EN; // 啟動USB設(shè)備及DMA,在中斷期間中斷標(biāo)志未清除前自動返回NAK
UDEV_CTRL |= bUD_PORT_EN; // 允許USB端口
USB_INT_FG = 0xFF; // 清中斷標(biāo)志
USB_INT_EN = bUIE_SUSPEND | bUIE_TRANSFER | bUIE_BUS_RST;
IE_USB = 1;
}
/*******************************************************************************
* Function Name : Enp1IntIn()
* Description : USB設(shè)備模式端點(diǎn)1的中斷上傳
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void Enp1IntIn( )
{
memcpy( Ep1Buffer, HIDKey, sizeof(HIDKey)); //加載上傳數(shù)據(jù)
UEP1_T_LEN = sizeof(HIDKey); //上傳數(shù)據(jù)長度
UEP1_CTRL = UEP1_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_ACK; //有數(shù)據(jù)時(shí)上傳數(shù)據(jù)并應(yīng)答ACK
}
/*******************************************************************************
* Function Name : DeviceInterrupt()
* Description : CH559USB中斷處理函數(shù)
*******************************************************************************/
void DeviceInterrupt( void ) interrupt INT_NO_USB using 1 //USB中斷服務(wù)程序,使用寄存器組1
{
UINT8 len;
if(UIF_TRANSFER) //USB傳輸完成標(biāo)志
{
switch (USB_INT_ST & (MASK_UIS_TOKEN | MASK_UIS_ENDP))
{
case UIS_TOKEN_IN | 2: //endpoint 2# 中斷端點(diǎn)上傳
UEP2_T_LEN = 0; //預(yù)使用發(fā)送長度一定要清空
// UEP1_CTRL ^= bUEP_T_TOG; //如果不設(shè)置自動翻轉(zhuǎn)則需要手動翻轉(zhuǎn)
UEP2_CTRL = UEP2_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_NAK; //默認(rèn)應(yīng)答NAK
break;
case UIS_TOKEN_IN | 1: //endpoint 1# 中斷端點(diǎn)上傳
UEP1_T_LEN = 0; //預(yù)使用發(fā)送長度一定要清空
// UEP2_CTRL ^= bUEP_T_TOG; //如果不設(shè)置自動翻轉(zhuǎn)則需要手動翻轉(zhuǎn)
UEP1_CTRL = UEP1_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_NAK; //默認(rèn)應(yīng)答NAK
FLAG = 1; /*傳輸完成標(biāo)志*/
break;
case UIS_TOKEN_SETUP | 0: //SETUP事務(wù)
len = USB_RX_LEN;
if(len == (sizeof(USB_SETUP_REQ)))
{
SetupLen = UsbSetupBuf->wLengthL;
if(UsbSetupBuf->wLengthH || SetupLen > 0x7F )
{
SetupLen = 0x7F; // 限制總長度
}
len = 0; // 默認(rèn)為成功并且上傳0長度
SetupReq = UsbSetupBuf->bRequest;
if ( ( UsbSetupBuf->bRequestType & USB_REQ_TYP_MASK ) != USB_REQ_TYP_STANDARD )/* HID類命令 */
{
switch( SetupReq )
{
case 0x01://GetReport
break;
case 0x02://GetIdle
break;
case 0x03://GetProtocol
break;
case 0x09://SetReport
break;
case 0x0A://SetIdle
break;
case 0x0B://SetProtocol
break;
default:
len = 0xFF; /*命令不支持*/
break;
}
}
else
{//標(biāo)準(zhǔn)請求
switch(SetupReq) //請求碼
{
case USB_GET_DESCRIPTOR:
switch(UsbSetupBuf->wValueH)
{
case 1: //設(shè)備描述符
pDescr = DevDesc; //把設(shè)備描述符送到要發(fā)送的緩沖區(qū)
len = sizeof(DevDesc);
break;
case 2: //配置描述符
pDescr = CfgDesc; //把設(shè)備描述符送到要發(fā)送的緩沖區(qū)
len = sizeof(CfgDesc);
break;
case 0x22: //報(bào)表描述符
if(UsbSetupBuf->wIndexL == 0) //接口0報(bào)表描述符
{
pDescr = KeyRepDesc; //數(shù)據(jù)準(zhǔn)備上傳
len = sizeof(KeyRepDesc);
Ready = 1; //如果有更多接口,該標(biāo)準(zhǔn)位應(yīng)該在最后一個接口配置完成后有效
IE_UART1 = 1;//開啟串口中斷
}
else
{
len = 0xff; //本程序只有2個接口,這句話正常不可能執(zhí)行
}
break;
default:
len = 0xff; //不支持的命令或者出錯
break;
}
if ( SetupLen > len )
{
SetupLen = len; //限制總長度
}
len = SetupLen >= 8 ? 8 : SetupLen; //本次傳輸長度
memcpy(Ep0Buffer,pDescr,len); //加載上傳數(shù)據(jù)
SetupLen -= len;
pDescr += len;
break;
case USB_SET_ADDRESS:
SetupLen = UsbSetupBuf->wValueL; //暫存USB設(shè)備地址
break;
case USB_GET_CONFIGURATION:
Ep0Buffer[0] = UsbConfig;
if ( SetupLen >= 1 )
{
len = 1;
}
break;
case USB_SET_CONFIGURATION:
UsbConfig = UsbSetupBuf->wValueL;
break;
case 0x0A:
break;
case USB_CLEAR_FEATURE: //Clear Feature
if ( ( UsbSetupBuf->bRequestType & USB_REQ_RECIP_MASK ) == USB_REQ_RECIP_ENDP )// 端點(diǎn)
{
switch( UsbSetupBuf->wIndexL )
{
case 0x82:
UEP2_CTRL = UEP2_CTRL & ~ ( bUEP_T_TOG | MASK_UEP_T_RES ) | UEP_T_RES_NAK;
break;
case 0x81:
UEP1_CTRL = UEP1_CTRL & ~ ( bUEP_T_TOG | MASK_UEP_T_RES ) | UEP_T_RES_NAK;
break;
case 0x01:
UEP1_CTRL = UEP1_CTRL & ~ ( bUEP_R_TOG | MASK_UEP_R_RES ) | UEP_R_RES_ACK;
break;
default:
len = 0xFF; // 不支持的端點(diǎn)
break;
}
}
else
{
len = 0xFF; // 不是端點(diǎn)不支持
}
break;
case USB_SET_FEATURE: /* Set Feature */
if( ( UsbSetupBuf->bRequestType & 0x1F ) == 0x00 ) /* 設(shè)置設(shè)備 */
{
if( ( ( ( UINT16 )UsbSetupBuf->wValueH << 8 ) | UsbSetupBuf->wValueL ) == 0x01 )
{
if( CfgDesc[ 7 ] & 0x20 )
{
/* 設(shè)置喚醒使能標(biāo)志 */
}
else
{
len = 0xFF; /* 操作失敗 */
}
}
else
{
len = 0xFF; /* 操作失敗 */
}
}
else if( ( UsbSetupBuf->bRequestType & 0x1F ) == 0x02 ) /* 設(shè)置端點(diǎn) */
{
if( ( ( ( UINT16 )UsbSetupBuf->wValueH << 8 ) | UsbSetupBuf->wValueL ) == 0x00 )
{
switch( ( ( UINT16 )UsbSetupBuf->wIndexH << 8 ) | UsbSetupBuf->wIndexL )
{
case 0x82:
UEP2_CTRL = UEP2_CTRL & (~bUEP_T_TOG) | UEP_T_RES_STALL;/* 設(shè)置端點(diǎn)2 IN STALL */
break;
case 0x02:
UEP2_CTRL = UEP2_CTRL & (~bUEP_R_TOG) | UEP_R_RES_STALL;/* 設(shè)置端點(diǎn)2 OUT Stall */
break;
case 0x81:
UEP1_CTRL = UEP1_CTRL & (~bUEP_T_TOG) | UEP_T_RES_STALL;/* 設(shè)置端點(diǎn)1 IN STALL */
break;
default:
len = 0xFF; //操作失敗
break;
}
}
else
{
len = 0xFF; //操作失敗
}
}
else
{
len = 0xFF; //操作失敗
}
break;
case USB_GET_STATUS:
Ep0Buffer[0] = 0x00;
Ep0Buffer[1] = 0x00;
if ( SetupLen >= 2 )
{
len = 2;
}
else
{
len = SetupLen;
}
break;
default:
len = 0xff; //操作失敗
break;
}
}
}
else
{
len = 0xff; //包長度錯誤
}
if(len == 0xff)
{
SetupReq = 0xFF;
UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_STALL | UEP_T_RES_STALL;//STALL
}
else if(len <= 8) //上傳數(shù)據(jù)或者狀態(tài)階段返回0長度包
{
UEP0_T_LEN = len;
UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_ACK | UEP_T_RES_ACK;//默認(rèn)數(shù)據(jù)包是DATA1,返回應(yīng)答ACK
}
else
{
UEP0_T_LEN = 0; //雖然尚未到狀態(tài)階段,但是提前預(yù)置上傳0長度數(shù)據(jù)包以防主機(jī)提前進(jìn)入狀態(tài)階段
UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_ACK | UEP_T_RES_ACK;//默認(rèn)數(shù)據(jù)包是DATA1,返回應(yīng)答ACK
}
break;
case UIS_TOKEN_IN | 0: //endpoint0 IN
switch(SetupReq)
{
case USB_GET_DESCRIPTOR:
len = SetupLen >= 8 ? 8 : SetupLen; //本次傳輸長度
memcpy( Ep0Buffer, pDescr, len ); //加載上傳數(shù)據(jù)
SetupLen -= len;
pDescr += len;
UEP0_T_LEN = len;
UEP0_CTRL ^= bUEP_T_TOG; //同步標(biāo)志位翻轉(zhuǎn)
break;
case USB_SET_ADDRESS:
USB_DEV_AD = USB_DEV_AD & bUDA_GP_BIT | SetupLen;
UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;
break;
default:
UEP0_T_LEN = 0; //狀態(tài)階段完成中斷或者是強(qiáng)制上傳0長度數(shù)據(jù)包結(jié)束控制傳輸
UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;
break;
}
break;
case UIS_TOKEN_OUT | 0: // endpoint0 OUT
len = USB_RX_LEN;
if((SetupReq == 0x09)&& (len == 1))
{
LED_VALID = Ep0Buffer[0];
}
else if((SetupReq == 0x09) && (len == 8)){//SetReport
}
UEP0_T_LEN = 0; //雖然尚未到狀態(tài)階段,但是提前預(yù)置上傳0長度數(shù)據(jù)包以防主機(jī)提前進(jìn)入狀態(tài)階段
UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_ACK;//默認(rèn)數(shù)據(jù)包是DATA0,返回應(yīng)答ACK
break;
default:
break;
}
UIF_TRANSFER = 0; //寫0清空中斷
}
if(UIF_BUS_RST) //設(shè)備模式USB總線復(fù)位中斷
{
UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;
UEP1_CTRL = bUEP_AUTO_TOG | UEP_R_RES_ACK;
UEP2_CTRL = bUEP_AUTO_TOG | UEP_R_RES_ACK | UEP_T_RES_NAK;
USB_DEV_AD = 0x00;
UIF_SUSPEND = 0;
UIF_TRANSFER = 0;
UIF_BUS_RST = 0; //清中斷標(biāo)志
}
if (UIF_SUSPEND) //USB總線掛起/喚醒完成
{
UIF_SUSPEND = 0;
}
else { //意外的中斷,不可能發(fā)生的情況
USB_INT_FG = 0xFF; //清中斷標(biāo)志
}
}
/*******************************************************************************
* Function Name : QueryUART1Interrupt(void)
* Description : UART1中斷服務(wù)程序
*******************************************************************************/
void QueryUART1Interrupt( void ) interrupt INT_NO_UART1 using 2 //UART1中斷服務(wù)程序,使用寄存器組1
{
if(U1RI)
{
U1RI = 0;
DataBuffer[RecvPoint++] = SBUF1;
DataLen++;
if(RecvPoint==BUFMAX) RecvPoint=0;
}
U1TI = 0;
}
/*******************************************************************************
* Function Name : KeyCodeCorrespond()
* Description : 鍵碼比對表,由數(shù)值對應(yīng)鍵盤值。
* Input : UINT8 keyCode
* Output : None
* Return : None
*******************************************************************************/
void KeyCodeCorrespond(UINT8 keyCode)
{
HIDKey[0] = 0;
if((keyCode>='a')&&(keyCode<='z')){ //鍵值a-z
if(LED_VALID&0x02)
{
FLAG = 0;
HIDKey[2] = 0x39;
Enp1IntIn();
while(FLAG == 0);
FLAG = 0;
memset(&HIDKey[0],0,8);
Enp1IntIn();
while(FLAG == 0);
}
keyCode -= 0x5D;
HIDKey[2] = keyCode;
}
else if((keyCode>='A')&&(keyCode<='Z')){
if((LED_VALID&0x02) == 0)
{
FLAG = 0;
HIDKey[2] = 0x39;
Enp1IntIn();
while(FLAG == 0);
FLAG = 0;
memset(&HIDKey[0],0,8);
Enp1IntIn();
while(FLAG == 0);
}
keyCode -= 0x3D;
HIDKey[2] = keyCode;
// HIDKey[0] = 0x02; //shift+
}
else if((keyCode>='1')&&(keyCode<='9')){
keyCode -= 0x13; //字母區(qū)數(shù)字鍵
HIDKey[2] = keyCode;
}
else if(keyCode=='0'){
HIDKey[2] = 0x27;
}
else if(keyCode <= 0x2f){
if(keyCode == 0x20){
HIDKey[2] = 0x2C; //空格
}
else if(keyCode == 0x21){//'!'
HIDKey[2] = 0x1E;
HIDKey[0] = 0x02; //shift+
}
else if(keyCode == 0x22){//'"'
HIDKey[2] = 0x34;
HIDKey[0] = 0x02; //shift+
}
else if(keyCode == 0x23){//'#'
HIDKey[2] = 0x20;
HIDKey[0] = 0x02; //shift+
}
else if(keyCode == 0x24){//'
HIDKey[2] = 0x21;
HIDKey[0] = 0x02; //shift+
}
else if(keyCode == 0x25){//'%'
HIDKey[2] = 0x22;
HIDKey[0] = 0x02; //shift+
}
else if(keyCode == 0x26){//'&'
HIDKey[2] = 0x24;
HIDKey[0] = 0x02; //shift+
}
else if(keyCode == 0x27){//'%'
HIDKey[2] = 0x34;
}
else if(keyCode == 0x28){/*(*/
HIDKey[2] = 0x26;
HIDKey[0] = 0x02; //shift+
}
else if(keyCode == 0x29){/*)*/
HIDKey[2] = 0x27;
HIDKey[0] = 0x02; //shift+
}
else if(keyCode == 0x2a){/***/
HIDKey[2] = 0x25;
HIDKey[0] = 0x02; //shift+
}
else if(keyCode == 0x2b){/*+*/
HIDKey[2] = 0x2e;
HIDKey[0] = 0x02; //shift+
}
else if(keyCode == 0x2c){/*,*/
HIDKey[2] = 0x36;
}
else if(keyCode == 0x2d){/*-*/
HIDKey[2] = 0x2d;
}
else if(keyCode == 0x2e){/*,*/
HIDKey[2] = 0x37;
}
else if(keyCode == 0x2f){/*/*/
HIDKey[2] = 0x38;
}
}
else if(keyCode <= 0x3f){
if(keyCode == 0x3a){/*:*/
HIDKey[2] = 0x33;
HIDKey[0] |= 0x02; //shift+
}
else if(keyCode == 0x3b){/*;*/
HIDKey[2] = 0x33;
}
else if(keyCode == 0x3c){/*<*/
HIDKey[2] = 0x36;
HIDKey[0] |= 0x02; //shift+
}
else if(keyCode == 0x3d){/*=*/
HIDKey[2] = 0x2e;
}
else if(keyCode == 0x3e){/*>*/
HIDKey[2] = 0x37;
HIDKey[0] |= 0x02; //shift+
}
else if(keyCode == 0x3f){/*?*/
HIDKey[2] = 0x38;
HIDKey[0] |= 0x02; //shift+
}
}
else if(keyCode == 0x40){/*@*/
HIDKey[2] = 0x1f;
HIDKey[0] = 0x02; //shift+
}
else if((keyCode >= 0x5b)&&(keyCode <= 0x60)){
if(keyCode == 0x5b){/*[*/
HIDKey[2] = 0x2f;
}
else if(keyCode == 0x5c){/*\*/
HIDKey[2] = 0x31;
}
else if(keyCode == 0x5d){/*:*/
HIDKey[2] = 0x30;
}
else if(keyCode == 0x5e){/*:*/
HIDKey[2] = 0x23;
HIDKey[0] = 0x02; //shift+
}
else if(keyCode == 0x5f){/*:*/
HIDKey[2] = 0x2d;
HIDKey[0] = 0x02; //shift+
}
else if(keyCode == 0x60){/*`*/
HIDKey[2] = 0x35;
}
}
else if((keyCode >= 0x7b)&&(keyCode <= 0x7f)){
if(keyCode == 0x7b){/*{*/
HIDKey[2] = 0x2f;
HIDKey[0] = 0x02; //shift+
}
else if(keyCode == 0x7c){/*|*/
HIDKey[2] = 0x31;
HIDKey[0] = 0x02; //shift+
}
else if(keyCode == 0x7d){/*}*/
HIDKey[2] = 0x30;
HIDKey[0] = 0x02; //shift+
}
else if(keyCode == 0x7e){/*~*/
HIDKey[2] = 0x35;
HIDKey[0] = 0x02; //shift+
}
else if(keyCode == 0x7f){/*{*/
HIDKey[2] = 0x4c;
}
}
else if((keyCode >= 0x80)&&(keyCode <= 0x87)){/*left ctl*/
keyCode &= 0x0f;
HIDKey[0] = (1<<keyCode); //
}
else if((keyCode >= 0xd7)&&(keyCode <= 0xda)){/**/
keyCode -= 0x88;
HIDKey[2] = keyCode;
}
else if((keyCode >= 0xb0)&&(keyCode <= 0xb3)){/**/
keyCode -= 0x88;
HIDKey[2] = keyCode;
}
else if((keyCode >= 0xd1)&&(keyCode <= 0xd5)){/**/
keyCode -= 0x88;
HIDKey[2] = keyCode;
}
else if((keyCode >= 0xC1)&&(keyCode <= 0xCD)){/**/
keyCode -= 0x88;
HIDKey[2] = keyCode;
}
}
void HIDValueHandle()
{
DataLen--;
KeyCodeCorrespond(DataBuffer[SendPoint]);
SendPoint++;
if(SendPoint>=BUFMAX) SendPoint=0;
FLAG = 0;
Enp1IntIn();
while(FLAG == 0);
FLAG = 0;
memset(&HIDKey[0],0,8);
Enp1IntIn();
while(FLAG == 0);
}
main()
{
CfgFsys( ); //CH559時(shí)鐘選擇配置
mDelaymS(5); //修改主頻等待內(nèi)部晶振穩(wěn)定,必加
mInitSTDIO( ); //串口0初始化
printf("start\n");
USBDeviceInit(); //USB設(shè)備模式初始化
UART1Setup();
EA = 1; //允許單片機(jī)中斷
IP_EX = bIP_UART1;//串口優(yōu)先等級高
UEP1_T_LEN = 0; //預(yù)使用發(fā)送長度一定要清空
FLAG = 0;
Ready = 0;
LED_VALID = 1; //給一個默認(rèn)值
while(1)
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
全部資料51hei下載地址:
CH554串口接收數(shù)據(jù)轉(zhuǎn)USB鍵值上傳201808.zip
(135.46 KB, 下載次數(shù): 102)
2018-12-3 13:02 上傳
點(diǎn)擊文件名下載附件
CH55X模擬鍵盤
下載積分: 黑幣 -5
作者:
pttderen
時(shí)間:
2019-3-2 23:16
能找你做個usb幽靈鍵鼠嗎 類似飛易來或文盒誠意我qq 1662003456
作者:
a164162007
時(shí)間:
2019-9-15 22:31
pttderen 發(fā)表于 2019-3-2 23:16
能找你做個usb幽靈鍵鼠嗎 類似飛易來或文盒誠意我qq 1662003456
做好了嗎?求分享
作者:
csansong
時(shí)間:
2019-9-17 14:52
想做個串口轉(zhuǎn)USB HID,這個能用嗎?
作者:
a130340
時(shí)間:
2020-8-4 20:18
樓主能幫我修復(fù)一下鍵鼠模擬的BUG嗎 , 源碼出了問題
求解決,可以的話留下QQ我加你
作者:
好運(yùn)十倍
時(shí)間:
2021-6-29 12:27
很想做個串口轉(zhuǎn)USB HID的鍵盤
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1