⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbex.c

📁 USB接口的HID类键盘模拟
💻 C
📖 第 1 页 / 共 2 页
字号:
			for(len=0;len!=length;len++)request.buffer[len]=CH375_RD_DAT_PORT();  // 取出数据
			if(length==0x08){
			    mVarSetupLength=request.buffer[6];							//控制传输数据长度最大设置为128
				if((c1=request.r.bmReuestType)&0x40){         					 //厂商请求,未处理
				}
				if((c1=request.r.bmReuestType)&0x20){// printf("b\n");         					//类请求,未处理
					if(request.buffer[1]==0x0a){//printf("c\n");
						}												//SET_IDLE
					else if(request.buffer[1]==0x09){
							UPDATA_FLAG=1;
					}
				}
				if(!((c1=request.r.bmReuestType)&0x60)){          				//标准请求
					mVarSetupRequest=request.r.bRequest;							//暂存标准请求码
					switch(request.r.bRequest){  // 分析标准请求
						case DEF_USB_CLR_FEATURE:									//清除特性
							if((c1=request.r.bmReuestType&0x1F)==0X02){					//不是端点不支持
								switch(request.buffer[4]){
									case 0x82:
										CH375_WR_CMD_PORT(CMD_SET_ENDP7);					//清除端点2上传
										CH375_WR_DAT_PORT(0x8E);                			//发命令清除端点
										break;
									case 0x02:
										CH375_WR_CMD_PORT(CMD_SET_ENDP6);
										CH375_WR_DAT_PORT(0x80);							//清除端点2下传
										break;
									case 0x81:
										CH375_WR_CMD_PORT(CMD_SET_ENDP5);					//清除端点1上传
										CH375_WR_DAT_PORT(0x8E);
										break;
									case 0x01:
										CH375_WR_CMD_PORT(CMD_SET_ENDP4);					//清除端点1下传
										CH375_WR_DAT_PORT(0x80);
										break;
									default:
										break;
								}
							}
							else{
								CH375FLAGERR=1;								//不支持的清除特性,置错误标志
							}
							break;
						case DEF_USB_GET_STATUS:								//获得状态
							request.buffer[0]=0;
							request.buffer[1]=0;								//上传状态
							break;
						case DEF_USB_SET_ADDRESS:								//设置地址
							VarUsbAddress=request.buffer[2];					//暂存USB主机发来的地址
							break;
						case DEF_USB_GET_DESCR: 								//获得描述符
							if(request.buffer[3]==1)							//设备描述符上传
								VarSetupDescr=DevDes;
							else if(request.buffer[3]==2)		 					//配置描述符上传
								VarSetupDescr=ConDes;
							else if(request.buffer[3]==0x22) {
								VarSetupDescr=Hid_des;
//								if ( request.buffer[2]== 0 ) VarSetupDescr=LangDes;
//								else VarSetupDescr=SerDes; 						//做字符串处理
							}
								mCh375DesUp();											//其余描述符不支持					          							
							break;
						case DEF_USB_GET_CONFIG:									//获得配置
							request.buffer[0]=0;									//没有配置则传0
							if(CH375CONFLAG) request.buffer[0]=1;									//已经配置则传1;这是在描述符里规定的
							break;
						case DEF_USB_SET_CONFIG:                 					//设置配置
							CH375CONFLAG=0;
							CH375ACT=1;
							if ( request.buffer[2] != 0 ) {
								CH375CONFLAG=1;											//设置配置标志
								CH375ACT=0;												//输出配置完成信号
							}
							break;
						case DEF_USB_GET_INTERF:										//得到接口
							request.buffer[0]=1;									//上传接口数,本事例只支持一个接口
							break;
						default :
							CH375FLAGERR=1;											//不支持的标准请求
							break;
					}
				}
			}
			else {  //不支持的控制传输,不是8字节的控制传输
				CH375FLAGERR=1;
			}
			if(!CH375FLAGERR) mCh375Ep0Up();										//没有错误/调用数据上传,,长度为0上传为状态
			else {
				CH375_WR_CMD_PORT(CMD_SET_ENDP3);								//设置端点1为STALL,指示一个错误
				CH375_WR_DAT_PORT(0x0F);
			}
			break;
		case   USB_INT_EP0_IN:													//控制端点上传成功
			if(mVarSetupRequest==DEF_USB_GET_DESCR){								//描述符上传
				mCh375DesUp();
				mCh375Ep0Up();															
			}
			else if(mVarSetupRequest==DEF_USB_SET_ADDRESS){							//设置地址
				CH375_WR_CMD_PORT(CMD_SET_USB_ADDR);
				CH375_WR_DAT_PORT(VarUsbAddress);								//设置USB地址,设置下次事务的USB地址
			}
			CH375_WR_CMD_PORT (CMD_UNLOCK_USB);								//释放缓冲区
			break;
		case   USB_INT_EP0_OUT:													//控制端点下传成功
			CH375_WR_CMD_PORT(CMD_RD_USB_DATA);									//发出读数据命令
			if(length=CH375_RD_DAT_PORT()){										//长度为0跳出
//				printf("len=%d\n",(unsigned int)length);
				for(len=0;len!=length;len++){buf1[len]=CH375_RD_DAT_PORT();					//取出下传数据
//					printf("buf=%02x",(unsigned short)buf1[len]);
				   }
			}
//			printf("\n");
			break;
		default:
			if((InterruptStatus&0x03)==0x03){									//总线复位
				CH375FLAGERR=0;													//错误清0
				CH375CONFLAG=0;													//配置清0
				mVarSetupLength=0;
				CH375ACT=1;														//清配置完成输出
			}
			else{																//命令不支持
				;
			}
			CH375_WR_CMD_PORT (CMD_UNLOCK_USB);									//释放缓冲区
			CH375_RD_DAT_PORT();
			break;
	}
}

up_data( )
{
	unsigned char i;

//	for(i=0;i!=8;i++)														//发送0按键值
//		buf[i]=0;
//		buf[2]=0x59;
		CH375_WR_CMD_PORT(CMD_WR_USB_DATA5);								//发出写上传端点命令
	    CH375_WR_DAT_PORT(8);
		for(i=0;i!=8;i++)
	     	CH375_WR_DAT_PORT(buf[i]);

}



main( ) {
    unsigned char data_flag=0;       //有无数据标志
    unsigned char i,time,k;
    unsigned char real_data[11];      //需要上传的数据缓冲区
    //unsigned char       hHD[6];
    unsigned long ulHex;
	unsigned char idata ucsenddata[11];
	unsigned char code uckeycode1[11]={	 0x62  //0           
									    ,0x59  //1 
										,0x5a  //2 
										,0x5b  //3
										,0x5c  //4
										,0x5d  //5
										,0x5e  //6
										,0x5f  //7
										,0x60  //8
										,0x61  //9
										,0x58
									    };
	SPK_P=1;
//SPK_P=1;
	Delay50ms( );
	Delay50ms( );
	Delay50ms( );
	Delay50ms( );


    RED_LED=0;
//	Delay50ms( );
//	Delay50ms( );
	GREEN_LED=1;
SPK_P=0;
	Delay50ms( );
	Delay50ms( );


	Delay50ms( );	// 延时等待CH375初始化完成,如果单片机由CH375提供复位信号则不必延时 //
	//mInitSTDIO( );
	CH375_Init( );  // 初始化CH375 //
    //EA=1;


 //启动后,不输出数据,
	//data_flag=1;
    up_time=0;  time=0;k=0;
    for(i=0;i<8;i++) buf[i]=0;

	////////
 	while(1){		// 主程序 //
  	 		  	
 		if(CH375_INT_WIRE == 0){
  SEND: 			mCH375Interrupt( ); 
			 
          if(data_flag==1) {
	            if((UPDATA_FLAG==0x01)&&(k<=1)){      //先发八个字节的0包,相当于确保按键的取消
	                 for(i=0;i<8;i++) buf[i]=0;
	                 up_data( );
	                 k++;
	             }
	
	            else {
		             if((UPDATA_FLAG==0x01)&&(time%2==1)){     //按键按下
						 if(up_time<=11){
			//                    printf("%d\n",(unsigned short)up_time);
				             buf[2]=real_data[up_time];                       //发送八个字节,相当于发送1个按键
						 	 up_data( ); 
			                 up_time++;                   
						 }	
		             }
		             else if((UPDATA_FLAG==0x01)&&(time%2==0)){  //按键取消
		                 for(i=0;i<8;i++) buf[i]=0;
		                 up_data( );
		             }
		             time++;
	            }
           }
           //if(up_time==11) { up_time=0;   data_flag=0;  goto RD;}        //循环上传     
           if(up_time>11) 
		   {
	         for(i=0;i<8;i++) buf[i]=0;
	         up_data( );
        	 data_flag=0; up_time=0; 
			 SPK_P=1;
			 RED_LED=1;
			 GREEN_LED=0;
			 Delay50ms( );
			 Delay50ms( );
			 RED_LED=0;
			 GREEN_LED=1;
			 Delay50ms( );
			 Delay50ms( );
			 //Delay50ms( );
			 //Delay50ms( );
			 SPK_P=0;

			 //蜂鸣器、LED 操作
			 goto SEND;
		   };
	   	}
	}
}


 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -