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

📄 usbmouse.lst

📁 STC89C52单片机平台上实现用外线通讯并能与PC实现USB的通讯
💻 LST
📖 第 1 页 / 共 4 页
字号:
 944   4      		   {
 945   5                  case   SET_REPORT: set_report();   break; //设置报告
 946   5                  case     SET_IDLE: set_idle();     break; //设置空闲
 947   5                  case SET_PROTOCOL: set_protocol(); break; //设置协议
 948   5      		    default: break;
 949   5      	        }
 950   4      		 
 951   4      		 break;
 952   4      
 953   4      		 case 2:   //接收者为端点
 954   4      		  switch (Control_Data.DeviceRequest.bRequest)
 955   4      		   {
 956   5      	        default: break;      
 957   5      		   }
 958   4      		 break;
 959   4      		 
 960   4      		 case 3: //其它接收者
 961   4      		  switch (Control_Data.DeviceRequest.bRequest)
 962   4      		   {
 963   5      	        default: break;      
 964   5      		   }break;
 965   4      		   		  
 966   4      		 default: break;
 967   4      	    }      
 968   3      	   break;
 969   3      
 970   3             case 0x40:  //用户请求
 971   3      	   Prints("USB用户请求................................",1);
 972   3      	   switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
 973   3      	    {
 974   4      		 case 0:    //接收者为设备
 975   4      	     switch (Control_Data.DeviceRequest.bRequest)
 976   4      	      {             	          
 977   5      	  	   default: break;
 978   5      		  }
 979   4      		 break;
 980   4      		 
 981   4      		 case 1:   //接收者为接口
 982   4      	      switch (Control_Data.DeviceRequest.bRequest)
 983   4      		   {
C51 COMPILER V6.12  USBMOUSE                                                               09/21/2007 12:44:30 PAGE 17  

 984   5      		    default: break;
 985   5      	        }
 986   4      	     break;
 987   4      		 
 988   4      		 case 2:   //接收者为端点
 989   4      		  switch (Control_Data.DeviceRequest.bRequest)
 990   4      		   {
 991   5      	        default: break;      
 992   5      		   }
 993   4      		 break;
 994   4      		 
 995   4      		 case 3: //其它接收者
 996   4      		  switch (Control_Data.DeviceRequest.bRequest)
 997   4      		   {
 998   5      	        default: break;      
 999   5      		   }		   
1000   4      		 break;
1001   4      		   		  
1002   4      		 default: break;
1003   4      	    }
1004   3      	}
1005   2        }
1006   1      }
1007          /******************************************************************************/
1008          
1009          /**********************端点1输出***********************************************/
1010          /*void endp1_out(void)
1011          {
1012           Prints("端点1输出................................",1);
1013          }*/
1014          /******************************************************************************/
1015          
1016          /*************************端点1输入*****************************************/
1017          /*void endp1_in(void)
1018          {
1019           Prints("端点1输入................................",1);
1020          }*/
1021          /******************************************************************************/
1022          
1023          /***************************端点2输出****************************************/
1024          void endp2_out(void)
1025          {
1026   1       uint8 i,j;
1027   1      
1028   1       j=read_endpoint_buff(4,64,buffer);
1029   1       P2=~buffer[0];
1030   1       Prints("端点2输出................................",1);
1031   1       Prints("    端点2的数据是  ",0);
1032   1       for(i=0;i<j;i++)
1033   1        {
1034   2         PrintHex(buffer[i]);
1035   2         if(i==16)Prints("",1);
1036   2        }
1037   1       Prints("",1);
1038   1      }
1039          /******************************************************************************/
1040          
1041          
1042          //用来返回数据的缓冲
1043          uint8 idata InBuffer[64];
1044          
1045          /***************************统计x中有多少个bit为1*******************************/
C51 COMPILER V6.12  USBMOUSE                                                               09/21/2007 12:44:30 PAGE 18  

1046          uint8 Count1Bits(uint16 x)
1047          {
1048   1       uint8 i;
1049   1      
1050   1       i=0;
1051   1       while(x)
1052   1        {
1053   2         if(x&0x8000)i++;
1054   2         x<<=1;
1055   2        }
1056   1       return i;
1057   1      }
1058          /******************************************************************************/
1059          
1060          /****************************主端点输入处理************************************/
1061          void endp2_in(void)                                      
1062          {
1063   1       uint8 i;
1064   1      // Prints("端点2输入................................",1);
1065   1       for(i=0;i<4;i++)
1066   1        {
1067   2         InBuffer[i]=0;
1068   2        }
1069   1       KeyMapCanChange=0;  //禁止修改按键值
1070   1        
1071   1       if(KeyMapOk) //如果有按键按下
1072   1        {
1073   2         //4*4的键盘,最多能够识别3个键同时按下,
1074   2         //如果开关上接二极管可以同时识别更多的键
1075   2         if(Count1Bits(KeyMapOk)>3) 
1076   2          {
1077   3      	 for(i=0;i<4;i++)InBuffer[i]=0x00;  //按键过多
1078   3      	}
1079   2         else
1080   2          {	
1081   3      	 if(KeyMapOk&(1))
1082   3      	  {
1083   4      	   InBuffer[0]|=0x02;  //右键
1084   4      	  }
1085   3      	 else
1086   3      	  {
1087   4      	  }
1088   3      
1089   3      	 if(KeyMapOk&(1<<1))   //中键
1090   3      	  {
1091   4      	   InBuffer[0]|=0x04;
1092   4      	  }
1093   3      	 else
1094   3      	  {
1095   4      	  }
1096   3      
1097   3      
1098   3           if(KeyMapOk&(1<<2)) //左键
1099   3            {
1100   4             InBuffer[0]|=0x01;
1101   4            }
1102   3           else
1103   3            {
1104   4      	  }
1105   3      
1106   3           if(KeyMapOk&(1<<3)) //未用
1107   3            {
C51 COMPILER V6.12  USBMOUSE                                                               09/21/2007 12:44:30 PAGE 19  

1108   4            }
1109   3           else
1110   3            {
1111   4            }
1112   3      
1113   3      	 if(KeyMapOk&(1<<4))  //向下滚
1114   3      	  {
1115   4      	   InBuffer[3]=-1;
1116   4      	  }
1117   3      	 else
1118   3      	  {
1119   4      	  }
1120   3      
1121   3      	 if(KeyMapOk&(1<<5))  //向下移(Y轴增加)
1122   3      	  {
1123   4      	   InBuffer[2]=1;
1124   4      	  }
1125   3      	 else
1126   3      	  {
1127   4      	  }
1128   3      
1129   3      	 if(KeyMapOk&(1<<6))  //未用
1130   3      	  {
1131   4      	  }
1132   3      	 else
1133   3      	  {
1134   4      	  }
1135   3      
1136   3           if(KeyMapOk&(1<<7)) //未用
1137   3            {
1138   4            }
1139   3           else
1140   3            {
1141   4            }
1142   3      
1143   3      	 if(KeyMapOk&(1<<8))   //往右移(X轴增加)
1144   3      	  {
1145   4      	   InBuffer[1]=1;
1146   4      	  }
1147   3      	 else
1148   3      	  {
1149   4      	  }
1150   3      
1151   3      	 if(KeyMapOk&(1<<9))   //未用
1152   3      	  {
1153   4      	  }
1154   3      	 else
1155   3      	  {
1156   4      	  }
1157   3      
1158   3      	 if(KeyMapOk&(1<<10))  //往左移(X减小)
1159   3      	  {
1160   4      	   InBuffer[1]=-1;
1161   4      	  }
1162   3      	 else
1163   3      	  {
1164   4      	  }
1165   3      	 
1166   3      	 if(KeyMapOk&(1<<11))  //未用
1167   3      	  {	    
1168   4      	  }
1169   3      	 else
C51 COMPILER V6.12  USBMOUSE                                                               09/21/2007 12:44:30 PAGE 20  

1170   3      	  {
1171   4      	  }
1172   3      
1173   3      	 if(KeyMapOk&(1<<12))  //往上滚
1174   3      	  {
1175   4      	   InBuffer[3]=1;
1176   4      	  }
1177   3      	 else
1178   3      	  {
1179   4      	  }
1180   3      
1181   3      	 if(KeyMapOk&(1<<13))  //往上移(Y减小)
1182   3      	  {
1183   4      	   InBuffer[2]=-1;
1184   4      	  }
1185   3      	 else
1186   3      	  {
1187   4      	  }
1188   3      
1189   3      	 if(KeyMapOk&(1<<14)) //未用
1190   3      	  {
1191   4      	  }
1192   3      	 else
1193   3      	  {
1194   4      	  }
1195   3      	 if(KeyMapOk&(1<<15))  //未用
1196   3      	  {
1197   4      	  }
1198   3      	 else
1199   3      	  {
1200   4      	  }
1201   3      	}
1202   2        }
1203   1       else //如果无按键按下,则返回0
1204   1        {
1205   2        }
1206   1       KeyMapCanChange=1; //允许修改按键值
1207   1      //返回4个字节数据
1208   1       write_endpoint_buff(5,4,InBuffer);
1209   1      }
1210          /******************************************************************************/
1211          
1212          
1213          /***************************主函数**********************************************/
1214          void main(void)
1215          {
1216   1       InitUART();  //串口初始化
1217   1       Printc(0x0c);  //清屏
1218   1       Printc(0x0c);
1219   1       Prints("系统启动................................",1);
1220   1       delay(1000);	 //延迟
1221   1       disconnect_usb(); 	   //断开USB连接
1222   1       init_usb();		   //初始化USB芯片
1223   1       connect_usb();		   //连接USB
1224   1       InitTimer0();  //定时器0初始化,用来做键盘扫描,定时时间大约为5ms
1225   1       KeyMapCanChange=1;
1226   1      
1227   1       while(1)
1228   1        { 
1229   2         if(!USB_INT)		//中断产生
1230   2          {
1231   3        	 read_interrupt_register();
C51 COMPILER V6.12  USBMOUSE                                                               09/21/2007 12:44:30 PAGE 21  

1232   3      	 if(Interrupt_Register.Interrupt.bus_reset){usb_bus_reset();continue;}
1233   3      	 if(Interrupt_Register.Interrupt.suspend_change){usb_bus_suspend();continue;}
1234   3           if(Interrupt_Register.Interrupt.control_out_port){endp0_out();continue;}
1235   3      	 if(Interrupt_Register.Interrupt.control_in_port&&usb_flags.flags.usb_endp0_in){endp0_in();continue;}
1236   3      //	 if(Interrupt_Register.Interrupt.port_out_1)endp1_out();
1237   3      //	 if(Interrupt_Register.Interrupt.port_in_1)endp1_in();
1238   3      	 if(Interrupt_Register.Interrupt.main_out_port){endp2_out();}
1239   3      	 if(Interrupt_Register.Interrupt.main_in_port){endp2_in();}
1240   3          }
1241   2        }
1242   1      }
1243          /******************************************************************************/


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2761    ----
   CONSTANT SIZE    =   2059    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     41      18
   IDATA SIZE       =    128    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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