?? usbkeyboard.lst
字號:
972 4 switch (Control_Data.DeviceRequest.bRequest)
973 4 {
974 5 default: break;
975 5 }
976 4 break;
977 4
978 4 case 1: //接收者為接口
979 4 switch (Control_Data.DeviceRequest.bRequest)
980 4 {
981 5 default: break;
982 5 }
983 4 break;
C51 COMPILER V7.00 USBKEYBOARD 07/16/2007 15:27:57 PAGE 17
984 4
985 4 case 2: //接收者為端點
986 4 switch (Control_Data.DeviceRequest.bRequest)
987 4 {
988 5 default: break;
989 5 }
990 4 break;
991 4
992 4 case 3: //其它接收者
993 4 switch (Control_Data.DeviceRequest.bRequest)
994 4 {
995 5 default: break;
996 5 }
997 4 break;
998 4
999 4 default: break;
1000 4 }
1001 3 }
1002 2 }
1003 1 }
1004 /******************************************************************************/
1005
1006 /**********************端點1輸出***********************************************/
1007 /*void endp1_out(void)
1008 {
1009 Prints("端點1輸出................................",1);
1010 }*/
1011 /******************************************************************************/
1012
1013 /*************************端點1輸入*****************************************/
1014 /*void endp1_in(void)
1015 {
1016 Prints("端點1輸入................................",1);
1017 }*/
1018 /******************************************************************************/
1019
1020 /***************************端點2輸出****************************************/
1021 void endp2_out(void)
1022 {
1023 1 uint8 i,j;
1024 1
1025 1 j=read_endpoint_buff(4,64,buffer);
1026 1 P2=~buffer[0];
1027 1 Prints("端點2輸出................................",1);
1028 1 Prints(" 端點2的數據是 ",0);
1029 1 for(i=0;i<j;i++)
1030 1 {
1031 2 PrintHex(buffer[i]);
1032 2 if(i==16)Prints("",1);
1033 2 }
1034 1 Prints("",1);
1035 1 }
1036 /******************************************************************************/
1037
1038
1039 //用來返回數據的緩沖
1040 uint8 idata InBuffer[64];
1041
1042 /***************************統計x中有多少個bit為1*******************************/
1043 uint8 Count1Bits(uint16 x)
1044 {
1045 1 uint8 i;
C51 COMPILER V7.00 USBKEYBOARD 07/16/2007 15:27:57 PAGE 18
1046 1
1047 1 i=0;
1048 1 while(x)
1049 1 {
1050 2 if(x&0x8000)i++;
1051 2 x<<=1;
1052 2 }
1053 1 return i;
1054 1 }
1055 /******************************************************************************/
1056
1057 /****************************主端點輸入處理************************************/
1058 void endp2_in(void)
1059 {
1060 1 uint8 i;
1061 1 // Prints("端點2輸入................................",1);
1062 1 KeyMapCanChange=0; //禁止修改按鍵值
1063 1 if(KeyMapOk) //如果有按鍵按下
1064 1 {
1065 2 //4*4的鍵盤,最多能夠識別3個鍵同時按下,
1066 2 //如果開關上接二極管可以同時識別更多的鍵
1067 2 if(Count1Bits(KeyMapOk)>3)
1068 2 {
1069 3 for(i=2;i<8;i++)InBuffer[i]=0x01; //按鍵過多
1070 3 }
1071 2 else
1072 2 {
1073 3 if(KeyMapOk&(1<<3)) //左Ctrl鍵
1074 3 {
1075 4 InBuffer[0]|=1;
1076 4 }
1077 3 else
1078 3 {
1079 4 InBuffer[0]&=~1;
1080 4 }
1081 3
1082 3 if(KeyMapOk&(1<<7)) //左shift鍵
1083 3 {
1084 4 InBuffer[0]|=1<<1;
1085 4 }
1086 3 else
1087 3 {
1088 4 InBuffer[0]&=~(1<<1);
1089 4 }
1090 3
1091 3 if(KeyMapOk&(1<<2)) //左ALT鍵
1092 3 {
1093 4 InBuffer[0]|=1<<2;
1094 4 }
1095 3 else
1096 3 {
1097 4 InBuffer[0]&=~(1<<2);
1098 4 }
1099 3 i=2;
1100 3 if(KeyMapOk&(1))
1101 3 {
1102 4 InBuffer[i++]=0x28; //回車鍵
1103 4 }
1104 3 if(KeyMapOk&(1<<1))
1105 3 {
1106 4 InBuffer[i++]=0x62; //0鍵
1107 4 }
C51 COMPILER V7.00 USBKEYBOARD 07/16/2007 15:27:57 PAGE 19
1108 3 if(KeyMapOk&(1<<4))
1109 3 {
1110 4 InBuffer[i++]=0x5B; //3鍵
1111 4 }
1112 3 if(KeyMapOk&(1<<5))
1113 3 {
1114 4 InBuffer[i++]=0x5A; //2鍵
1115 4 }
1116 3 if(KeyMapOk&(1<<6))
1117 3 {
1118 4 InBuffer[i++]=0x59; //1鍵
1119 4 }
1120 3 if(KeyMapOk&(1<<8))
1121 3 {
1122 4 InBuffer[i++]=0x5E; //6鍵
1123 4 }
1124 3 if(KeyMapOk&(1<<9))
1125 3 {
1126 4 InBuffer[i++]=0x5D; //5鍵
1127 4 }
1128 3 if(KeyMapOk&(1<<10))
1129 3 {
1130 4 InBuffer[i++]=0x5C; //4鍵
1131 4 }
1132 3 if(KeyMapOk&(1<<11))
1133 3 {
1134 4 InBuffer[i++]=0x39; //Caps Lock鍵
1135 4 }
1136 3 if(KeyMapOk&(1<<12))
1137 3 {
1138 4 InBuffer[i++]=0x61; //9鍵
1139 4 }
1140 3 if(KeyMapOk&(1<<13))
1141 3 {
1142 4 InBuffer[i++]=0x60; //8鍵
1143 4 }
1144 3 if(KeyMapOk&(1<<14))
1145 3 {
1146 4 InBuffer[i++]=0x5F; //2鍵
1147 4 }
1148 3 if(KeyMapOk&(1<<15))
1149 3 {
1150 4 InBuffer[i++]=0x53; //Num Lock鍵
1151 4 }
1152 3 for(;i<8;i++)
1153 3 {
1154 4 InBuffer[i]=0; //多余的清0
1155 4 }
1156 3 }
1157 2 }
1158 1 else //如果無按鍵按下,則返回0
1159 1 {
1160 2 for(i=0;i<8;i++)
1161 2 {
1162 3 InBuffer[i]=0;
1163 3 }
1164 2 }
1165 1 KeyMapCanChange=1; //允許修改按鍵值
1166 1 //返回8個字節數據
1167 1 write_endpoint_buff(5,8,InBuffer);
1168 1 }
1169 /******************************************************************************/
C51 COMPILER V7.00 USBKEYBOARD 07/16/2007 15:27:57 PAGE 20
1170
1171
1172 /***************************主函數**********************************************/
1173 void main(void)
1174 {
1175 1 InitUART(); //串口初始化
1176 1 Printc(0x0c); //清屏
1177 1 Printc(0x0c);
1178 1 Prints("系統啟動................................",1);
1179 1 delay(1000); //延遲
1180 1 disconnect_usb(); //斷開USB連接
1181 1 init_usb(); //初始化USB芯片
1182 1 connect_usb(); //連接USB
1183 1 InitTimer0(); //定時器0初始化,用來做鍵盤掃描,定時時間大約為5ms
1184 1 KeyMapCanChange=1;
1185 1 while(1)
1186 1 {
1187 2 if(!USB_INT) //中斷產生
1188 2 {
1189 3 read_interrupt_register();
1190 3 if(Interrupt_Register.Interrupt.bus_reset){usb_bus_reset();continue;}
1191 3 if(Interrupt_Register.Interrupt.suspend_change){usb_bus_suspend();continue;}
1192 3 if(Interrupt_Register.Interrupt.control_out_port){endp0_out();continue;}
1193 3 if(Interrupt_Register.Interrupt.control_in_port&&usb_flags.flags.usb_endp0_in){endp0_in();continue;}
1194 3 // if(Interrupt_Register.Interrupt.port_out_1)endp1_out();
1195 3 // if(Interrupt_Register.Interrupt.port_in_1)endp1_in();
1196 3 if(Interrupt_Register.Interrupt.main_out_port){endp2_out();}
1197 3 if(Interrupt_Register.Interrupt.main_in_port){endp2_in();}
1198 3 }
1199 2 }
1200 1 }
1201 /******************************************************************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2887 ----
CONSTANT SIZE = 2081 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 41 15
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 + -