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

📄 main.lst

📁 此源代码为双报表法USB键盘鼠标开发源代码
💻 LST
字号:
C51 COMPILER V7.06   MAIN                                                                  11/16/2008 16:00:01 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN Main.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE Main.c BROWSE DEBUG OBJECTEXTEND TABS(1)

stmt level    source

   1          /******************************************************************
   2             本程序只供学习使用,未经作者许可,不得用于其它任何用途
   3             
   4                  欢迎访问我的USB专区:http://group.ednchina.com/93/
   5                  欢迎访问我的blog:   http://www.ednchina.com/blog/computer00
   6                                       http://computer00.21ic.org
   7          
   8                  感谢PCB赞助商——电子园: http://bbs.cepark.com/
   9          
  10          main.c file
  11          
  12          作者:电脑圈圈
  13          建立日期: 2008.06.27
  14          修改日期: 2008.07.15
  15          版本:V1.1
  16          版权所有,盗版必究。
  17          Copyright(C) 电脑圈圈 2008-2018
  18          All rights reserved            
  19          *******************************************************************/
  20          
  21          #include <AT89X52.H>  //头文件
  22          #include "Key.h"
  23          #include "Led.h"
  24          #include "UART.h"
  25          #include "pdiusbd12.h"
  26          #include "UsbCore.h"
  27          #include "config.h"
  28          
  29          code uint8 HeadTable[][74]={
  30          "********************************************************************\r\n",
  31          "******           《圈圈教你玩USB》之 带鼠标的USB键盘          ******\r\n",
  32          "******                      AT89S52 CPU                       ******\r\n",
  33          "******                  建立日期:",__DATE__,"                 ******\r\n",
  34          "******                   建立时间:",__TIME__,"                   ******\r\n",
  35          "******                    作者:电脑圈圈                      ******\r\n",
  36          "******                    欢迎访问作者的                      ******\r\n",
  37          "******           USB专区:http://group.ednchina.com/93/       ******\r\n",
  38          "******      BLOG1:http://www.ednchina.com/blog/computer00    ******\r\n",
  39          "******                BLOG2:http://computer00.21ic.org       ******\r\n",
  40          "******                  请按K1-K8分别进行测试                 ******\r\n",
  41          "******   K1:功能选择键:按下时K2~K8为键盘,松开时K2~K8为鼠标  ******\r\n",
  42          "******                      键盘功能时                        ******\r\n",
  43          "******             K2:左Shift键  K3:左Alt键  K4:1键           ******\r\n",
  44          "******       K5:2键  K6:3键  K7:Caps Lock键 K8:Num Lock键     ******\r\n",
  45          "******  注意:数字键是数字小键盘,必须打开Num Lock才是数字键  ******\r\n",
  46          "******                      鼠标功能时                        ******\r\n",
  47          "******     K2:光标左移  K3:光标右移  K4:光标上移 K5:光标下移  ******\r\n",
  48          "******            K6:鼠标左键  K7:鼠标中键  K8:鼠标右键       ******\r\n",
  49          "********************************************************************\r\n",
  50          };
  51          
  52          /********************************************************************
  53          函数功能:根据按键情况返回报告的函数。
  54          入口参数:无。
  55          返    回:无。
C51 COMPILER V7.06   MAIN                                                                  11/16/2008 16:00:01 PAGE 2   

  56          备    注:无。
  57          ********************************************************************/
  58          void SendReport(void)
  59          {
  60   1       //需要返回的9字节报告的缓冲(一字节报告ID加键盘8字节报告)
  61   1       //而鼠标报告只有4字节,加上一字节报告ID总共5字节,9字节够了。
  62   1       
  63   1       uint8 Buf[9]={0,0,0,0,0,0,0,0,0}; 
  64   1       
  65   1       //由于需要返回多个按键,所以需要增加一个变量来保存当前的位置。
  66   1       //由于报告ID占用第一字节,所以普通按键从第四字节开始存放。
  67   1       uint8 i=3; 
  68   1       
  69   1       //我们用KEY1键来选择剩余的7个键是键盘功能还是鼠标功能。
  70   1       //当KEY1按住时,剩余7个键为键盘功能,这7个键的功能跟键盘
  71   1       //实例的一样。当KEY1松开时,剩余7个键为鼠标功能,功能分别为:
  72   1       //KEY2:光标左移,KEY3:光标右移,KEY4:光标上移,KEY5:光标下移。
  73   1       //KEY6:鼠标左键,KEY7:鼠标中键,KEY8:鼠标右键。
  74   1       
  75   1       //根据不同的按键设置输入报告
  76   1       
  77   1       if(KeyPress & KEY1) //如果KEY1按住,则为键盘功能
  78   1       {
  79   2        Buf[0]=0x01;  //第一字节为报告ID,键盘报告ID为1。
  80   2        if(KeyPress & KEY2) //如果KEY2按住
  81   2        {
  82   3         Buf[1]|=0x02;  //KEY2为左Shift键。
  83   3        }
  84   2        if(KeyPress & KEY3) //如果KEY3按住
  85   2        {
  86   3         Buf[1]|=0x04;  //KEY3为左Alt键
  87   3        }
  88   2        if(KeyPress & KEY4) //如果KEY4按住
  89   2        {
  90   3         Buf[i]=0x59;  //KEY4为数字小键盘1键。
  91   3         i++;  //切换到下个位置。
  92   3        }
  93   2        if(KeyPress & KEY5)  //如果KEY5按住
  94   2        {
  95   3         Buf[i]=0x5A;  //KEY5数字小键盘2键。
  96   3         i++;  //切换到下个位置。
  97   3        }
  98   2        if(KeyPress & KEY6)  //如果KEY6按住
  99   2        {
 100   3         Buf[i]=0x5B;  //KEY6为数字小键盘3键。
 101   3         i++;  //切换到下个位置。
 102   3        }
 103   2        if(KeyPress & KEY7)  //如果KEY7按住
 104   2        {
 105   3         Buf[i]=0x39;  //KEY7为大/小写切换键。
 106   3         i++;  //切换到下个位置。
 107   3        }
 108   2        if(KeyPress & KEY8)  //如果KEY8按住
 109   2        {
 110   3         Buf[i]=0x53;  //KEY8为数字小键盘功能切换键。
 111   3        }
 112   2        //报告准备好了,通过端点1返回,长度为9字节。
 113   2        D12WriteEndpointBuffer(3,9,Buf);
 114   2       }
 115   1       else  //KEY1松开,为鼠标功能
 116   1       {
 117   2        Buf[0]=0x02;  //第一字节为报告ID,鼠标报告ID为2。
C51 COMPILER V7.06   MAIN                                                                  11/16/2008 16:00:01 PAGE 3   

 118   2        if(KeyDown & KEY2) //如果KEY2按下
 119   2        {
 120   3         Buf[2]=-10;  //KEY2为鼠标左移,按一次移动10个单位。
 121   3        }
 122   2        if(KeyDown & KEY3) //如果KEY3按下
 123   2        {
 124   3         Buf[2]=10;  //KEY3为鼠标右移,按一次移动10个单位。
 125   3        }
 126   2        if(KeyDown & KEY4) //如果KEY4按下
 127   2        {
 128   3         Buf[3]=-10;  //KEY4为鼠标上移,按一次移动10个单位。
 129   3        }
 130   2        if(KeyDown & KEY5)  //如果KEY5按下
 131   2        {
 132   3         Buf[3]=10;  //KEY5为鼠标下移,按一次移动10个单位。
 133   3        }
 134   2        if(KeyPress & KEY6)  //如果KEY6按住
 135   2        {
 136   3         Buf[1]|=0x01;  //KEY6为鼠标左键。
 137   3        }
 138   2        if(KeyPress & KEY7)  //如果KEY7按住
 139   2        {
 140   3         Buf[1]|=0x04;  //KEY7为鼠标中键。
 141   3        }
 142   2        if(KeyPress & KEY8)  //如果KEY8按住
 143   2        {
 144   3         Buf[1]|=0x02;  //KEY8为鼠标右键。
 145   3        }
 146   2        //报告准备好了,通过端点1返回,长度为5字节。
 147   2        D12WriteEndpointBuffer(3,5,Buf);
 148   2       }
 149   1       Ep1InIsBusy=1;  //设置端点忙标志。
 150   1       //记得清除KeyUp和KeyDown
 151   1       KeyUp=0;
 152   1       KeyDown=0;
 153   1      }
 154          ////////////////////////End of function//////////////////////////////
 155          
 156          /********************************************************************
 157          函数功能:主函数。
 158          入口参数:无。
 159          返    回:无。
 160          备    注:无。
 161          ********************************************************************/
 162          void main(void)  //主函数
 163          {
 164   1       uint8 i;
 165   1       uint16 id;
 166   1       uint8 InterruptSource;
 167   1       
 168   1       EA=1; //打开中断
 169   1       InitKeyboard(); //初始化按键
 170   1       InitUART();  //初始化串口
 171   1       
 172   1       for(i=0;i<24;i++)   //显示信息
 173   1       {
 174   2        Prints(HeadTable[i]);
 175   2       }
 176   1       
 177   1       id=D12ReadID();
 178   1      
 179   1       Prints("Your D12 chip\'s ID is: ");
C51 COMPILER V7.06   MAIN                                                                  11/16/2008 16:00:01 PAGE 4   

 180   1       PrintShortIntHex(id);
 181   1      
 182   1       if(id==0x1012)
 183   1       {
 184   2        Prints(". ID is correct! Congratulations!\r\n\r\n");
 185   2       }
 186   1       else
 187   1       {
 188   2        Prints(". ID is incorrect! What a pity!\r\n\r\n");
 189   2       }
 190   1       
 191   1       UsbDisconnect();  //先断开USB连接
 192   1       UsbConnect();  //将USB连接上
 193   1       ConfigValue=0; //配置值初始化为0
 194   1       
 195   1       while(1)  //死循环
 196   1       {
 197   2        if(D12GetIntPin()==0) //如果有中断发生
 198   2        {
 199   3         D12WriteCommand(READ_INTERRUPT_REGISTER);  //写读中断寄存器的命令
 200   3         InterruptSource=D12ReadByte(); //读回第一字节的中断寄存器
 201   3         if(InterruptSource&0x80)UsbBusSuspend(); //总线挂起中断处理
 202   3         if(InterruptSource&0x40)UsbBusReset();   //总线复位中断处理
 203   3         if(InterruptSource&0x01)UsbEp0Out();     //端点0输出中断处理
 204   3         if(InterruptSource&0x02)UsbEp0In();      //端点0输入中断处理
 205   3         if(InterruptSource&0x04)UsbEp1Out();     //端点1输出中断处理
 206   3         if(InterruptSource&0x08)UsbEp1In();      //端点1输入中断处理
 207   3         if(InterruptSource&0x10)UsbEp2Out();     //端点2输出中断处理
 208   3         if(InterruptSource&0x20)UsbEp2In();      //端点2输入中断处理
 209   3        }
 210   2        if(ConfigValue!=0) //如果已经设置为非0的配置,则可以返回报告数据
 211   2        {
 212   3         //为显示KEY1选择功能,当KEY1按住时,将LED8点亮,表示键盘功能状态
 213   3         if(KeyPress & KEY1)
 214   3         {
 215   4          OnLed8();
 216   4         }
 217   3         else
 218   3         {
 219   4          OffLed8();
 220   4         }
 221   3         if(!Ep1InIsBusy)  //如果端点1输入没有处于忙状态,则可以发送数据
 222   3         {
 223   4          KeyCanChange=0;  //禁止按键扫描
 224   4          if(KeyUp||KeyDown) //如果有按键事件发生
 225   4          {
 226   5           SendReport();  //则返回报告
 227   5          }
 228   4          KeyCanChange=1;  //允许按键扫描
 229   4         }
 230   3        }
 231   2       }
 232   1      }
 233          ////////////////////////End of function//////////////////////////////


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    425    ----
   CONSTANT SIZE    =   1883    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      13
C51 COMPILER V7.06   MAIN                                                                  11/16/2008 16:00:01 PAGE 5   

   IDATA SIZE       =   ----    ----
   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 + -