📄 usbmouse.lst
字号:
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 + -