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

📄 main.lst

📁 HID USB键盘单片机固件程序
💻 LST
字号:
C51 COMPILER V7.06   MAIN                                                                  11/16/2008 16:00:30 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.14
  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:左Ctrl键  K2:左Shift键  K3:左Alt键  K4:1键    ******\r\n",
  42          "******       K5:2键  K6:3键  K7:Caps Lock键 K8:Num Lock键     ******\r\n",
  43          "******  注意:数字键是数字小键盘,必须打开Num Lock才是数字键  ******\r\n",
  44          "********************************************************************\r\n",
  45          };
  46          
  47          /********************************************************************
  48          函数功能:根据按键情况返回报告的函数。
  49          入口参数:无。
  50          返    回:无。
  51          备    注:无。
  52          ********************************************************************/
  53          void SendReport(void)
  54          {
  55   1       //需要返回的8字节报告的缓冲
C51 COMPILER V7.06   MAIN                                                                  11/16/2008 16:00:30 PAGE 2   

  56   1       //通过报告描述符的定义及HID用途表文档,可知Buf[0]的D0是左Ctrl键,
  57   1       //D1是左Shift键,D2是左Alt键,D3是左GUI(即Window键),
  58   1       //D4是右Ctrl,D5是右Shift,D6是右Alt,D7是右GUI键。
  59   1       //Buf[1]保留,值为0。Buf[2]~Buf[7]为键值,最多可以有6个。
  60   1       //由于我们这里普通键最多只有5个,因此不会超过6个。
  61   1       //对于实际的键盘,如果按键数太多时,后面的6个字节都为0xFF,
  62   1       //表示按下的键太多,无法正确返回。
  63   1       
  64   1       uint8 Buf[8]={0,0,0,0,0,0,0,0};
  65   1       //由于需要返回多个按键,所以需要增加一个变量来保存当前的位置。
  66   1       uint8 i=2;
  67   1       
  68   1       //根据不同的按键设置输入报告
  69   1       if(KeyPress & KEY1) //如果KEY1按住
  70   1       {
  71   2        Buf[0]|=0x01;  //KEY1为左Ctrl键。
  72   2       }
  73   1       if(KeyPress & KEY2) //如果KEY2按住
  74   1       {
  75   2        Buf[0]|=0x02;  //KEY2为左Shift键。
  76   2       }
  77   1       if(KeyPress & KEY3) //如果KEY3按住
  78   1       {
  79   2        Buf[0]|=0x04;  //KEY3为左Alt键
  80   2       }
  81   1       if(KeyPress & KEY4) //如果KEY4按住
  82   1       {
  83   2        Buf[i]=0x59;  //KEY4为数字小键盘1键。
  84   2        i++;  //切换到下个位置。
  85   2       }
  86   1       if(KeyPress & KEY5)  //如果KEY5按住
  87   1       {
  88   2        Buf[i]=0x5A;  //KEY5数字小键盘2键。
  89   2        i++;  //切换到下个位置。
  90   2       }
  91   1       if(KeyPress & KEY6)  //如果KEY6按住
  92   1       {
  93   2        Buf[i]=0x5B;  //KEY6为数字小键盘3键。
  94   2        i++;  //切换到下个位置。
  95   2       }
  96   1       if(KeyPress & KEY7)  //如果KEY7按住
  97   1       {
  98   2        Buf[i]=0x39;  //KEY7为大/小写切换键。
  99   2        i++;  //切换到下个位置。
 100   2       }
 101   1       if(KeyPress & KEY8)  //如果KEY8按住
 102   1       {
 103   2        Buf[i]=0x53;  //KEY8为数字小键盘功能切换键。
 104   2       }
 105   1       //报告准备好了,通过端点1返回,长度为8字节。
 106   1       D12WriteEndpointBuffer(3,8,Buf);
 107   1       Ep1InIsBusy=1;  //设置端点忙标志。
 108   1       //记得清除KeyUp和KeyDown
 109   1       KeyUp=0;
 110   1       KeyDown=0;
 111   1      }
 112          ////////////////////////End of function//////////////////////////////
 113          
 114          /********************************************************************
 115          函数功能:主函数。
 116          入口参数:无。
 117          返    回:无。
C51 COMPILER V7.06   MAIN                                                                  11/16/2008 16:00:30 PAGE 3   

 118          备    注:无。
 119          ********************************************************************/
 120          void main(void)  //主函数
 121          {
 122   1       uint8 i;
 123   1       uint16 id;
 124   1       uint8 InterruptSource;
 125   1       
 126   1       EA=1; //打开中断
 127   1       InitKeyboard(); //初始化按键
 128   1       InitUART();  //初始化串口
 129   1       
 130   1       for(i=0;i<19;i++)   //显示信息
 131   1       {
 132   2        Prints(HeadTable[i]);
 133   2       }
 134   1       
 135   1       id=D12ReadID();
 136   1      
 137   1       Prints("Your D12 chip\'s ID is: ");
 138   1       PrintShortIntHex(id);
 139   1      
 140   1       if(id==0x1012)
 141   1       {
 142   2        Prints(". ID is correct! Congratulations!\r\n\r\n");
 143   2       }
 144   1       else
 145   1       {
 146   2        Prints(". ID is incorrect! What a pity!\r\n\r\n");
 147   2       }
 148   1       
 149   1       UsbDisconnect();  //先断开USB连接
 150   1       UsbConnect();  //将USB连接上
 151   1       ConfigValue=0; //配置值初始化为0
 152   1       
 153   1       while(1)  //死循环
 154   1       {
 155   2        if(D12GetIntPin()==0) //如果有中断发生
 156   2        {
 157   3         D12WriteCommand(READ_INTERRUPT_REGISTER);  //写读中断寄存器的命令
 158   3         InterruptSource=D12ReadByte(); //读回第一字节的中断寄存器
 159   3         if(InterruptSource&0x80)UsbBusSuspend(); //总线挂起中断处理
 160   3         if(InterruptSource&0x40)UsbBusReset();   //总线复位中断处理
 161   3         if(InterruptSource&0x01)UsbEp0Out();     //端点0输出中断处理
 162   3         if(InterruptSource&0x02)UsbEp0In();      //端点0输入中断处理
 163   3         if(InterruptSource&0x04)UsbEp1Out();     //端点1输出中断处理
 164   3         if(InterruptSource&0x08)UsbEp1In();      //端点1输入中断处理
 165   3         if(InterruptSource&0x10)UsbEp2Out();     //端点2输出中断处理
 166   3         if(InterruptSource&0x20)UsbEp2In();      //端点2输入中断处理
 167   3        }
 168   2        if(ConfigValue!=0) //如果已经设置为非0的配置,则可以返回报告数据
 169   2        {
 170   3         if(!Ep1InIsBusy)  //如果端点1输入没有处于忙状态,则可以发送数据
 171   3         {
 172   4          KeyCanChange=0;  //禁止按键扫描
 173   4          if(KeyUp||KeyDown) //如果有按键事件发生
 174   4          {
 175   5           SendReport();  //则返回报告
 176   5          }
 177   4          KeyCanChange=1;  //允许按键扫描
 178   4         }
 179   3        }
C51 COMPILER V7.06   MAIN                                                                  11/16/2008 16:00:30 PAGE 4   

 180   2       }
 181   1      }
 182          ////////////////////////End of function//////////////////////////////


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    339    ----
   CONSTANT SIZE    =   1512    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      12
   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 + -