📄 mainloop.lst
字号:
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 + -