📄 cmdproc.c
字号:
static char code menu[] = __DATE2__ " "__TIME__
"\n"
"调试程序\n"
"+*************** Command proc 2005.07.22 VER1.00 **************+\n"
"+ command -+ syntax -----+ function ---------------------------+\n"
"| Read | R adds | read adds mem |\n"
"| Write | W adds:data | write adds mem with data |\n"
"| Display | D | display current measurement values |\n"
"| Set Time | T hh:mm:ss | set time |\n"
"| Swt Date | I mm:ss.ttt | set interval time |\n"
"| Test | Z xxxx:xx | Test |\n"
"| Fill Mem | C ? | ?=(0,1) |\n"
"+----------+-------------+-------------------------------------+\n";
#include <reg52.h>
#include <stdio.h> /* standard I/O .h-file */
#include <absacc.h>
#include <ctype.h> /* character functions */
#define CNTLQ 0x11
#define CNTLS 0x13
#define DEL 0x7F
#define BACKSPACE 0x08
#define CR 0x0D
#define LF 0x0A
char code ERROR [] = "\n*** ERROR: %s\n"; /* ERROR message string in code */
extern void set_time(unsigned char * buffer);
extern void set_date(unsigned char * buffer);
extern void disp_time(void);
extern void disp_date(void);
sbit Bell = P1^0;
sbit LcdPwrSw = P1^1;
sbit RS485Rec = P1^2;
void getline (unsigned char idata *line, unsigned char n)
{
unsigned char cnt = 0;
unsigned char c;
// RS485Rec = 0;
do
{
if ((c = _getkey ()) == CR) c = LF; /* read character */
if (c == BACKSPACE || c == DEL) /* process backspace */
{
if (cnt != 0)
{
cnt--; /* decrement count */
line--; /* and line pointer */
// RS485Rec = 1;
putchar (0x08); /* echo backspace */
putchar (' ');
putchar (0x08);
while(!TI);
// RS485Rec = 0;
}
}
else if (c != CNTLQ && c != CNTLS) /* ignore Control S/Q */
{
// RS485Rec = 1;
putchar ((char) (*line = c)); /* echo and store character */
while(!TI);
// RS485Rec = 0;
line++; /* increment line pointer */
cnt++; /* and count */
}
}while (cnt < n - 1 && c != LF); /* check limit and line feed */
*line = 0; /* mark end of string */
// RS485Rec = 1;
}
void InitSerialPort(void)
{
SCON = 0x50; // SCON: mode 1, 8-bit UART, enable rcvr
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit reload
// TH1 = 253; // TH1: reload value for 9600 baud @ 11.0592MHz
TH1 = 250; // TH1: reload value for 9600 baud @ 22.1184MHz
TR1 = 1; // TR1: timer 1 run
TI = 1; // TI: set TI to send first char of UART
}
void Test(unsigned char * buffer)
{
unsigned char args; /* number of arguments */
unsigned int iAdds;
args = sscanf (buffer, "%4x", &iAdds);
if (args == EOF)
{
printf (ERROR, "INVALID ADDS FORMAT");
}
else /* if inputs valid then */
{
printf ("Will Loop Adds=0x%04x\n",iAdds);
while(1)
{
args=XBYTE[iAdds];
}
}
}
void DispMem(unsigned char * buffer)
{
unsigned char args,uData; /* number of arguments */
unsigned int iAdds;
unsigned char i,Temp;
args = sscanf (buffer, "%4x", &iAdds);
if (args == EOF)
{
printf (ERROR, "INVALID ADDS FORMAT");
}
else /* if inputs valid then */
{
// printf ("%04d:%02bd\n",iAdds,uData);
EA = 0; /* disable interrupts while */
Temp=(unsigned char)(iAdds&0x000f);
iAdds=iAdds&0xfff0;
printf ("%04hx:",iAdds);
for(i=0;i<Temp;i++)
{
printf (" ");
}
for(i=Temp;i<16;i++)
{
uData = XBYTE[iAdds+i];
printf ("%02bx ",uData);
}
EA = 1; /* enable interrupts again */
printf("\n");
}
}
void WriteMem(unsigned char * buffer)
{
unsigned char args,uData; /* number of arguments */
unsigned int iAdds;
args = sscanf (buffer, "%4x:%2bx",&iAdds,&uData);
if (args < 2 || args == EOF)
{
printf (ERROR, "INVALID ADDS:DATA FORMAT");
}
else /* if inputs valid then */
{
EA = 0; /* disable interrupts while */
XBYTE[iAdds] = uData;
EA = 1; /* enable interrupts again */
printf ("Write Mem OK!\n");
}
}
#define MemBaseAdds 0x4000
void ListRecord(unsigned char * buffer)
{
// unsigned char args,uHour,uMin; /* number of arguments */
unsigned char args,uMonth,uDay; /* number of arguments */
unsigned int iAdds;
args = sscanf (buffer, "%2bu.%2bu",&uMonth,&uDay);
if (args < 2 || args == EOF )
{
printf (ERROR, "INVALID MONTH.DAY FORMAT");
}
if( (uMonth > 12) || (uDay > 31) )
{
printf("Month <=12 and Day <=31\n");
}
else /* if inputs valid then */
{
printf ("List Record--\n");
printf("Time CH0 CH1 CH2 CH3 CH4 CH5 CH6 CH7\n");
printf("%02bu.%02bu ",uMonth,uDay);
/*
args = uMonth;
uMonth >>= 4;
uMonth *= 10;
uMonth += args&0x0f;
args = uDay;
uDay >>= 4;
uDay *= 10;
uDay += args&0x0f;
*/
iAdds = MemBaseAdds + (unsigned int)(uMonth*31*20) + (unsigned int)(uDay*20);
printf("(A=%04x Mon=%02bu Day=%02bu %02bx %02bx) ",iAdds,uMonth,uDay,XBYTE[iAdds],XBYTE[iAdds+1]);
iAdds +=2;
for(args=0;args<8;args++)
{
printf("%02bx%02bx ",XBYTE[iAdds+1+args*2],XBYTE[iAdds+args*2]);
}
}
}
void FillMem(unsigned int iAdds,unsigned int iLength,unsigned char uData)
{
unsigned int i;
for(i=0;i<iLength;i++)
{
XBYTE[iAdds+i] = uData;
}
}
void Mem_Clear(unsigned char * buffer)
{
unsigned char args; /* number of arguments */
unsigned char uData;
args = sscanf (buffer, "%bu",&uData);
if(args == EOF)
{
printf (ERROR, "INVALID ADDS:DATA FORMAT");
}
else
{
switch (uData)
{
case 0:
FillMem(MemBaseAdds,0x2000,0x00);
printf("FillMem(0x4000,0x2000,0x00)\n");
break;
case 1:
FillMem(MemBaseAdds,0x2000,0x55);
printf("FillMem(0x4000,0x2000,0x55)\n");
break;
default:
printf (ERROR, "INVALID FORMAT");
break;
}
}
}
void Mem_Fill(unsigned char * buffer)
{
unsigned char args,uData; /* number of arguments */
unsigned int i,iAdds,iLen;
args = sscanf (buffer, "%4x %4x %2bx",&iAdds,&iLen,&uData);
if (args < 3 || args == EOF)
{
printf (ERROR, "INVALID ADDS LEN DATA FORMAT");
}
else /* if inputs valid then */
{
EA = 0; /* disable interrupts while */
for(i=0;i<iLen;i++)
{
XBYTE[iAdds+i] = uData;
}
EA = 1; /* enable interrupts again */
printf ("Write Mem OK!\n");
}
}
unsigned char code CmdStr[2][8]=
{
{0x01,0xac,0x00,0x00,0x00,0x00,0x00,0x00},
{0x02,0xac,0x00,0x00,0x00,0x00,0x00,0x00}
};
/*
void SentChar(unsigned char SentData)
{
while(!TI);
SBUF = SentData;
}
*/
/*
unsigned char xdata SendCmdBuf[11];
void SendCmdStr(void)
{
unsigned char i;
SendCmdBuf[0] = 0x5a;
SendCmdBuf[10] = 0;
for(i=0;i<10;i++)
{
SendCmdBuf[10]+=SendCmdBuf[i];
}
for(i=0;i<11;i++)
{
putchar(SendCmdBuf[i]);
}
}
void SendCmd(unsigned char *CmdStr)
{
unsigned char i;
SendCmdBuf[1]=0x01;
for(i=2;i<10;i++)
{
SendCmdBuf[i]=*CmdStr;
CmdStr++;
}
SendCmdStr();
}
unsigned char RecChar;
bit GetOneChar(void)
{
unsigned char RecCounter=0x7f;
while(!RI)
{
if(RecCounter++)
return 0;
}
RecChar = SBUF;
return 1;
}
unsigned char xdata RecCmdBuf[11];
unsigned char RecCmdStr(void)
{
unsigned char i;
for(i=0;i<11;i++)
{
if( GetOneChar() )
{
RecCmdBuf[i]=RecChar;
return 0;
}
else
{
return 1; //Timeout error
}
}
}
*/
void Delay1s(void)
{
unsigned int i,j;
for(i=0;i<200;i++)
for(j=0;j<1000;j++){};
}
/******************************************************************************/
/*************************** MAIN PROGRAM ***************************/
/******************************************************************************/
void main(void) /* main entry for program */
{
unsigned char idata cmdbuf [15]; /* command input buffer */
unsigned char i; /* index for command buffer */
InitSerialPort();
EA = 1; /* global interrupt enable */
printf ( menu ); /* display command menu */
while(1) /* loop forever */
{
printf ("\nCmd: ");
getline (&cmdbuf[0], sizeof (cmdbuf)); /* input command line */
for (i = 0; cmdbuf[i] != 0; i++) /* convert to upper characters */
{
cmdbuf[i] = toupper(cmdbuf[i]);
}
for (i = 0; cmdbuf[i] == ' '; i++); /* skip front blanks */
switch (cmdbuf[i]) /* proceed to command function */
{
case 'R': /* Read circular Buffer */
DispMem(&cmdbuf[i+1]);
break;
case 'W': /* Read circular Buffer */
WriteMem(&cmdbuf[i+1]);
break;
case 'T': /* Enter Current Time */
set_time (&cmdbuf[i+1]);
break;
case 'I': /* Enter Interval Time */
set_date (&cmdbuf[i+1]);
break;
case 'D': /* Display Command */
disp_time();
break;
case 'S': /* Start Command */
disp_date();
break;
case 'Q': /* Quit Command */
printf ("\a\n");
break;
case 'C': /* Clear Command */
printf("Cmd_c\n");
Mem_Clear(&cmdbuf[i+1]);
printf("Cmd_c End\n");
break;
case 'F':
Mem_Fill(&cmdbuf[i+1]);
printf("Mem_Fill Ok!\n");
break;
case 'A':
LcdPwrSw = 0;
printf("LcdPwrSw = 0\n");
break;
case 'B':
LcdPwrSw = 1;
printf("LcdPwrSw = 1\n");
break;
case 'X':
Bell = 0;
RS485Rec = 0;
Delay1s();
RS485Rec = 1;
printf("Bell = 0\n");
break;
case 'Y':
Bell = 1;
printf("Bell = 1\n");
break;
case 'Z':
Test(&cmdbuf[i+1]);
break;
case 'L': //list store record
ListRecord(&cmdbuf[i+1]);
break;
default: /* Error Handling */
printf (ERROR, "UNKNOWN COMMAND");
printf (menu); /* display command menu */
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -