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

📄 usbkeyboard.c

📁 基于51和D12实现电脑的红外遥控
💻 C
📖 第 1 页 / 共 3 页
字号:
/**********************设置协议**************************************************/
void set_protocol(void)
{
 while(select_endpoint(1)&0x01);
 write_endpoint_buff(1,0,0);
 protocol=Control_Data.DeviceRequest.wValue;
 usb_flags.flags.usb_endp0_in=0;
 usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/

/****************************端点0输入处理**************************************/
void endp0_in(void) 
//输入处理必须是先有一个设置命令或者数据处理才可以 
//所谓的输入处理,也是先由主机发出一个IN命令,然后才有设备将主机所需的数据发送到主机 
{
 read_last_status(1);
 //如果是输入请求包
 if(usb_flags.flags.setup_packet_in||usb_flags.flags.not_end)
  {
    switch(Control_Data.DeviceRequest.bmRequestType&0x60)
	 {
	   case 0x00:  //标准请求
	   switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
	    {
		 case 0: //到设备
		   switch (Control_Data.DeviceRequest.bRequest)
		    {
		     case 0: get_status(0);break;
		     case 6: get_descriptor();break;
		     case 8: get_configuration();break;
			 default:break;
		    }
		 break;

		 case 1:  //到接口
		   switch (Control_Data.DeviceRequest.bRequest)
		    {
	         case  0: get_status(1);break;
			 case 6: get_descriptor_interface();break;	//同样是获得设备的标准描述符 
		     case 10: get_interface();break;
	         default: break;
			}
		 break;

		 case 2:  //到端点
		  {
	       if(Control_Data.DeviceRequest.bRequest==0)
		       get_status(2);  
		  }
		 default: break;
	    }
	   break;

	   case 0x20:  //类请求
	   switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
	    {
		 case 0:  //到设备
		   switch (Control_Data.DeviceRequest.bRequest)
		    {
			 default:break;
		    }
		 break;

		 case 1:  //到接口
		   switch (Control_Data.DeviceRequest.bRequest)
		    {

	  		 case   GET_REPORT: get_report();   break; //获取报告
             case     GET_IDLE: get_idle();     break; //获取空闲状态
             case GET_PROTOCOL: get_protocol(); break; //获取协议
	         default: break;
			}
		 break;

		 case 2:  //到端点
		  {
		   switch (Control_Data.DeviceRequest.bRequest)
		    {
	         default: break;
			}  
		  }
		 default: break;
	    }
	   break;

	   case 0x40:  //用户请求
	   switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
	    {
		 case 0:  //到设备
		   switch (Control_Data.DeviceRequest.bRequest)
		    {
			 default: break;
		    }
	     break;

		 case 1:   //到接口
		   switch (Control_Data.DeviceRequest.bRequest)
		    {
	         default: break;
			}
         break;

		 case 2:  //到端点
		  {
		   switch (Control_Data.DeviceRequest.bRequest)
		    {
	         default: break;
			}  
		  }
		 default: break;
	    }
	}
    return;
  }

  //如果是输出请求包
 if(usb_flags.flags.setup_packet_out) 
  {
    switch(Control_Data.DeviceRequest.bmRequestType&0x60)
	 {
	   case 0x00:  //标准请求
	   switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
	    {
		 case 0:   //到设备
	     switch (Control_Data.DeviceRequest.bRequest)
	      {
		   case     CLEAR_FEATURE: clear_feature(0);break;
		   case       SET_FEATURE: set_feature(0);break;
		   case       SET_ADDRESS: set_usb_address();break;          //set_address	           
		   case    SET_DESCRIPTOR: set_descriptor();break;           //set_descriptor
		   case SET_CONFIGURATION: set_configuration(); break;       //set_configurat               	          
	  	   default: break;
		  }
		 break;
		 
		 case 1:   //到接口
	      switch (Control_Data.DeviceRequest.bRequest)
		   {
		    case CLEAR_FEATURE:  clear_feature(1);break;
		    case   SET_FEATURE:  set_feature(1); break;
	        case SET_INTERFACE: set_interface();break;
		    default: break;
	        }
		 break;
		 
		 case 2:   //到端点
		  switch (Control_Data.DeviceRequest.bRequest)
		   {
		    case CLEAR_FEATURE: clear_feature(2);break;
		    case   SET_FEATURE: set_feature(2);break;
	        default: break;      
		   }
		 break;

		 default: break;
	    }
      break;

	  case 0x20:  //类请求
	   switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
	    {
		 case 0:    //接收者为设备
	     switch (Control_Data.DeviceRequest.bRequest)
	      {             	          
	  	   default: break;
		  }
		 break;

		 case 1:   //接收者为接口
	      switch (Control_Data.DeviceRequest.bRequest)
		   {
            case   SET_REPORT: set_report();   break; //设置报告
            case     SET_IDLE: set_idle();     break; //设置空闲
            case SET_PROTOCOL: set_protocol(); break; //设置协议
		    default: break;
	        }
		 
		 break;

		 case 2:   //接收者为端点
		  switch (Control_Data.DeviceRequest.bRequest)
		   {
	        default: break;      
		   }
		 break;
		 
		 case 3: //其它接收者
		  switch (Control_Data.DeviceRequest.bRequest)
		   {
	        default: break;      
		   }break;
		   		  
		 default: break;
	    }      
	   break;

       case 0x40:  //用户请求
	   
	   switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
	    {
		 case 0:    //接收者为设备
	     switch (Control_Data.DeviceRequest.bRequest)
	      {             	          
	  	   default: break;
		  }
		 break;
		 
		 case 1:   //接收者为接口
	      switch (Control_Data.DeviceRequest.bRequest)
		   {
		    default: break;
	        }
	     break;
		 
		 case 2:   //接收者为端点
		  switch (Control_Data.DeviceRequest.bRequest)
		   {
	        default: break;      
		   }
		 break;
		 
		 case 3: //其它接收者
		  switch (Control_Data.DeviceRequest.bRequest)
		   {
	        default: break;      
		   }		   
		 break;
		   		  
		 default: break;
	    }
	}
  }
}
/******************************************************************************/

/**********************端点1输出***********************************************/
/*void endp1_out(void)
{
 Prints("端点1输出................................",1);
}*/
/******************************************************************************/

/*************************端点1输入*****************************************/
/*void endp1_in(void)
{
 Prints("端点1输入................................",1);
}*/
/******************************************************************************/

/***************************端点2输出****************************************/
void endp2_out(void)
{

}
/******************************************************************************/


//用来返回数据的缓冲
uint8 idata InBuffer[64];

/***************************统计x中有多少个bit为1*******************************/
uint8 Count1Bits(uint16 x)
{
 uint8 i;

 i=0;
 while(x)
  {
   if(x&0x8000)i++;
   x<<=1;
  }
 return i;
}
/******************************************************************************/

/****************************主端点输入处理************************************/
void endp2_in(void)                                      
{
 uint8 i;
 for(i=0;i<8;i++)
 {
   InBuffer[i]=0;
 }
// Prints("端点2输入................................",1);
 KeyMapCanChange=0;  //禁止修改按键值 
 if(KeyMapOk) //如果有按键按下
  {
	 switch(KeyMapOk)
	 {
	     case 0x01:	InBuffer[2]=0x4f;
		            break;
		 case 0x02:	InBuffer[2]=0x50;
		            break;
		 case 0x04:	InBuffer[2]=0x28;
		            break;
		 case 0x08:	InBuffer[2]=0x3d;
		            InBuffer[0]|=1<<2;
		            break;
	 }
  }
 else //如果无按键按下,则返回0
  {
   for(i=0;i<8;i++)
    {
	 InBuffer[i]=0;
	}
  }
 KeyMapCanChange=1; //允许修改按键值
//返回8个字节数据
 write_endpoint_buff(5,8,InBuffer);
}
/******************************************************************************/


/***************************主函数**********************************************/
void main(void)
{
 disconnect_usb(); 	   //断开USB连接
 init_usb();		   //初始化USB芯片
 connect_usb();		   //连接USB
 InitTimer0();  //定时器0初始化,用来做键盘扫描,定时时间大约为5ms
 KeyMapCanChange=1;
 while(1)
  { 
   if(!USB_INT)		//硬件实现 
    {
  	 read_interrupt_register();
	 if(Interrupt_Register.Interrupt.bus_reset)
         {
          usb_bus_reset();
          continue;
         }
	 if(Interrupt_Register.Interrupt.suspend_change)
	     {
	        usb_bus_suspend();
			continue;
		 }
     if(Interrupt_Register.Interrupt.control_out_port)
	     {
		    endp0_out();	  //输出和输入是相对于电脑而言的 
			continue;
		 }
	 if(Interrupt_Register.Interrupt.control_in_port&&usb_flags.flags.usb_endp0_in)
	     {
		    endp0_in();
		    continue;
		 }
	 if(Interrupt_Register.Interrupt.main_out_port)
	     {
		    endp2_out();
		 }
	 if(Interrupt_Register.Interrupt.main_in_port)
	     {
		    endp2_in();
		 }
    }
  }
}
/******************************************************************************/

⌨️ 快捷键说明

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