📄 hyperterminal.c
字号:
#include "HyperTerminal.h"
#include <stdio.h>
#include <stdlib.h>
void Set_RTC(void);//set RTC
/*****************************************************************************/
char idata SerialBuffer[MAX_SERIAL_BUFFER_SIZE];
char idata PromptBuffer[MAX_PROMPT_BUFFER_SIZE];
char idata CursorPosion;
char idata ExecCommandFlag;
unsigned char gLedFlag=0xff;
unsigned char gDig[6];
unsigned char gBeep;
#define XBYTE ((char *) 0x20000L)
#define LAMPADDR 0xd000
#define LEDADDR 0xc000
#define LEDDATAADDR 0x9000
#define BEEPADDR 0xa000
void DisplayDomain();
void DisplayTel();
void Read_RTC(void);
extern unsigned char read_rtc_code[7];
extern unsigned char set_rtc_code[7];
extern unsigned char gIrArr[6];
void InitADC0831();
unsigned char ReadADC0831() ;
unsigned char rtemp();
void Write2402(unsigned char add,unsigned char dat) ;
unsigned char Read2402(unsigned char add) ;
COMMAND CommandList[MAX_COMMAND_NUM] = {
{"help",Help," help -- Command help"},
{"prompt",Prompt," prompt <string> -- Change a prompt"},
{"clear",Clear," clear -- Clear screen"},
{"lamp",Lamp," lamp <no on/off> -- Change a prompt"},
{"led",Led," led <no number>-- display data"},
{"beep",Beep," beep <on/off>-- Change a prompt"},
{"lcd",Lcd," lcd -- display screen"},
{"reboot",Reboot," reboot -- Reboot the MCU"},
{"relay",Relay," relay <on/off> -- operate relay"},
{"temp",Temp," temp -- read temperature"},
{"writetime",WriteTime," writetime <string> -- set time"},
{"readtime",ReadTime," readtime-- read time"},
{"ad",AD," ad-- display ad data"},
{"ir",IR," ir-- display ir data"},
{"writee2prom",WriteE2prom," writee2prom <addr data> -- write e2prom"},
{"reade2prom",ReadE2prom," reade2prom <addr>-- read e2prom"}
};
void Lamp(char argc, const char **argv)
{
char i,j;
argv = argv;
switch(argc)
{
case 3:
i=0xff;
if (strcmp(argv[1],"1")==0) i=0x00;
if (strcmp(argv[1],"2")==0) i=0x01;
if (strcmp(argv[1],"3")==0) i=0x02;
if (strcmp(argv[1],"4")==0) i=0x03;
j=0xff;
if (strcmp(argv[2],"on")==0) j=0x00;
if (strcmp(argv[2],"off")==0) j=0x01;
if ((i==0xff) || (j==0xff))
{
;
}
else
{
if (j==0)
{
j=1;
j=j<<i;
j=j ^ 0xff;
gLedFlag=(gLedFlag & j);
}
else
{
j=1;
j=j<<i;
gLedFlag=(gLedFlag | j);
}
XBYTE[LAMPADDR]=gLedFlag;
}
SerialSendStr("\n");
break;
default:
SerialSendStr(" Invalid 'lamp' command\n");
break;
}
}
void Led(char argc, const char **argv)
{
char i,j;
argv = argv;
switch(argc)
{
case 3:
i=atoi(argv[1]);
j=atoi(argv[2]);
XBYTE[LEDADDR]=0xff;
XBYTE[LEDDATAADDR]=0x30;
XBYTE[LEDADDR]=0xff^ 0x01;
gDig[0]=0xff;
for(i=0;i<6;i++)
gDig[i]=0xff;
i=strlen(argv);
for(j=0;j<i;j++)
{
gDig[j]=argv[1][j];
}
SerialSendStr("\n");
break;
default:
SerialSendStr(" Invalid 'led' command\n");
break;
}
}
void Beep(char argc, const char **argv)
{
char j;
argv = argv;
switch(argc)
{
case 2:
j=0xff;
if (strcmp(argv[1],"off")==0)
{
j=0xfe;
gBeep=(gBeep & j);
XBYTE[BEEPADDR]=gBeep;
}
if (strcmp(argv[1],"on")==0)
{
j=0x01;
gBeep=gBeep | j;
XBYTE[BEEPADDR]=gBeep;
}
SerialSendStr("\n");
break;
default:
SerialSendStr(" Invalid 'beep' command\n");
break;
}
}
void Lcd(char argc, const char **argv)
{
char j;
argv = argv;
switch(argc)
{
case 2:
j=0xff;
if (strcmp(argv[1],"domain")==0)
{
DisplayDomain();
}
if (strcmp(argv[1],"tel")==0)
{
DisplayTel();
}
SerialSendStr("\n");
break;
default:
SerialSendStr(" Invalid 'lcd' command\n");
break;
}
}
void Relay(char argc, const char **argv)
{
char j;
argv = argv;
switch(argc)
{
case 2:
j=0xff;
if (strcmp(argv[1],"off")==0)
{
j=0xbf;
gBeep=(gBeep & j);
XBYTE[BEEPADDR]=gBeep;
}
if (strcmp(argv[1],"on")==0)
{
j=0x40;
gBeep=gBeep | j;
XBYTE[BEEPADDR]=gBeep;
}
SerialSendStr("\n");
break;
default:
SerialSendStr(" Invalid 'relay' command\n");
break;
}
}
void Temp(char argc, const char **argv)
{
unsigned char j;
char str[20];
argv = argv;
switch(argc)
{
case 1:
j=rtemp();
str[0]=(j/100) +0x30;
j=(j % 100);
str[1]=(j/10) +0x30;
j=(j % 10);
str[2]=j +0x30;
str[3]='\n';
SerialSendStr(str);
SerialSendStr("\r\n");
break;
default:
SerialSendStr(" Invalid 'temp' command: too many arguments\r\n");
break;
}
}
void ReadTime(char argc, const char **argv)
{
char str[20];
argv = argv;
switch(argc)
{
case 1:
Read_RTC();
str[0]=((read_rtc_code[6]>>4) & 0x0f) + 0x30;
str[1]=(read_rtc_code[6] & 0x0f) + 0x30;
str[2]='/';
str[3]=((read_rtc_code[5]>>4) & 0x01) + 0x30;
str[4]=(read_rtc_code[5] & 0x0f) + 0x30;
str[5]='/';
str[6]=((read_rtc_code[4]>>4) & 0x03) + 0x30;
str[7]=(read_rtc_code[4] & 0x0f) + 0x30;
str[8]='/';
str[9]=((read_rtc_code[2]>>4) & 0x03) + 0x30;
str[10]=(read_rtc_code[2] & 0x0f) + 0x30;
str[11]='/';
str[12]=((read_rtc_code[1]>>4) & 0x07) + 0x30;
str[13]=(read_rtc_code[1] & 0x0f) + 0x30;
str[14]='/';
str[15]=((read_rtc_code[0]>>4) & 0x07) + 0x30;
str[16]=(read_rtc_code[0] & 0x0f) + 0x30;
str[17]='\n';
str[18]='\r';
SerialSendStr(str);
break;
default:
SerialSendStr(" Invalid 'read' command\r\n");
break;
}
}
void WriteTime(char argc, const char **argv)
{
unsigned char i,j;
argv = argv;
switch(argc)
{
case 8:
i=atoi(argv[7]);
j=((i/10)<<4)+((i % 10));
set_rtc_code[0]=j;
i=atoi(argv[6]);
j=((i/10)<<4)+((i % 10));
set_rtc_code[1]=j;
i=atoi(argv[5]);
j=((i/10)<<4)+((i % 10));
set_rtc_code[2]=j;
i=atoi(argv[4]);
j=((i/10)<<4)+((i % 10));
set_rtc_code[3]=j;
i=atoi(argv[3]);
j=((i/10)<<4)+((i % 10));
set_rtc_code[4]=j;
i=atoi(argv[2]);
j=((i/10)<<4)+((i % 10));
set_rtc_code[5]=j;
i=atoi(argv[1]);
// SerialSendStr(argv[1]);
j=((i/10)<<4)+((i % 10));
set_rtc_code[6]=j;
Set_RTC();
/*
set_rtc_code[0]=01;
set_rtc_code[1]=01;
set_rtc_code[2]=01;
set_rtc_code[3]=01;
set_rtc_code[4]=01;
set_rtc_code[5]=01;
set_rtc_code[6]=01;
Set_RTC();
*/
break;
default:
SerialSendStr(" Invalid 'reboot' command: too many arguments\r\n");
break;
}
}
void AD(char argc, const char **argv)
{
unsigned char j;
char str[20];
argv = argv;
switch(argc)
{
case 1:
InitADC0831();
j=ReadADC0831();
str[0]=(j/100) +0x30;
j=(j % 100);
str[1]=(j/10) +0x30;
j=(j % 10);
str[2]=j +0x30;
str[3]='\n';
SerialSendStr(str);
SerialSendStr("\r\n");
break;
default:
SerialSendStr(" Invalid 'reboot' command: too many arguments\r\n");
break;
}
}
void IR(char argc, const char **argv)
{
argv = argv;
switch(argc)
{
case 1:
SerialSendStr(gIrArr);
SerialSendStr("\r\n");
break;
default:
SerialSendStr(" Invalid 'ir' command: too many arguments\r\n");
break;
}
}
void WriteE2prom(char argc, const char **argv)
{
unsigned char i,j;
argv = argv;
switch(argc)
{
case 3:
i=atoi(argv[1]);
j=atoi(argv[2]);
Write2402(i,j);
SerialSendStr("\r\n");
break;
default:
SerialSendStr(" Invalid 'writee2prom' command: too many arguments\r\n");
break;
}
}
void ReadE2prom(char argc, const char **argv)
{
unsigned char i,j;
char str[20];
argv = argv;
switch(argc)
{
case 2:
i=atoi(argv[1]);
j=Read2402(i);
str[0]=(j/100) +0x30;
j=(j % 100);
str[1]=(j/10) +0x30;
j=(j % 10);
str[2]=j +0x30;
str[3]='\n';
SerialSendStr(str);
SerialSendStr("\r\n");
break;
default:
SerialSendStr(" Invalid 'reade2prom' command: too many arguments\r\n");
break;
}
}
/*****************************************************************************/
void Help(char argc, const char **argv)
{
char i;
argv = argv;
switch(argc)
{
case 1:
for(i = 0; i < MAX_COMMAND_NUM; i++)
{
SerialSendStr(CommandList[i].HelpString);
SerialSendStr("\r\n");
}
SerialSendStr("\r\n");
break;
default:
SerialSendStr(" Invalid 'help' command: too many arguments\r\n");
break;
}
}
void Prompt(char argc, const char **argv)
{
switch(argc)
{
case 2:
if(strlen(argv[1]) >= MAX_PROMPT_BUFFER_SIZE)
{
SerialSendStr(" Warnning:Your argument is too long!\r\n\r\n");
break;
}
memcpy(PromptBuffer,argv[1],MAX_PROMPT_BUFFER_SIZE);
SerialSendStr(" Prompt is chagned to \"");
sprintf(&SerialBuffer[0],"%s\"\r\n\r\n",&PromptBuffer[0]);
SerialSendStr(&SerialBuffer[0]);
break;
default:
SerialSendStr(" Invalid 'prompt' command\r\n");
break;
}
}
void Clear(char argc, const char **argv)
{
argv = argv;
switch(argc)
{
case 1:
SerialSendStr(CLEARSCREEN);
break;
default:
SerialSendStr(" Invalid 'clear' command\r\n");
break;
}
}
void Reboot(char argc, const char **argv)
{
argv = argv;
switch(argc)
{
case 1:
(*(void(*)())0)();
break;
default:
SerialSendStr(" Invalid 'reboot' command: too many arguments\r\n");
SerialSendStr(" Usage:\r\n");
SerialSendStr(" reboot\r\n");
break;
}
}
/*****************************************************************************/
void InitHyperTerminal(void)
{
TMOD |= 0x21; /* timer1, mode 2, 8 bit reload */
SCON = 0x50; /* serial mode 1, 8 bit uart, enable receive */
PCON = 0x80; /* SMOD = 1, double baud */
TH1 = 0xFa; /* baud = 57600, fosc = 11.0592MHZ */
TL1 = 0xFF;
RI = 0; /* clear receive flag */
TI = 0; /* clear send flag */
TR1 = 1; /* start timer1 */
ES = 1; /* enable serial interrupt */
EA = 1; /* enable all interrupt */
IT1=1;
TR0=1;
EX1=1;
XBYTE[BEEPADDR]=0x00;
CursorPosion = 0;
ExecCommandFlag = 0;
memset(&SerialBuffer[0],'\0',MAX_SERIAL_BUFFER_SIZE);
memcpy(&PromptBuffer[0],"TW>>",MAX_PROMPT_BUFFER_SIZE);
// SerialSendStr(F_LIGHTGREEN);
// SerialSendStr(B_BLACK);
SerialSendStr(CLEARSCREEN);
SerialSendStr("-----------------------------\r\n");
SerialSendStr(" ToWin Hyper Terminal,by xieshiyi\r\n");
SerialSendStr(" http://www.towintec.cn \r\n");
SerialSendStr("-----------------------------\r\n");
SerialSendStr("\r\n");
SerialSendStr(&PromptBuffer[0]);
}
void SerialSendByte(char dat)
{
SBUF = dat;
while(TI == 0);
TI = 0;
}
void SerialSendStr(char *str)
{
while(*str != '\0')
{
SerialSendByte(*str);
str++;
}
}
void SerialInterrupt(void) interrupt 4 using 3
{
char SbufTemp;
if(RI)
{
RI = 0;
SbufTemp = SBUF;
switch(SbufTemp)
{
case 0x08:
case 0x06:
case 0x07:
case 0x7E:
case 0x7F:
if(CursorPosion > 0)
{
CursorPosion--;
SerialSendByte(0x08);
SerialSendByte(' ');
SerialSendByte(0x08);
}
SerialBuffer[CursorPosion] = '\0';
break;
case '\r':
case '\n':
case '\0':
SerialSendByte('\r');
SerialSendByte('\n');
ExecCommandFlag = 1;
break;
case '\t':
break;
default:
if(CursorPosion < MAX_SERIAL_BUFFER_SIZE)
{
SerialBuffer[CursorPosion] = SbufTemp;
SerialSendByte(SbufTemp);
CursorPosion++;
}
else
{
CursorPosion = 0;
memset(&SerialBuffer[0],'\0',MAX_SERIAL_BUFFER_SIZE);
SerialSendStr("\r\n Warnning:Your command string is too long!\r\n\r\n");
SerialSendStr(&PromptBuffer[0]);
}
break;
}
}
}
void ParseArgs(char *argstr,char *argc_p,char **argv, char **resid)
{
char argc = 0;
char c;
PARSESTATE stackedState,lastState = PS_WHITESPACE;
while ((c = *argstr) != 0)
{
PARSESTATE newState;
if (c == ';' && lastState != PS_STRING && lastState != PS_ESCAPE)
break;
if (lastState == PS_ESCAPE)
{
newState = stackedState;
}
else if (lastState == PS_STRING)
{
if (c == '"')
{
newState = PS_WHITESPACE;
*argstr = 0;
}
else
{
newState = PS_STRING;
}
}
else if ((c == ' ') || (c == '\t'))
{
*argstr = 0;
newState = PS_WHITESPACE;
}
else if (c == '"')
{
newState = PS_STRING;
*argstr++ = 0;
argv[argc++] = argstr;
}
else if (c == '\\')
{
stackedState = lastState;
newState = PS_ESCAPE;
}
else
{
if (lastState == PS_WHITESPACE)
{
argv[argc++] = argstr;
}
newState = PS_TOKEN;
}
lastState = newState;
argstr++;
}
argv[argc] = NULL;
if (argc_p != NULL)
*argc_p = argc;
if (*argstr == ';')
{
*argstr++ = '\0';
}
*resid = argstr;
}
void ExecCommand(char *buf)
{
char argc,*argv[8],*resid,i;
COMMAND *Command = 0;
while(*buf)
{
memset(argv,0,sizeof(argv));
ParseArgs(buf, &argc, argv, &resid);
if(argc > 0)
{
for(i = 0; i < MAX_COMMAND_NUM; i++)
{
Command = &CommandList[i];
// if(strncmp(Command->CommandName,argv[0],strlen(argv[0])) == 0)
if(strcmp(Command->CommandName,argv[0]) == 0)
break;
else
Command = 0;
}
if(Command == 0)
{
SerialSendStr(" Could not found \"");
SerialSendStr(argv[0]);
SerialSendStr("\" command\r\n");
SerialSendStr(" If you want to konw available commands, type 'help'\r\n\r\n");
}
else
{
Command->CommandFunc(argc,argv);
}
}
buf = resid;
}
}
void RunHyperTerminal(void)
{
if(ExecCommandFlag)
{
ExecCommand(&SerialBuffer[0]);
SerialSendStr(&PromptBuffer[0]);
memset(&SerialBuffer[0],'\0',MAX_SERIAL_BUFFER_SIZE);
CursorPosion = 0;
ExecCommandFlag = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -