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

📄 main.lst

📁 D12实现的USB
💻 LST
字号:
C51 COMPILER V7.50   MAIN                                                                  03/07/2006 08:28:21 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN Main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Main.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /****************************************Copyright (c)**************************************************
   2          **                               广州周立功单片机发展有限公司
   3          **                                     研    究    所
   4          **                                        产品一部 
   5          **
   6          **                                 http://www.zlgmcu.com
   7          **
   8          ** 文   件   名: main.c
   9          ** 最后修改日期: 2004年11月15日
  10          ** 描        述: 用户应用程序
  11          ** 版        本: V5.0
  12          **********************************************************************************************************
             -/
  13          
  14          #include <reg52.h>
  15          #include "D12Config.h"
  16          #include "D12CI.h"
  17          #include "D12HAL.h"
  18          #include "Descriptor.h"
  19          #include "Chap_9.h"
  20          #include "D12Driver.h"
  21          #include "string.h"
  22          
  23          
  24          /***********************************************************
  25                                  主函数                  Main Function
  26          ************************************************************/
  27          
  28          #define CMD_RECEIVE             0x01                    /* 接收命令 */
  29          #define CMD_TRANSMIT    0x02                    /* 发送命令 */
  30          #define CMD_STOP                0x03                    /* 停止命令 */
  31          #define BUFFER_IN_XDATA                                 /* 定义数据缓冲区在外部ram */
  32          
  33          #ifdef  BUFFER_IN_XDATA
  34          INT8U xdata RecBuf[1024];                               /* 缓冲区 */    
  35          #endif
  36          
  37          #ifdef  BUFFER_IN_IDATA 
              INT8U idata RecBuf[128];                                /* 缓冲区 */
              #endif  
  40          
  41          INT8U idata EP2_tx;                                             /* 端点2发送中断标志 */
  42          INT8U idata Rcv128Bytes;                                /* 端点收到128字节标志位 */
  43          INT8U idata TxEnable;                                   /* 发送使能 */
  44          INT8U ack;                                                              /* 应答 */
  45          INT8U command,i,k;
  46          INT8U num_Of_64len;                     /* 长度为64字节的包数 */
  47          INT8U num_of_less64len;                                 /* 长度小于64字节的包长度 */
  48          INT16 offset;                                                   /* 偏移量 */  
  49          
  50          extern INT8U D12_WriteEndpoint(INT8U endp, INT8U len, INT8U * buf);     
  51          void CmdServe(void);
  52          void RxServe(void);
  53          void TxServe(void);
  54          sfr  AUXR = 0x8E;                                               /* 只用于TKS668 仿真器 */
C51 COMPILER V7.50   MAIN                                                                  03/07/2006 08:28:21 PAGE 2   

  55          sbit led0 = P1^2;
  56          sbit led1 = P1^3;
  57          
  58          /****************************************************************************
  59          ** 函数名称: void Init_Interrupt(void)
  60          ** 功能描述: 初始化MCU相关中断
  61          *****************************************************************************/
  62          void Init_Interrupt(void)
  63          {
  64   1              EX0 = 1;                                                        /* 开外部中断0 */
  65   1              PX0 = 0;                                                        /* 设置外部中断0中断优先级 */
  66   1              EA = 1;                                                         /* 开80C51总中断 */
  67   1      
  68   1              AUXR = 0;                                                       /* 使能668芯片内部xdata */
  69   1      }
  70          
  71          /****************************************************************************
  72          ** 函数名称: main()
  73          ** 功能描述: 主函数
  74          *****************************************************************************/
  75          main()
  76          {       
  77   1              if (Init_D12()!=0)                                                              /* 初始化D12 */
  78   1                      return;                                                                         /* 如果初始化不成功,返回 */
  79   1      
  80   1              Init_Interrupt();                                                               /* 初始化D12以后,才能使能相关中断 */
  81   1      
  82   1              /* user code */
  83   1              TxEnable = 1;   
  84   1                      
  85   1              while(1)
  86   1              {
  87   2                      usbserve();                                                                     /* 处理USB事件 */               
  88   2                                                                                                                      
  89   2                      if (bEPPflags.bits.ep1_rxdone == 1)                     /* 端点一接收到命令处理*/
  90   2                      {
  91   3                              DISABLE();
  92   3                              CmdServe();                     
  93   3                              bEPPflags.bits.ep1_rxdone = 0;                  /* 清空端点2收到数据标志 */                     
  94   3                              ENABLE();
  95   3                      }                        
  96   2      
  97   2                      if (bEPPflags.bits.ep2_rxdone == 1)                                     
  98   2                      {       
  99   3                              DISABLE();                                                              /* 从端点2收到数据 */
 100   3                              RxServe();                                                              /* 数据处理 */                  
 101   3                              bEPPflags.bits.ep2_rxdone = 0;                  /* 清空端点2收到数据标志 */                                             
 102   3                              ENABLE();
 103   3                      }
 104   2      
 105   2                      if ((EP2_tx == 1)&&TxEnable)                                    
 106   2                      {       
 107   3                              DISABLE();                                                              /* 从端点2发送数据 */   
 108   3                              EP2_tx = 0;                                                             /* 清空端点2发送数据标志 */                                     
 109   3                              TxServe();                                                              /* 数据处理 */                          
 110   3                              ENABLE();
 111   3                      }
 112   2      
 113   2                      /* Add your code here */
 114   2      
 115   2      
 116   2              }
C51 COMPILER V7.50   MAIN                                                                  03/07/2006 08:28:21 PAGE 3   

 117   1      
 118   1      }
 119          /****************************************************************************
 120          ** 函数名称: void CmdServe(void)
 121          ** 功能描述: 执行上位机命令
 122          *****************************************************************************/
 123          void CmdServe(void)
 124          {
 125   1              INT16U len;
 126   1                      
 127   1              command = GenEpBuf[0];                                                                                   // 命令字
 128   1               
 129   1              if(command == CMD_STOP)
 130   1              {
 131   2                      offset  = 0;
 132   2                      num_Of_64len = 0;
 133   2                      num_of_less64len = 0;           
 134   2                      return;
 135   2              }
 136   1              else 
 137   1              {
 138   2                      offset = (INT16U)(GenEpBuf[1] << 8) + GenEpBuf[2];                      // 接收/发送 缓冲区地址                         
 139   2                      len =(INT16U)(GenEpBuf[3] << 8) + GenEpBuf[4];
 140   2                      num_Of_64len = len / EP2_RX_FIFO_SIZE;                                          // 计算64字节整数包数目 
 141   2                      num_of_less64len = len % EP2_RX_FIFO_SIZE;                                      // 计算剩余字节数                                               
 142   2                                                                                                                                          
 143   2                      if ((command == CMD_TRANSMIT)&&TxEnable)                                        // 填充FIFO 
 144   2                              TxServe();
 145   2              }               
 146   1              
 147   1      }
 148          /****************************************************************************
 149          ** 函数名称: void TxServe(void)
 150          ** 功能描述: 发送数据到PC机
 151          *****************************************************************************/
 152          void TxServe(void)
 153          {               
 154   1              if(command == CMD_TRANSMIT)
 155   1              {       
 156   2                      if(num_Of_64len!=0)                                                                                              // 发送64字节的整数包
 157   2                      {
 158   3                              DISABLE();
 159   3                              D12_WriteEndpoint(5,EP2_TX_FIFO_SIZE,RecBuf + offset);           // 写发送缓冲区
 160   3                              ENABLE();
 161   3                              offset += EP2_TX_FIFO_SIZE;     
 162   3                              num_Of_64len --;
 163   3                      }               
 164   2                                        
 165   2                      else if(num_of_less64len!=0)
 166   2                      {
 167   3                              DISABLE();
 168   3                              D12_WriteEndpoint(5,num_of_less64len,RecBuf + offset);  
 169   3                              ENABLE();
 170   3                              num_of_less64len = 0;
 171   3                      }       
 172   2              }
 173   1      }
 174          /****************************************************************************
 175          ** 函数名称: void RxServe(void)
 176          ** 功能描述: 指示接收状态,发送应答字。
 177          *****************************************************************************/
 178          void RxServe(void)
C51 COMPILER V7.50   MAIN                                                                  03/07/2006 08:28:21 PAGE 4   

 179          {       
 180   1              if(command == CMD_RECEIVE)
 181   1              {                                                       
 182   2                      if (Rcv128Bytes == 1)                                                                                   // 如果双缓冲区中收到数据
 183   2                          led0 = 0;                     
 184   2                      else                                                                                                                    // 只有一个缓冲区中收到数据
 185   2                              led1 ^= 1;
 186   2              
 187   2                      if ((num_Of_64len==0)&&(num_of_less64len==0))
 188   2                      {
 189   3                              ack = 0x01;
 190   3                              DISABLE();
 191   3                              D12_WriteEndpoint(3,1,&ack);                                                            // 应答PC机:我已收到你发来的数据!               
 192   3                              ENABLE();
 193   3                              offset = 0;
 194   3                              led0 = 1;
 195   3                              led1 = 1;
 196   3                      } 
 197   2              }         
 198   1      }
 199          
 200                                                                                                                                                                                                  


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    311    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   1024    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      8    ----
   IDATA SIZE       =      3    ----
   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 + -