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

📄 isr.lst

📁 用于设备工作时间监控的下位机源码
💻 LST
字号:
C51 COMPILER V7.04   ISR                                                                   12/18/2005 18:05:21 PAGE 1   


C51 COMPILER V7.04, COMPILATION OF MODULE ISR
OBJECT MODULE PLACED IN Isr.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Isr.c OPTIMIZE(2,SPEED) DEBUG OBJECTEXTEND

stmt level    source

   1          #include <stdio.h>
   2          #include <string.h>
   3          
   4          #include <reg51.h>                /* special function register declarations   */
   5          
   6          #include "epphal.h"
   7          #include "d12ci.h"
   8          #include "mainloop.h"
   9          #include "usb100.h"
  10          
  11          extern void bus_reset(void);
  12          
  13          extern void ep0_txdone(void);
  14          extern void ep0_rxdone(void);
  15          
  16          extern void ep1_txdone(void);
  17          extern void ep1_rxdone(void);
  18          
  19          extern void main_txdone(void);
  20          extern void main_rxdone(void);
  21          
  22          extern void dma_eot(void);
  23          
  24          /*
  25          //*************************************************************************
  26          //  Public static data
  27          //*************************************************************************
  28          */
  29          
  30          EPPFLAGS bEPPflags;
  31          
  32          /* Control endpoint TX/RX buffers */
  33          extern CONTROL_XFER ControlData;
  34          
  35          /* ISR static vars */
  36          unsigned char idata GenEpBuf[EP1_PACKET_SIZE];
  37          unsigned char idata EpBuf[EP2_PACKET_SIZE];
  38          IO_REQUEST idata ioRequest;
  39          unsigned char ioSize, ioCount;
  40          unsigned long ClockTicks = 0;
  41          
  42          extern BOOL bNoRAM;
  43          
  44          
  45          
  46          extern unsigned short AT24C02DelayTime; // 读24C02N延迟时间计时,必须保证每个加减单位为1毫秒
  47          
  48          extern unsigned short MilliSecondCount;
  49          extern unsigned short MinuteCount;
  50          
  51          extern unsigned long  UsedMinuteTime;
  52          extern unsigned short WriteUseMinuteTime;
  53          
  54          extern unsigned char  OutputPulseValue;
  55          extern unsigned short OutputPulseFrequency;
C51 COMPILER V7.04   ISR                                                                   12/18/2005 18:05:21 PAGE 2   

  56          
  57          
  58          void T0_Int() interrupt 1 using 1
  59          {
  60   1      //      DISABLE;
  61   1              ClockTicks++;
  62   1              bEPPflags.bits.timer = 1;
  63   1      //      ENABLE;
  64   1      
  65   1              TH0  = (-2000) >> 8;                    // Timer 0 -- (12*x/f=1ms) at 24MHz
  66   1          TL0  = (-2000) & 0xff;
  67   1      
  68   1              AT24C02DelayTime++;
  69   1      
  70   1              MilliSecondCount++;
  71   1              if ((MilliSecondCount % OutputPulseFrequency) == 0){
  72   2                      OutputPulseValue = ~OutputPulseValue;
  73   2                      P2 = OutputPulseValue;
  74   2              }
  75   1      
  76   1              if (MilliSecondCount >= 60000){
  77   2                      MilliSecondCount = 0;
  78   2                      MinuteCount++;
  79   2                      UsedMinuteTime++;
  80   2              }
  81   1      }
  82          
  83          /*
  84          //定时器0中断处理
  85          timer_isr() interrupt 1
  86          {
  87                  DISABLE;
  88                  ClockTicks++;
  89                  bEPPflags.bits.timer = 1;
  90                  ENABLE;
  91          }
  92          */
  93          
  94          //USB中断处理
  95          usb_isr() interrupt 0
  96          {
  97   1              DISABLE;
  98   1              fn_usb_isr();
  99   1              ENABLE;
 100   1      }
 101          
 102          //USB中断服务子程序
 103          void fn_usb_isr()
 104          {
 105   1              unsigned int i_st;
 106   1      
 107   1              bEPPflags.bits.in_isr = 1;
 108   1      
 109   1              i_st = D12_ReadInterruptRegister();//读取中断寄存器
 110   1      
 111   1              if(i_st != 0) {
 112   2                      if(i_st & D12_INT_BUSRESET) {
 113   3                              bus_reset();//USB总线服务
 114   3                              bEPPflags.bits.bus_reset = 1;
 115   3                      }
 116   2      
 117   2                      if(i_st & D12_INT_EOT)
C51 COMPILER V7.04   ISR                                                                   12/18/2005 18:05:21 PAGE 3   

 118   2                              dma_eot();//DMA传输结束
 119   2      
 120   2                      if(i_st & D12_INT_SUSPENDCHANGE)
 121   2                              bEPPflags.bits.suspend = 1;//挂起改变
 122   2      
 123   2                      if(i_st & D12_INT_ENDP0IN)
 124   2                              ep0_txdone();//端点0IN中断
 125   2                      if(i_st & D12_INT_ENDP0OUT)
 126   2                              ep0_rxdone();//端点0OUT中断
 127   2                      if(i_st & D12_INT_ENDP1IN)
 128   2                              ep1_txdone();//端点1IN中断
 129   2                      if(i_st & D12_INT_ENDP1OUT)
 130   2                              ep1_rxdone();//端点1OUT中断
 131   2                      if(i_st & D12_INT_ENDP2IN)
 132   2                              main_txdone();//端点2IN中断
 133   2                      if(i_st & D12_INT_ENDP2OUT)
 134   2                              main_rxdone();//端点2OUT中断
 135   2              }
 136   1      
 137   1              bEPPflags.bits.in_isr = 0;
 138   1      }
 139          
 140          //总线复位处理子程序
 141          void bus_reset(void)
 142          {
 143   1      }
 144          
 145          //端点0OUT中断
 146          void ep0_rxdone(void)
 147          {
 148   1              unsigned char ep_last, i;
 149   1      
 150   1              ep_last = D12_ReadLastTransactionStatus(0); //清中断标志
 151   1      
 152   1              if (ep_last & D12_SETUPPACKET) {
 153   2                      //接收到SETUP包
 154   2                      ControlData.wLength = 0;
 155   2                      ControlData.wCount = 0;
 156   2      
 157   2                      if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
 158   2                              (unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) {
 159   3                              //SETUP包出错,返回
 160   3                              D12_SetEndpointStatus(0, 1);
 161   3                              D12_SetEndpointStatus(1, 1);
 162   3                              bEPPflags.bits.control_state = USB_IDLE;
 163   3                              return;
 164   3                      }
 165   2      
 166   2                      ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
 167   2                      ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
 168   2                      ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);
 169   2      
 170   2                      //对控制端点的输入/输出进行应答
 171   2                      D12_AcknowledgeEndpoint(0);
 172   2                      D12_AcknowledgeEndpoint(1);
 173   2      
 174   2                      ControlData.wLength = ControlData.DeviceRequest.wLength;
 175   2                      ControlData.wCount = 0;
 176   2      
 177   2                      if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) {
 178   3                              //从主机传输数据
 179   3                              bEPPflags.bits.setup_packet = 1;
C51 COMPILER V7.04   ISR                                                                   12/18/2005 18:05:21 PAGE 4   

 180   3                              bEPPflags.bits.control_state = USB_TRANSMIT;            /* get command */
 181   3                      }
 182   2                      else {
 183   3                              if (ControlData.DeviceRequest.wLength == 0) {
 184   4                                      bEPPflags.bits.setup_packet = 1;
 185   4                                      bEPPflags.bits.control_state = USB_IDLE;                /* set command */
 186   4                              }
 187   3                              else {
 188   4                                      if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) {
 189   5                                              //接收数据长度为0
 190   5                                              bEPPflags.bits.control_state = USB_IDLE;
 191   5                                              D12_SetEndpointStatus(0, 1);
 192   5                                              D12_SetEndpointStatus(1, 1);
 193   5                                      }
 194   4                                      else {
 195   5                                              bEPPflags.bits.control_state = USB_RECEIVE;     //设置接收状态
 196   5                                      }
 197   4                              } // set command with data
 198   3                      } // else set command
 199   2              } // if setup packet
 200   1      
 201   1              else if (bEPPflags.bits.control_state == USB_RECEIVE) {
 202   2                      //接收数据
 203   2                      i =     D12_ReadEndpoint(0, EP0_PACKET_SIZE,
 204   2                              ControlData.dataBuffer + ControlData.wCount);
 205   2                      ControlData.wCount += i;
 206   2                      if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) {
 207   3                              //数据接收完毕
 208   3                              bEPPflags.bits.setup_packet = 1;
 209   3                              bEPPflags.bits.control_state = USB_IDLE;
 210   3                      }
 211   2              }
 212   1              else {
 213   2                      bEPPflags.bits.control_state = USB_IDLE;//进入等待状态
 214   2              }
 215   1      }
 216          
 217          //端点0IN处理
 218          void ep0_txdone(void)
 219          {
 220   1              short i = ControlData.wLength - ControlData.wCount;
 221   1              D12_ReadLastTransactionStatus(1); //清中断标志位
 222   1              if (bEPPflags.bits.control_state != USB_TRANSMIT) 
 223   1                      return;//非发送状态,返回
 224   1      
 225   1              if( i >= EP0_PACKET_SIZE) {
 226   2                      //剩下数据大于16字节,发送16字节
 227   2                      D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
 228   2                      ControlData.wCount += EP0_PACKET_SIZE;
 229   2                      bEPPflags.bits.control_state = USB_TRANSMIT;
 230   2              }
 231   1              else if( i != 0) {
 232   2                      //发送剩下数据
 233   2                      D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
 234   2                      ControlData.wCount += i;
 235   2                      bEPPflags.bits.control_state = USB_IDLE;
 236   2              }
 237   1              else if (i == 0){
 238   2                      D12_WriteEndpoint(1, 0, 0); //发送完毕,发送0字节
 239   2                      bEPPflags.bits.control_state = USB_IDLE;
 240   2              }
 241   1      }
C51 COMPILER V7.04   ISR                                                                   12/18/2005 18:05:21 PAGE 5   

 242          
 243          //DMA结束处理
 244          void dma_eot(void)
 245          {
 246   1      }
 247          
 248          //端点1OUT处理
 249          void ep1_txdone(void)
 250          {
 251   1              D12_ReadLastTransactionStatus(3); //清中断标志位
 252   1      }
 253          
 254          //端点1IN处理
 255          void ep1_rxdone(void)
 256          {
 257   1              unsigned char len;
 258   1      
 259   1              D12_ReadLastTransactionStatus(2); //清中断标志位
 260   1              len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);//读取数据
 261   1              if(len != 0)
 262   1                      bEPPflags.bits.ep1_rxdone = 1;//标志接收到数据
 263   1      }
 264          
 265          //主端点OUT控制
 266          void main_txdone(void)
 267          {
 268   1      //      unsigned char len,epstatus;
 269   1      
 270   1              D12_ReadLastTransactionStatus(5); //清中断标志位
 271   1      }
 272          
 273          //主端点IN控制
 274          void main_rxdone(void)
 275          {
 276   1              unsigned char len,epstatus;
 277   1      
 278   1              D12_ReadLastTransactionStatus(4); //清中断标志位
 279   1      
 280   1              //接收数据
 281   1              len = D12_ReadEndpoint(4, 64, EpBuf);
 282   1              epstatus=D12_ReadEndpointStatus(4);
 283   1              epstatus &= 0x60;
 284   1              if (epstatus == 0x60)
 285   1                      len = D12_ReadEndpoint(4, 64, EpBuf);//读取双缓冲区数据
 286   1      }
 287          
 288          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    962    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      8       9
   IDATA SIZE       =     54    ----
   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 + -