📄 systool.c
字号:
/******************************************************************************************
* 目的:系统工具模块
* 功能:提供软键盘、数据转换和信息提示功能
* 模块依赖:Systemint.h
******************************************************************************************/
#include "Systemint.h"
/*
**-------------------------------------------------------------------------------------
** 测试失败提示
**-------------------------------------------------------------------------------------
*/
void ERR_INFO()
{
unsigned char *SMenu[]=
{
"通讯连接失败!",
"[ NO ] 返回"
};
unsigned char SStartline = 0;
unsigned char SUserline = 0;
ScreenInit( W_STAT );
AddMenu( SMenu, 2 );
while( ScreenAct( &SStartline, &SUserline ) != W_RETURN )
{
//NULL
}
}
/*
**-------------------------------------------------------------------------------------
** 信息提示
**-------------------------------------------------------------------------------------
*/
void DisInfo( unsigned char *Menu[], unsigned char Maxl )
{
unsigned char Startline = 0;
unsigned char Userline = 0;
ScreenInit( W_STAT );
AddMenu( Menu, Maxl );
ScreenAct( &Startline, &Userline );
}
/*
**-------------------------------------------------------------------------------------
** 信息提示并等待按键
**-------------------------------------------------------------------------------------
*/
void InfoWait( unsigned char *Menu[], unsigned char Maxl )
{
unsigned char Startline = 0;
unsigned char Userline = 0;
ScreenInit( W_STAT );
AddMenu( Menu, Maxl );
while( ScreenAct( &Startline, &Userline ) != W_RETURN )
{
//NULL
}
}
/*
**-------------------------------------------------------------------------------------
** 键盘输入,数据输出
**-------------------------------------------------------------------------------------
*/
long DigitKeyboad( unsigned char *InputStr, unsigned char DigNum, long MaxData )
{
//Declation
unsigned char Rep = W_NULL; // 用户选定项
unsigned char Userline = 0;
unsigned char StartL = 0; //当前起始行
unsigned char Buf[10];
long ReDig;
unsigned char *Overflow[]=
{
"数值超出范围!",
"[NO] 返回"
};
Rep = W_NULL;
ReDig = 0;
ScreenInit( W_INPUT );
AddString( InputStr );
SetMaxDig( DigNum );
while( Rep != W_RETURN )
{
//显示文本
Rep = ScreenAct( &StartL, &Userline );
if( Rep == W_OK )
{
//添加处理代码
ReDig = (long)UserRep() + ReDig*10;
}
else if( Rep == W_CANEL )
{
ReDig = (long)(ReDig/10);
}
else if( Rep == W_FINISH )
{
unsigned char *Menu[]=
{
"确认输入?",
"[YES] 确认",
"[NO] 返回"
};
ReDig = (long)UserRep() + ReDig*10;
sprintf( (char *)Buf, "数值:%d", ReDig );
ScreenInit( W_STAT );
AddString( Menu[0] );
AddString( Buf );
AddString( Menu[1] );
AddString( Menu[2] );
while( 1 )
{
Rep = ScreenAct( &StartL, &Userline );
if( Rep == W_OK )
{
//添加输出代码
if( ReDig>=MaxData )
{
InfoWait( Overflow, 2 );
ReDig = 0;
ScreenInit( W_INPUT );
AddString( InputStr );
SetMaxDig( DigNum );
Rep = W_NULL;
break;
}
else
{
return ReDig;
}
}
else if( Rep == W_RETURN )
{
Rep = W_NULL;
ReDig = 0;
ScreenInit( W_INPUT );
AddString( InputStr );
SetMaxDig( DigNum );
break;
}
}
}
}
return -1;
}
/*
**-------------------------------------------------------------------------------------
// 数据比较
**-------------------------------------------------------------------------------------
*/
char CompareB( unsigned char DataX, unsigned char DataY )
{
if( (DataX&DataY) == DataY )
{
return 1;
}
else
{
return 0;
}
}
/*
**-------------------------------------------------------------------------------------
// 转换一个16进制数
**-------------------------------------------------------------------------------------
*/
unsigned long ReadHex(unsigned char *hexin)
{
unsigned long sum;
char i;
i=0;
sum=0;
while( (hexin[i]=='0') || (hexin[i]=='x') || (hexin[i]=='X') ) i++;
while(hexin[i]!='\0')
{
if(hexin[i]<='9') sum=sum*16+hexin[i]-'0';
else if(hexin[i]<='F') sum=sum*16+hexin[i]-'A'+10;
else sum=sum*16+hexin[i]-'a'+10;
i++;
}
return sum;
}
/*
**-------------------------------------------------------------------------------------
// 转换一个10进制数
**-------------------------------------------------------------------------------------
*/
unsigned long ReadDec(unsigned char *decin)
{
unsigned long sum;
char i;
i=0;
sum=0;
while(decin[i]=='0') i++;
while(decin[i]!='\0')
{
sum=sum*10+decin[i]-'0';
i++;
}
return sum;
}
/*
**-------------------------------------------------------------------------------------
//判断in是十进制还是十六进制
**-------------------------------------------------------------------------------------
*/
int ChkDigi(unsigned char *in)
{
int i,xnum;
int length=0,flag;
//判断入口 in 长度 是否超过最大长度,不满足返回 0
length = strlen((char *)in);
//if( length > StrLenMax ) return 0; //#define StrLenMax 8
if( length == 0 ) return 0;
if( length > 20 ) return 0;
//循环查询字符串中是否存在非法字符,( '0'~'9', 'a'~'f','A'~'F','x','X' ) 范围为合法,不合法返回 0
for( i =0 ; i < length ; i++ )
{
if( (in[i]>='0')&&(in[i]<='9') );
else if( (in[i]>='a')&&(in[i]<='f') );
else if( (in[i]>='A')&&(in[i]<='F') );
else if(in[i]=='x');
else if(in[i]=='X');
else return 0;
}
//循环查询是否存在字符 'x' 或 'X' , 不存在则返回 1 ,代表这是一个十进制数
flag = 0;
for( i =0 ; i < length ; i++ )
{
if( (in[i]=='x')||(in[i]=='X') ) break;
if( (in[i]<'0') || (in[i]>'9') ) flag = 1;
}
if( i == length )
{
if(!flag) return 1; //十进制
return 0;
}
//若存在 'x','X' 1.判断出现次数是否大于 1
// 2.判断该字符前是否含有非'0'字符
// 3.判断成功则返回 2 ,代表这是一个合法的16进制数
xnum = 0;
for( i =0 ; i < length ; i++ )
{
if( (in[i]=='x') || (in[i]=='X') )
{
if( i == 0 ) return 0;
xnum++;
}
if( xnum > 1 ) return 0;
if( !xnum ) if( in[i]!='0' ) return 0;
}
return 2;
}
/*
**-------------------------------------------------------------------------------------
//将InString转换成十进制或十六进制数值
**-------------------------------------------------------------------------------------
*/
int GetLong(unsigned char *InString, unsigned long *Output)
{
int XFlag;
XFlag = ChkDigi( InString );
if( XFlag == 1 )//换成十进制
{
*Output = ReadDec(InString);
}
else if( XFlag == 2 )//换成六进制数值
{
//*Output = ReadHex(InString);
*Output = 0;
}
return XFlag;
}
//----------------------------------------------------------------- End Of File --------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -