📄 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.06 USBKEYBOARD 03/23/2007 23:58:29 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.06 USBKEYBOARD 03/23/2007 23:58:29 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.06 USBKEYBOARD 03/23/2007 23:58:29 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.06 USBKEYBOARD 03/23/2007 23:58:29 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 = 2882 ----
CONSTANT SIZE = 2084 ----
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 + -