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

📄 usbkeyboard.lst

📁 基于51和D12实现电脑的红外遥控
💻 LST
📖 第 1 页 / 共 5 页
字号:
 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 + -