亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? usbkeyboard.c

?? 自制USB鍵盤,含源碼,原理圖 用了一個4*4的小鍵盤,有0-9十個數字鍵, Num Lock鍵,Caps Lock鍵,Shift鍵,Ctrl鍵,Alt鍵,回車鍵等。 最多可以有三個鍵同時按下
?? C
?? 第 1 頁 / 共 3 頁
字號:
 return len;
}
/******************************************************************************/

/***************************斷開USB連接****************************************/
void disconnect_usb(void)
{
 Prints("斷開USB連接........................",1);
 write_usb_command(0xf3);
 write_a_usb_data(0x0e);
 write_a_usb_data(0x47);
 delay(100);
}
/******************************************************************************/

/*******************************連接USB**************************************/
void connect_usb(void)
{
 Prints("連接USB...............",1);
 write_usb_command(0xf3);                         //初始化USBD12
 write_a_usb_data(0x1e);                          //連接USB
 write_a_usb_data(0x47);                          //設置頻率
}
/******************************************************************************/

/***************************初始化USB***************************************************/
void init_usb(void)               
{
 Prints("USBD12芯片初始化",1);
 set_usb_addr(0);
 set_endpoint_enable();
}
/******************************************************************************/

/****************************USB總線復位處理***********************************/
void usb_bus_reset(void)
{
 Prints("USB總線復位................................",1);
 usb_flags.Register=0;
 set_endpoint_enable();
}
/******************************************************************************/

/*****************************USB總線掛起處理**********************************/
void usb_bus_suspend(void)
{
 Prints("USB總線掛起................................",1);
}
/******************************************************************************/

/***************************設置地址***************************************/
void set_usb_address(void)
{
 usb_flags.flags.set_addr=1;
 while(select_endpoint(1)&0x01);
 write_endpoint_buff(1,0,0);
 set_usb_addr(Control_Data.DeviceRequest.wValue);
 usb_flags.flags.usb_endp0_in=0;
 usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/

/**************************獲取狀態響應*****************************************/
void get_status(uint8 receiver)
{
 uint8 status[2];
 switch (receiver)
  {
   case 0:                        //獲取設備狀態
    status[0]=0x00;
    status[1]=0x00;
    break;
   case 1:                        //獲取接口狀態
    status[0]=0x00;
    status[0]=0x00;
    break;
   case 2:                        //獲取端點狀態
    status[0]=0x00;
    status[1]=0x00;
    break;
   }
  write_endpoint_buff(1,2,status);
  usb_flags.flags.usb_endp0_in=0;
}
/******************************************************************************/

/*********************清除特性*******************************************/
void clear_feature(uint8 receiver)    
{
 Prints("    清除特性................................",1);
 receiver=0;
 write_endpoint_buff(1,0,0);
 usb_flags.flags.usb_endp0_in=0;
 usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/

/*******************設置特性**************************************************/
void set_feature(uint8 receiver)
{
 Prints("    設置特性................................",1);
 receiver=0;
 write_endpoint_buff(1,0,0);
 usb_flags.flags.usb_endp0_in=0;
 usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/

/*****************************設置描述*****************************************/
void set_descriptor(void)
{
 Prints("    設置描述符................................",1);
 usb_flags.flags.usb_endp0_in=0;
 usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/

/***************************設置配置*******************************************/
void set_configuration(void)
{
 Prints("    設置配置................................",1);
 write_endpoint_buff(1,0,0);
 usb_flags.flags.usb_endp0_in=0;
 usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/

/************************獲取配置狀態******************************************/
void get_configuration(void)
{ 
 uint8 value=0x01;
 Prints("    獲取配置................................",1);
 write_endpoint_buff(1,1,&value);
 usb_flags.flags.usb_endp0_in=0;
}
/******************************************************************************/

/****************************設置接口************************************/
void set_interface(void)
{
 Prints("    設置接口................................",1);
 write_endpoint_buff(1,0,0);
 usb_flags.flags.usb_endp0_in=0;
 usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/

/***************************獲取接口狀態***************************************/
void get_interface(void)
{
 uint8 value=0x01;
 Prints("    獲取接口................................",1);
 write_endpoint_buff(1,1,&value);
 usb_flags.flags.usb_endp0_in=0;
}
/******************************************************************************/

/***********************獲取描述符*********************************************/
void get_descriptor(void)
{
 Prints("    獲取描述符................................",1);
  if(!usb_flags.flags.not_end)
     {
      switch(MSB(Control_Data.DeviceRequest.wValue))
	   {
        case DEVICE_DESCRIPTOR:
		     Prints("        獲取設備描述符................................",1);
	         Control_Data.wCount=sizeof(DEVICE_DESCRIPTOR_STRUCT);
 	         Control_Data.pData=(uint8 *)(&device_descriptor);
             break;
        case CONFIGURATION_DESCRIPTOR:
			 Prints("        獲取配置描述符................................",1);
             Control_Data.wCount=SWAP16(con_int_endp_descriptor.configuration_descriptor.wTotalLength);
			 Control_Data.pData=(uint8 *)(&con_int_endp_descriptor);
             if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
             break;
		case STRING_DESCRIPTOR:
		     Prints("        獲取字符串描述符................................",1);
			 switch(LSB(Control_Data.DeviceRequest.wValue))
			  {
			   case 0:
			    Prints("            獲取語言ID................................",1);
			    Control_Data.wCount=LANGUAGE_ID[0];
                Control_Data.pData=LANGUAGE_ID;
   			    break;

			   case 1:
			    Prints("            獲取廠商字符串................................",1);
			    Control_Data.wCount=ManufacturerString[0];
                Control_Data.pData=ManufacturerString;
			    break;

			   case 2:
			    Prints("            獲取產品字符串................................",1);
			    Control_Data.wCount=ProducterString[0];
                Control_Data.pData=ProducterString;
			    break;

			   case 3:
                 Prints("            獲取設備序列號................................",1);
			     Control_Data.wCount=device_serial_number[0];
			     Control_Data.pData=device_serial_number;
			   break;

			   default: break;
			  }
			 break;
		 default:
		     Prints("       獲取其它描述符..................描述符索引為:",0);
			 PrintLongInt(MSB(Control_Data.DeviceRequest.wValue));
			 Prints("",1); 
		  break;
	   	}
      if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
	 }
	//寫數據到D12輸入端點
    if(Control_Data.wCount>=MAX_CONTROL_DATA_SIZE)
     {
	  write_endpoint_buff(1,MAX_CONTROL_DATA_SIZE,Control_Data.pData);
	  Control_Data.pData+=MAX_CONTROL_DATA_SIZE;
      Control_Data.wCount-=MAX_CONTROL_DATA_SIZE;
	  if(usb_flags.flags.set_addr)usb_flags.flags.not_end=1;
	   else usb_flags.flags.usb_endp0_in=0;
	  return;
	 }
    else
     {
	  write_endpoint_buff(1,Control_Data.wCount,Control_Data.pData);
      usb_flags.flags.setup_packet_in=0;
	  usb_flags.flags.usb_endp0_in=0;
	  return;
	 }      
}
/******************************************************************************/

/*********************發到接口的獲取描述符**************************************/
void get_descriptor_interface(void)
{
 Prints("    獲取描述符(從接口)..............................",1);
  if(!usb_flags.flags.not_end)
     {
      switch(MSB(Control_Data.DeviceRequest.wValue))
	   {
        case HID_DESCRIPTOR:
		     Prints("        獲取HID描述符................................",1);
	         Control_Data.wCount=sizeof(HID_DESCRIPTOR_STRUCT);
 	         //Control_Data.pData=(uint8 *)(&hid_descriptor);
             break;
        case REPORT_DESCRIPTOR:
			 Prints("        獲取報告描述符................................",1);
             Control_Data.wCount=SWAP16(sizeof(KeyBoardReportDescriptor));
			 Control_Data.pData=(uint8 *)(KeyBoardReportDescriptor);
             if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
             break;
		case PHYSICAL_DESCRIPTOR:
		     Prints("        獲取物理描述符................................",1);
			 break;
		 default:
		     Prints("       獲取其它描述符..................描述符索引為:",0);
			 PrintLongInt(MSB(Control_Data.DeviceRequest.wValue));
			 Prints("",1); 
		  break;
	   	}
      if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
	 }
	//寫數據到D12輸入端點
    if(Control_Data.wCount>=MAX_CONTROL_DATA_SIZE)
     {
	  write_endpoint_buff(1,MAX_CONTROL_DATA_SIZE,Control_Data.pData);
	  Control_Data.pData+=MAX_CONTROL_DATA_SIZE;
      Control_Data.wCount-=MAX_CONTROL_DATA_SIZE;
	  if(usb_flags.flags.set_addr)usb_flags.flags.not_end=1;
	   else usb_flags.flags.usb_endp0_in=0;
	  return;
	 }
    else
     {
	  write_endpoint_buff(1,Control_Data.wCount,Control_Data.pData);
      usb_flags.flags.setup_packet_in=0;
	  usb_flags.flags.usb_endp0_in=0;
	  return;
	 }      
}
/******************************************************************************/

/************************終端點0輸出中斷處理************************************/
void endp0_out(void)
{
 Last_Status.Register=read_last_status(0);
 if(Last_Status.Status.setup_packet)
  {
   Control_Data.wLength=0;
   Control_Data.wCount=0;
   if(read_endpoint_buff(0,sizeof(Control_Data.DeviceRequest),(uint8 *)(&(Control_Data.DeviceRequest)))!=sizeof(REQUESTCMD))
    {
	 set_endpoint_status(0,0);
	 set_endpoint_status(1,0);
	 return;
	}
  Control_Data.DeviceRequest.wValue=SWAP16(Control_Data.DeviceRequest.wValue);
  Control_Data.DeviceRequest.wIndex=SWAP16(Control_Data.DeviceRequest.wIndex);
  Control_Data.DeviceRequest.wLength=SWAP16(Control_Data.DeviceRequest.wLength);

  ack_setup(0);
  ack_setup(1);
  Control_Data.wLength=Control_Data.DeviceRequest.wLength;
  usb_flags.flags.not_end=0;
  usb_flags.flags.usb_endp0_in=1;
  usb_flags.flags.setup_packet_in=0;
  usb_flags.flags.setup_packet_out=0;
  if(Control_Data.DeviceRequest.bmRequestType&0x80){usb_flags.flags.setup_packet_in=1;return;}
  else {usb_flags.flags.setup_packet_out=1;return;}
 }
 else
  {
   select_endpoint(0);
   clear_buffer();
  }
}
/******************************************************************************/

/***********************獲取報告*********************************************/
void get_report(void)
{
 Prints("        獲取報告................................",1);
}
/******************************************************************************/

/**********************獲取空閑狀態*********************************************/
void get_idle(void)
{
 Prints("    獲取空閑................................",1);
 write_endpoint_buff(1,1,&idle);
 usb_flags.flags.usb_endp0_in=0;
}
/******************************************************************************/

/*************************獲取協議**********************************************/
void get_protocol(void)
{
 Prints("    獲取協議................................",1);
 write_endpoint_buff(1,1,&protocol);
 usb_flags.flags.usb_endp0_in=0;
}
/******************************************************************************/

/***********************設置報告***********************************************/
void set_report(void)
{
 Prints("    設置報告................................",1);
}
/******************************************************************************/

/***********************設置空閑***********************************************/
void set_idle(void)
{
 Prints("    設置空閑................................",1);
 while(select_endpoint(1)&0x01);
 write_endpoint_buff(1,0,0);
 idle=Control_Data.DeviceRequest.wValue;
 usb_flags.flags.usb_endp0_in=0;
 usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/

/**********************設置協議**************************************************/
void set_protocol(void)
{
 Prints("    設置協議................................",1);
 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)
{
 read_last_status(1);
 //如果是輸入請求包
 if(usb_flags.flags.setup_packet_in||usb_flags.flags.not_end)
  {
    switch(Control_Data.DeviceRequest.bmRequestType&0x60)
	 {
	   case 0x00:  //標準請求
	   Prints("USB標準請求................................",1);
	   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:  //到接口

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
视频一区中文字幕| 欧美一级生活片| 日韩一区二区三区免费观看| 国产欧美一区二区三区网站| 亚洲午夜在线电影| 暴力调教一区二区三区| 欧美sm美女调教| 视频一区视频二区中文| jlzzjlzz亚洲日本少妇| 久久综合一区二区| 亚洲成人免费在线观看| 成人av综合在线| 久久精品一区蜜桃臀影院| 日韩av一区二区在线影视| 欧美综合色免费| 亚洲三级小视频| jlzzjlzz欧美大全| 欧美激情综合五月色丁香| 韩国欧美一区二区| 日韩欧美中文一区| 日韩中文字幕1| 欧美顶级少妇做爰| 亚洲国产欧美一区二区三区丁香婷| 成人爽a毛片一区二区免费| 国产亚洲精品7777| 国产精品一区二区三区四区 | 亚洲高清视频中文字幕| 99国产精品久久久久| 国产精品蜜臀在线观看| 成人国产精品免费网站| 国产人成亚洲第一网站在线播放 | 一区二区三区高清| 99在线精品免费| 综合激情网...| 9久草视频在线视频精品| 国产精品欧美精品| 91婷婷韩国欧美一区二区| 日韩一区有码在线| 91福利视频久久久久| 亚洲123区在线观看| 69av一区二区三区| 精品一区二区三区欧美| 久久久精品国产99久久精品芒果 | 欧美一区二区精美| 麻豆视频观看网址久久| 久久在线观看免费| 成人免费av在线| 亚洲人123区| 欧美丝袜第三区| 久久精品国产亚洲一区二区三区| 欧美一区二区三区婷婷月色| 看国产成人h片视频| 久久嫩草精品久久久精品| 不卡在线观看av| 亚洲精品国产一区二区三区四区在线 | 亚洲高清视频中文字幕| 欧美一区二区三区在线视频| 国产毛片精品一区| 综合欧美亚洲日本| 91精品国产高清一区二区三区 | 欧美电影免费观看高清完整版在 | 日韩美女视频在线| 波多野结衣中文一区| 亚洲专区一二三| 久久亚区不卡日本| 色综合久久久久| 久久99国产精品麻豆| 国产精品成人在线观看| 91精品国产欧美日韩| 成人免费视频一区二区| 日韩高清不卡在线| 国产精品毛片a∨一区二区三区| 在线观看欧美日本| 国产精品一区二区果冻传媒| 亚洲综合色成人| 久久久不卡网国产精品二区| 在线看一区二区| 国产一区二区看久久| 亚洲尤物在线视频观看| 久久久99久久| 欧美一区中文字幕| 色综合网色综合| 国产高清不卡一区| 日本在线观看不卡视频| 亚洲女同一区二区| 国产视频一区在线播放| 日韩视频一区二区三区| 在线视频综合导航| 成人免费视频视频在线观看免费| 日本女人一区二区三区| 亚洲在线观看免费视频| 国产精品理伦片| 26uuu久久天堂性欧美| 欧美色网站导航| 99精品国产91久久久久久| 国产自产v一区二区三区c| 青青草原综合久久大伊人精品优势| 亚洲视频 欧洲视频| 国产亚洲精品资源在线26u| 欧美一区二区三区四区久久| 欧美午夜精品久久久| 99麻豆久久久国产精品免费优播| 国产精品一区久久久久| 久久疯狂做爰流白浆xx| 美女诱惑一区二区| 男女男精品视频网| 青娱乐精品视频在线| 日韩精品一级中文字幕精品视频免费观看 | 欧美日韩免费观看一区二区三区 | 蜜桃91丨九色丨蝌蚪91桃色| 午夜精彩视频在线观看不卡| 亚洲一区二区三区不卡国产欧美| 亚洲四区在线观看| 亚洲日本在线看| 亚洲综合男人的天堂| 亚洲国产成人高清精品| 亚洲bt欧美bt精品| 日韩av一级片| 久久成人免费网| 国产一区二区三区免费观看| 国产一区二区精品久久| 国产成人av一区二区三区在线观看| 国产精品综合av一区二区国产馆| 久久狠狠亚洲综合| 九九精品视频在线看| 国产一区二区0| 成人免费高清在线观看| 色综合夜色一区| 欧美性大战xxxxx久久久| 欧美日韩高清一区二区| 日韩一区二区三区观看| 国产亚洲精品福利| 亚洲欧美国产三级| 日本视频免费一区| 国产原创一区二区| 99免费精品在线观看| 欧美性做爰猛烈叫床潮| 日韩精品中文字幕一区二区三区| 久久久另类综合| 夜夜揉揉日日人人青青一国产精品| 天堂av在线一区| 国产成人av资源| 欧美影院一区二区| 精品国产青草久久久久福利| 国产精品久久久久影院| 爽好多水快深点欧美视频| 国产精品一二三| 91成人在线精品| 久久综合色播五月| 一区二区三区四区视频精品免费| 五月天激情小说综合| 丁香另类激情小说| 欧美精品乱码久久久久久 | 国产精品小仙女| 欧美性猛交xxxxxx富婆| 精品粉嫩超白一线天av| 一区二区三区电影在线播| 久久99蜜桃精品| 日本道免费精品一区二区三区| 日韩无一区二区| 亚洲男同性恋视频| 久久99久久99| 欧美视频在线一区二区三区 | 国产精品中文欧美| 欧美三级韩国三级日本三斤| 国产欧美日韩久久| 婷婷开心久久网| 91视视频在线观看入口直接观看www | 在线观看日韩精品| 中文字幕欧美激情一区| 日韩高清不卡一区二区| 91麻豆国产福利在线观看| 精品国产乱码久久久久久免费 | 热久久一区二区| 在线观看91视频| 中文字幕在线不卡一区| 久久国产夜色精品鲁鲁99| 色老汉一区二区三区| 国产精品久久久久aaaa樱花 | 国产三级精品三级在线专区| 日韩电影免费在线观看网站| 色婷婷综合激情| 中文字幕亚洲在| 风流少妇一区二区| 国产性色一区二区| 韩国v欧美v日本v亚洲v| 日韩写真欧美这视频| 亚洲mv大片欧洲mv大片精品| 在线观看视频一区二区| 亚洲视频一区二区在线| caoporm超碰国产精品| 国产精品污网站| 懂色av中文字幕一区二区三区| 久久亚洲精品小早川怜子| 激情欧美日韩一区二区| 久久女同互慰一区二区三区| 国产在线精品国自产拍免费| 26uuu国产在线精品一区二区| 美女网站色91| 久久综合九色综合97_久久久|