📄 hyperterminal.lst
字号:
459 1 }
460 /*****************************************************************************/
461 void InitHyperTerminal(void)
462 {
463 1 TMOD |= 0x21; /* timer1, mode 2, 8 bit reload */
464 1 SCON = 0x50; /* serial mode 1, 8 bit uart, enable receive */
465 1 PCON = 0x80; /* SMOD = 1, double baud */
466 1 TH1 = 0xFa; /* baud = 57600, fosc = 11.0592MHZ */
467 1 TL1 = 0xFF;
468 1 RI = 0; /* clear receive flag */
469 1 TI = 0; /* clear send flag */
470 1 TR1 = 1; /* start timer1 */
471 1 ES = 1; /* enable serial interrupt */
472 1 EA = 1; /* enable all interrupt */
473 1 IT1=1;
474 1 TR0=1;
475 1 EX1=1;
476 1
477 1 XBYTE[BEEPADDR]=0x00;
478 1 CursorPosion = 0;
479 1 ExecCommandFlag = 0;
480 1 memset(&SerialBuffer[0],'\0',MAX_SERIAL_BUFFER_SIZE);
481 1 memcpy(&PromptBuffer[0],"TW>>",MAX_PROMPT_BUFFER_SIZE);
482 1 // SerialSendStr(F_LIGHTGREEN);
483 1 // SerialSendStr(B_BLACK);
484 1 SerialSendStr(CLEARSCREEN);
485 1 SerialSendStr("-----------------------------\r\n");
486 1 SerialSendStr(" ToWin Hyper Terminal,by xieshiyi\r\n");
487 1 SerialSendStr(" http://www.towintec.cn \r\n");
488 1 SerialSendStr("-----------------------------\r\n");
C51 COMPILER V7.50 HYPERTERMINAL 01/02/2009 14:29:36 PAGE 9
489 1 SerialSendStr("\r\n");
490 1 SerialSendStr(&PromptBuffer[0]);
491 1 }
492
493 void SerialSendByte(char dat)
494 {
495 1 SBUF = dat;
496 1 while(TI == 0);
497 1 TI = 0;
498 1 }
499
500 void SerialSendStr(char *str)
501 {
502 1 while(*str != '\0')
503 1 {
504 2 SerialSendByte(*str);
505 2 str++;
506 2 }
507 1 }
508
509 void SerialInterrupt(void) interrupt 4 using 3
510 {
511 1 char SbufTemp;
512 1 if(RI)
513 1 {
514 2 RI = 0;
515 2 SbufTemp = SBUF;
516 2 switch(SbufTemp)
517 2 {
518 3 case 0x08:
519 3 case 0x06:
520 3 case 0x07:
521 3 case 0x7E:
522 3 case 0x7F:
523 3 if(CursorPosion > 0)
524 3 {
525 4 CursorPosion--;
526 4 SerialSendByte(0x08);
527 4 SerialSendByte(' ');
528 4 SerialSendByte(0x08);
529 4 }
530 3 SerialBuffer[CursorPosion] = '\0';
531 3 break;
532 3 case '\r':
533 3 case '\n':
534 3 case '\0':
535 3 SerialSendByte('\r');
536 3 SerialSendByte('\n');
537 3 ExecCommandFlag = 1;
538 3 break;
539 3 case '\t':
540 3 break;
541 3 default:
542 3 if(CursorPosion < MAX_SERIAL_BUFFER_SIZE)
543 3 {
544 4 SerialBuffer[CursorPosion] = SbufTemp;
545 4 SerialSendByte(SbufTemp);
546 4 CursorPosion++;
547 4 }
548 3 else
549 3 {
550 4 CursorPosion = 0;
C51 COMPILER V7.50 HYPERTERMINAL 01/02/2009 14:29:36 PAGE 10
551 4 memset(&SerialBuffer[0],'\0',MAX_SERIAL_BUFFER_SIZE);
552 4 SerialSendStr("\r\n Warnning:Your command string is too long!\r\n\r\n");
553 4 SerialSendStr(&PromptBuffer[0]);
554 4 }
555 3 break;
556 3 }
557 2 }
558 1 }
559
560 void ParseArgs(char *argstr,char *argc_p,char **argv, char **resid)
561 {
562 1 char argc = 0;
563 1 char c;
564 1 PARSESTATE stackedState,lastState = PS_WHITESPACE;
565 1
566 1 while ((c = *argstr) != 0)
567 1 {
568 2 PARSESTATE newState;
569 2
570 2 if (c == ';' && lastState != PS_STRING && lastState != PS_ESCAPE)
571 2 break;
572 2
573 2 if (lastState == PS_ESCAPE)
574 2 {
575 3 newState = stackedState;
576 3 }
577 2 else if (lastState == PS_STRING)
578 2 {
579 3 if (c == '"')
580 3 {
581 4 newState = PS_WHITESPACE;
582 4 *argstr = 0;
583 4 }
584 3 else
585 3 {
586 4 newState = PS_STRING;
587 4 }
588 3 }
589 2 else if ((c == ' ') || (c == '\t'))
590 2 {
591 3 *argstr = 0;
592 3 newState = PS_WHITESPACE;
593 3 }
594 2 else if (c == '"')
595 2 {
596 3 newState = PS_STRING;
597 3 *argstr++ = 0;
598 3 argv[argc++] = argstr;
599 3 }
600 2 else if (c == '\\')
601 2 {
602 3 stackedState = lastState;
603 3 newState = PS_ESCAPE;
604 3 }
605 2 else
606 2 {
607 3 if (lastState == PS_WHITESPACE)
608 3 {
609 4 argv[argc++] = argstr;
610 4 }
611 3 newState = PS_TOKEN;
612 3 }
C51 COMPILER V7.50 HYPERTERMINAL 01/02/2009 14:29:36 PAGE 11
613 2
614 2 lastState = newState;
615 2 argstr++;
616 2 }
617 1
618 1 argv[argc] = NULL;
619 1 if (argc_p != NULL)
620 1 *argc_p = argc;
621 1
622 1 if (*argstr == ';')
623 1 {
624 2 *argstr++ = '\0';
625 2 }
626 1 *resid = argstr;
627 1 }
628
629 void ExecCommand(char *buf)
630 {
631 1 char argc,*argv[8],*resid,i;
632 1 COMMAND *Command = 0;
633 1
634 1 while(*buf)
635 1 {
636 2 memset(argv,0,sizeof(argv));
637 2 ParseArgs(buf, &argc, argv, &resid);
638 2 if(argc > 0)
639 2 {
640 3 for(i = 0; i < MAX_COMMAND_NUM; i++)
641 3 {
642 4 Command = &CommandList[i];
643 4 // if(strncmp(Command->CommandName,argv[0],strlen(argv[0])) == 0)
644 4 if(strcmp(Command->CommandName,argv[0]) == 0)
645 4 break;
646 4 else
647 4 Command = 0;
648 4 }
649 3 if(Command == 0)
650 3 {
651 4 SerialSendStr(" Could not found \"");
652 4 SerialSendStr(argv[0]);
653 4 SerialSendStr("\" command\r\n");
654 4 SerialSendStr(" If you want to konw available commands, type 'help'\r\n\r\n");
655 4 }
656 3 else
657 3 {
658 4 Command->CommandFunc(argc,argv);
659 4 }
660 3 }
661 2 buf = resid;
662 2 }
663 1 }
664
665 void RunHyperTerminal(void)
666 {
667 1 if(ExecCommandFlag)
668 1 {
669 2 ExecCommand(&SerialBuffer[0]);
670 2 SerialSendStr(&PromptBuffer[0]);
671 2 memset(&SerialBuffer[0],'\0',MAX_SERIAL_BUFFER_SIZE);
672 2 CursorPosion = 0;
673 2 ExecCommandFlag = 0;
674 2 }
C51 COMPILER V7.50 HYPERTERMINAL 01/02/2009 14:29:36 PAGE 12
675 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 3373 ----
CONSTANT SIZE = 1432 ----
XDATA SIZE = 152 163
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = 50 ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -