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

📄 mainloop.lst

📁 用于设备工作时间监控的下位机源码
💻 LST
📖 第 1 页 / 共 2 页
字号:

 304   1      
 305   1      
 306   1      
 307   1      
 308   1              /* Main program loop */
 309   1              while( TRUE ){
 310   2                      if (MinuteCount >= WriteUseMinuteTime){
 311   3                              MinuteCount = 0;
 312   3      
 313   3                              TempValue = (unsigned char)((UsedMinuteTime / 256 / 256 / 256) & 0xFF);
 314   3                              RxWrite24C02OneByte(0,TempValue);
 315   3                              TempValue = (unsigned char)((UsedMinuteTime / 256 / 256) & 0xFF);
 316   3                              RxWrite24C02OneByte(1,TempValue);
 317   3                              TempValue = (unsigned char)((UsedMinuteTime / 256) & 0xFF);
 318   3                              RxWrite24C02OneByte(2,TempValue);
 319   3                              TempValue = (unsigned char)(UsedMinuteTime & 0xFF);
 320   3                              RxWrite24C02OneByte(3,TempValue);
 321   3                      }
 322   2      
 323   2                      if (bEPPflags.bits.timer){
 324   3                              DISABLE;//定时器溢出,检测按键状态
 325   3                              bEPPflags.bits.timer = 0;
 326   3                              ENABLE;
 327   3      
 328   3                              if(bEPPflags.bits.configuration)//设备未配置返回
 329   3                                      check_key_LED();
 330   3                      }
 331   2      
 332   2                      if(RI) {
 333   3                              key = _getkey();//按键输入
 334   3                              switch(key) {//显示查询状态
 335   4                                      case 'i':
 336   4                                              if(bEPPflags.bits.control_state == USB_IDLE)
 337   4                                                      printf("Control state = USB_IDLE.");
 338   4                                              else if(bEPPflags.bits.control_state == USB_RECEIVE)
 339   4                                                      printf("Control state = USB_RECEIVE.");
 340   4                                              else if(bEPPflags.bits.control_state == USB_TRANSMIT)
 341   4                                                      printf("Control state = USB_TRANSMIT.");
 342   4                                              printf(" ControlData.wCount = %x.\n", ControlData.wCount);
 343   4                                              printf("Endpoint 4 (Bulk Out) Status = %bx, Endpoint 5 (Bulk In) Status = %bx.\n",
 344   4                                                 D12_ReadEndpointStatus(4), D12_ReadEndpointStatus(5));
 345   4                                              if(bEPPflags.bits.dma_state == DMA_IDLE)
 346   4                                                      printf("DMA_State = DMA_IDLE.\n");
 347   4                                              else if(bEPPflags.bits.dma_state == DMA_RUNNING)
 348   4                                                      printf("DMA_State = DMA_RUNNING.\n");
 349   4                                              else if(bEPPflags.bits.dma_state == DMA_PENDING)
 350   4                                                      printf("DMA_State = DMA_PENDING.\n");
 351   4      
 352   4                                              printf("Last Device Request: bmRequestType = 0x%bx, bRequest= 0x%bx, wValue = 0x%x, wLength = 0x%x, w
             -Index = 0x%x.\n",
 353   4      
 354   4                                                      ControlData.DeviceRequest.bmRequestType,
 355   4                                                      ControlData.DeviceRequest.bRequest,
 356   4                                                      ControlData.DeviceRequest.wValue,
 357   4                                                      ControlData.DeviceRequest.wLength,
 358   4                                                      ControlData.DeviceRequest.wIndex);
 359   4      
 360   4                                              printf("Data: ");
 361   4                                              for(i = 0; i < ControlData.DeviceRequest.wLength; i ++)
 362   4                                                      printf("0x%bx, ", *((ControlData.dataBuffer)+i));
 363   4                                              printf("\n");
 364   4      
C51 COMPILER V7.04   MAINLOOP                                                              12/18/2005 18:05:21 PAGE 7   

 365   4                                              break;
 366   4                                      case '\r':
 367   4                                              reconnect_USB();
 368   4                                              break;
 369   4      
 370   4                                      case 'v':
 371   4                                              if(bEPPflags.bits.verbose == 0) {
 372   5                                                      printf("Verbose Mode = ON.\n");
 373   5                                                      DISABLE;
 374   5                                                      bEPPflags.bits.verbose = 1;
 375   5                                                      ENABLE;
 376   5                                              }
 377   4                                              else {
 378   5                                                      printf("Verbose Mode = OFF.\n");
 379   5                                                      DISABLE;
 380   5                                                      bEPPflags.bits.verbose = 0;
 381   5                                                      ENABLE;
 382   5                                              }
 383   4                                              break;
 384   4                                      default:
 385   4                                              break;
 386   4                              }
 387   3                      }
 388   2      
 389   2                      if (bEPPflags.bits.bus_reset) {//设备复位处理
 390   3                              DISABLE;
 391   3                              bEPPflags.bits.bus_reset = 0;
 392   3                              ENABLE;
 393   3                              // Release D12's SUSPEND pin after bus reset
 394   3                              // Enable 74HCT123 pulse generation before disconnect
 395   3                              D12SUSPD = 1;
 396   3                      } // if bus reset
 397   2      
 398   2                      if (bEPPflags.bits.suspend) {//挂起改变处理
 399   3                              DISABLE;
 400   3                              bEPPflags.bits.suspend= 0;
 401   3                              ENABLE;
 402   3      
 403   3                              if(D12SUSPD == 1) {//挂起处理
 404   4                                      D12SUSPD = 0;
 405   4                                      P0 = 0xFF;
 406   4                                      P1 = 0xFF;
 407   4                                      P2 = 0xFF;
 408   4                                      P3 = 0xFF;
 409   4                                      D12_SetDMA(0xC3);
 410   4                                      D12SUSPD = 1;
 411   4                                      PCON |= 0x02;
 412   4                                      while (1);
 413   4                              }
 414   3                      } // if suspend change
 415   2      
 416   2                      if (bEPPflags.bits.setup_packet){//Setup包处理
 417   3                              DISABLE;
 418   3                              bEPPflags.bits.setup_packet = 0;
 419   3                              ENABLE;
 420   3                              control_handler();//调用请求处理子程序
 421   3                              D12SUSPD = 1;
 422   3                      } // if setup_packet
 423   2      
 424   2                      if(bEPPflags.bits.setup_dma != 0) {//DMA状态改变处理
 425   3                              DISABLE;
 426   3                              bEPPflags.bits.setup_dma --;
C51 COMPILER V7.04   MAINLOOP                                                              12/18/2005 18:05:21 PAGE 8   

 427   3                              ENABLE;
 428   3                              setup_dma();
 429   3                      } // if setup_dma
 430   2      
 431   2              } // Main Loop
 432   1      }
 433          
 434          //返回stall应答
 435          void stall_ep0(void)
 436          {
 437   1              D12_SetEndpointStatus(0, 1);
 438   1              D12_SetEndpointStatus(1, 1);
 439   1      }
 440          
 441          //断开USB总线
 442          void disconnect_USB(void)
 443          {
 444   1              // Initialize D12 configuration
 445   1              D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
 446   1      }
 447          
 448          //连接USB总线
 449          void connect_USB(void)
 450          {
 451   1              // reset event flags
 452   1              DISABLE;
 453   1              bEPPflags.value = 0;//清除所有状态
 454   1              ENABLE;
 455   1      
 456   1              // V2.1 enable normal+sof interrupt
 457   1              D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE);
 458   1      
 459   1              // Initialize D12 configuration
 460   1              D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
 461   1      }
 462          
 463          //重新连接到USB总线
 464          void reconnect_USB(void)
 465          {
 466   1              unsigned long clk_cnt;
 467   1      
 468   1              MCU_LED0 = 0;
 469   1              MCU_LED1 = 0;
 470   1      
 471   1              // Pull-down D12's SUSPEND pin
 472   1              // Disable 74HCT123 pulse generation before disconnect
 473   1              // Release D12's SUSPEND pin after receiving bus reset from host
 474   1              D12SUSPD = 0;
 475   1              disconnect_USB();
 476   1      
 477   1              printf("Wait for 1 second ...\n");
 478   1      
 479   1              clk_cnt = ClockTicks;
 480   1              while(ClockTicks < clk_cnt + 20)
 481   1                      ;
 482   1      
 483   1              connect_USB();
 484   1      
 485   1              MCU_LED0 = 1;
 486   1              MCU_LED1 = 1;
 487   1      }
 488          
C51 COMPILER V7.04   MAINLOOP                                                              12/18/2005 18:05:21 PAGE 9   

 489          //恢复到未配置状态
 490          void init_unconfig(void)
 491          {
 492   1      //      unsigned char i;
 493   1      
 494   1              D12_SetEndpointEnable(0);       /* Disable all endpoints but EPP0. */
 495   1      }
 496          
 497          //设置配置状态
 498          void init_config(void)
 499          {
 500   1              D12_SetEndpointEnable(1);       /* Enable  generic/iso endpoints. */
 501   1      }
 502          
 503          //从端点号1发送数据
 504          void single_transmit(unsigned char * buf, unsigned char len)
 505          {
 506   1              if( len <= EP0_PACKET_SIZE) {
 507   2                      D12_WriteEndpoint(1, len, buf);
 508   2              }
 509   1      }
 510          
 511          //发送端点号1建立代码
 512          void code_transmit(unsigned char code * pRomData, unsigned short len)
 513          {
 514   1              ControlData.wCount = 0;
 515   1              if(ControlData.wLength > len)
 516   1                      ControlData.wLength = len;
 517   1      
 518   1              ControlData.pData = pRomData;
 519   1              if( ControlData.wLength >= EP0_PACKET_SIZE) {
 520   2                      D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData);//发送16字节数据
 521   2                      ControlData.wCount += EP0_PACKET_SIZE;
 522   2                      DISABLE;
 523   2                      bEPPflags.bits.control_state = USB_TRANSMIT;
 524   2                      ENABLE;
 525   2              }
 526   1              else {
 527   2                      D12_WriteEndpoint(1, ControlData.wLength, pRomData);//发送16字节内数据
 528   2                      ControlData.wCount += ControlData.wLength;
 529   2                      DISABLE;
 530   2                      bEPPflags.bits.control_state = USB_IDLE;
 531   2                      ENABLE;
 532   2              }
 533   1      }
 534          
 535          //LED和按键处理子程序
 536          void check_key_LED(void)
 537          {
 538   1              static unsigned char c, last_key = 0xf;
 539   1      
 540   1              c = MCU_SWM0 & MCU_SWM1;
 541   1              c &= 0x0f;
 542   1              if (c != last_key) {
 543   2                      D12_WriteEndpoint(3, 1, &c);//发送按键状态
 544   2              }
 545   1      
 546   1              last_key = c;
 547   1      
 548   1              if(bEPPflags.bits.ep1_rxdone) {
 549   2                      DISABLE;
 550   2                      bEPPflags.bits.ep1_rxdone = 0;
C51 COMPILER V7.04   MAINLOOP                                                              12/18/2005 18:05:21 PAGE 10  

 551   2                      ENABLE;
 552   2                      MCU_LED0 = !(GenEpBuf[3] & 0x1);//改变LED状态
 553   2                      MCU_LED1 = !(GenEpBuf[3] & 0x2);
 554   2              }
 555   1      }
 556          
 557          //DMA建立子程序
 558          void setup_dma()
 559          {
 560   1              ioSize = ioRequest.uSize;
 561   1              ioCount = 0;
 562   1      
 563   1              DISABLE;
 564   1              bEPPflags.bits.dma_state = DMA_RUNNING;
 565   1              ENABLE;
 566   1      
 567   1              single_transmit(0, 0);
 568   1      
 569   1              if(ioRequest.bCommand & 0x1) {
 570   2                      if(ioSize > 64 || ioSize == 0) {
 571   3                              //传输大于64字节数据
 572   3                              D12_WriteEndpoint(5, 64, EpBuf);
 573   3                              ioCount += 64;
 574   3                      }
 575   2                      else {
 576   3                              //传输64字节数据
 577   3                              D12_WriteEndpoint(5, ioSize, EpBuf);
 578   3                              ioCount += ioSize;
 579   3                      }
 580   2              }
 581   1      }
 582          
 583          //请求处理子程序
 584          void control_handler()
 585          {
 586   1              unsigned char type, req;
 587   1      
 588   1              type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
 589   1              req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
 590   1      
 591   1              help_devreq(type, req); //显示设备请求
 592   1      
 593   1              if (type == USB_STANDARD_REQUEST)
 594   1                      (*StandardDeviceRequest[req])();//调用标准请求
 595   1              else if (type == USB_VENDOR_REQUEST)
 596   1                      (*VendorDeviceRequest[req])();//调用厂商请求
 597   1              else
 598   1                      stall_ep0();
 599   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1863    ----
   CONSTANT SIZE    =    919    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     48      18
   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 + -