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

📄 usbmidi.c

📁 用keilC写的鼠标驱动程序
💻 C
📖 第 1 页 / 共 4 页
字号:
            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:  //用户请求
	   Prints("USB用户请求................................",1);
	   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 i,j;

 j=read_endpoint_buff(4,64,buffer);
 P2=~buffer[0];
 Prints("端点2输出................................",1);
 Prints("    端点2的数据是  ",0);
 for(i=0;i<j;i++)
  {
   PrintHex(buffer[i]);
   if(i==16)Prints("",1);
  }
 Prints("",1);
}
/******************************************************************************/


//用来返回数据的缓冲
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;
}
/******************************************************************************/
uint8 c;

/****************************主端点输入处理************************************/
void endp2_in(void)                                      
{
 uint8 i;
 Prints("端点2输入................................",1);
 for(i=0;i<4;i++)
  {
   InBuffer[i]=0;
  }
 KeyMapCanChange=0;  //禁止修改按键值
  
 if(KeyMapOk) //如果有按键按下
  {
   //4*4的键盘,最多能够识别3个键同时按下,
   //如果开关上接二极管可以同时识别更多的键
   if(Count1Bits(KeyMapOk)>3) 
    {
	 for(i=0;i<4;i++)InBuffer[i]=0x00;  //按键过多
	}
   else
    {	
	 if(KeyMapOk&(1))
	  {
	   InBuffer[0]|=0x02;  //右键
	  }
	 else
	  {
	  }

	 if(KeyMapOk&(1<<1))   //中键
	  {
	   InBuffer[0]|=0x04;
	  }
	 else
	  {
	  }


     if(KeyMapOk&(1<<2)) //左键
      {
       InBuffer[0]|=0x01;
      }
     else
      {
	  }

     if(KeyMapOk&(1<<3)) //未用
      {
      }
     else
      {
      }

	 if(KeyMapOk&(1<<4))  //向下滚
	  {
	   InBuffer[3]=-1;
	  }
	 else
	  {
	  }

	 if(KeyMapOk&(1<<5))  //向下移(Y轴增加)
	  {
	   InBuffer[2]=1;
	  }
	 else
	  {
	  }

	 if(KeyMapOk&(1<<6))  //未用
	  {
	  }
	 else
	  {
	  }

     if(KeyMapOk&(1<<7)) //未用
      {
      }
     else
      {
      }

	 if(KeyMapOk&(1<<8))   //往右移(X轴增加)
	  {
	   InBuffer[1]=1;
	  }
	 else
	  {
	  }

	 if(KeyMapOk&(1<<9))   //未用
	  {
	  }
	 else
	  {
	  }

	 if(KeyMapOk&(1<<10))  //往左移(X减小)
	  {
	   InBuffer[1]=-1;
	  }
	 else
	  {
	  }
	 
	 if(KeyMapOk&(1<<11))  //未用
	  {	    
	  }
	 else
	  {
	  }

	 if(KeyMapOk&(1<<12))  //往上滚
	  {
	   InBuffer[3]=1;
	  }
	 else
	  {
	  }

	 if(KeyMapOk&(1<<13))  //往上移(Y减小)
	  {
	   InBuffer[2]=-1;
	  }
	 else
	  {
	  }

	 if(KeyMapOk&(1<<14)) //未用
	  {
	  }
	 else
	  {
	  }
	 if(KeyMapOk&(1<<15))  //未用
	  {
	  }
	 else
	  {
	  }
	}
  }
 else //如果无按键按下,则返回0
  {
  }
 KeyMapCanChange=1; //允许修改按键值
 
 
//Note on
 InBuffer[0]=0x09;
 InBuffer[1]=0x90|c;
 InBuffer[2]=0x00;
 InBuffer[3]=0x64;
 
 while(!UartRflag);
 UartRflag=0;
 switch(UartData)
 {
  case '0': InBuffer[2]=55;break;   //5
  case '.': InBuffer[2]=57;break;   //6
  case 13:  InBuffer[2]=59;break;   //7  7和1之间一个半音
  case '1': InBuffer[2]=60;break;   //1  中央C  C大调的1
  case '2': InBuffer[2]=62;break;   //2
  case '3': InBuffer[2]=64;break;   //3
  case '4': InBuffer[2]=65;break;   //4  3和4之间一个半音
  case '5': InBuffer[2]=67;break;   //5
  case '6': InBuffer[2]=69;break;   //6
  case '7': InBuffer[2]=71;break;   //7
  case '8': InBuffer[2]=72;break;   //1
  case '9': InBuffer[2]=74;break;   //2
  case '+': InBuffer[2]=76;break;   //3
  case 'A': c++;c&=0x0f;break;
  case 'B': c--;c&=0x0f;break;
  case 'Z': InBuffer[0]=0x0C;InBuffer[1]=0xC0;InBuffer[2]=c;InBuffer[3]=0;break;
  default: InBuffer[2]=100;break;
 }
 //返回4个字节数据
 write_endpoint_buff(5,4,InBuffer);
 InBuffer[0]=0x09;
 InBuffer[1]=0x90|c;
// InBuffer[2]=0x00;
 InBuffer[3]=0x64;
 delay(100);
 InBuffer[3]=0x00;
 write_endpoint_buff(5,4,InBuffer);
}
/******************************************************************************/


/***************************主函数**********************************************/
void main(void)
{
 InitUART();  //串口初始化
 
 /*
 T2CON=0x10;
 TR2=1;
 RCAP2H=0xFF;
 RCAP2L=0xEA;
 while(1);
 */
 
 Printc(0x0c);  //清屏
 Printc(0x0c);
 Prints("系统启动................................",1);
 delay(1000);	 //延迟
 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.port_out_1)endp1_out();
//	 if(Interrupt_Register.Interrupt.port_in_1)endp1_in();
	 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 + -