📄 syssubs.c
字号:
/* 系统通用子程序集 */
/*======型号:NULL===========================*/
/*======程序来源:SEL =======================*/
/*======创建日期:2004.12.06=================*/
/*======修改日期:2004.03.06=================*/
/*======Copyright (c) sel.MCU 2004===========*/
/*======All Rights Reserved==================*/
//===================================================================
/*===================================================================
描述:51单片机系统通用子程序集
包括:
char *SysInStr(char y,char x,char length);//字符串输入函数
char *os_SysInStr(char y,char x,char length);//字符串输入函数(使用os_EventWait(),支持RTX51 RTOS的版本)
long int SysStr2Inte(char *Buffer);//字符串转换为长整型变量
float SysStr2Float(char *Buffer);//字符串转换成浮点型函数
char *SysInte2Str(long int inte,char dot);//长整型变量转换成字符串
char *SysFloat2Str(float num,char dot);//浮点型变量转换成字符串
unsigned char os_EventWait(void);
====================================================================*/
//定义外调用函数
char *SysInStr(char y,char x,char length);
char *os_SysInStr(char y,char x,char length);//字符串输入函数(使用os_KeyWait(),支持RTX51 RTOS的版本)
long int SysStr2Inte(char *Buffer);
float SysStr2Float(char *Buffer);
char *SysInte2Str(long int inte,char dot);
char *SysFloat2Str(float num,char dot);
unsigned char os_EventWait(void);
//字符串缓存
char idata BUF[16];
//事件类型号缓存
unsigned char SysEvent;
/*=======================================================
从键盘输入一个数字字符串
length:表示允许输入的字符串长度
程序返回字符串起始指针
例:ptr=SysInStr(1,7,5);//在显示屏的第一行第七列开始
//通过键盘输入一个长度不超过5个字符的字符串
========================================================*/
//以下是定义按键标识符和键值的对应表
/*==================================
7 8 9 A*
4 5 6 DEL
1 2 3 .
B* 0 C* ENT
*表示在本程序中未使用
==================================*/
#define K_7 0x00
#define K_8 0x01
#define K_9 0x02
#define K_4 0x04
#define K_5 0x05
#define K_6 0x06
#define K_DEL 0x07
#define K_1 0x08
#define K_2 0x09
#define K_3 0x0A
#define K_DOT 0x0B
#define K_0 0x0D
#define K_ENT 0x0F
char *SysInStr(char y,char x,char length)
{ char Value,i=0;
bit FlagDel=1;//定义删除键标志
bit FlagNoKey;//定义无有效按键标志
LcdXY(y,x);
LcdCursor(1);//开光标
for (i=0;i<length;i++)
{ BUF[i]=' ';//初始化字符串缓存
}
i=0;
while(1)
{ FlagNoKey=0;
Value=KeyWait();
switch(Value)//不同按键做出不同反应
{ case K_0: BUF[i]='0';break;
case K_1: BUF[i]='1';break;
case K_2: BUF[i]='2';break;
case K_3: BUF[i]='3';break;
case K_4: BUF[i]='4';break;
case K_5: BUF[i]='5';break;
case K_6: BUF[i]='6';break;
case K_7: BUF[i]='7';break;
case K_8: BUF[i]='8';break;
case K_9: BUF[i]='9';break;
case K_DOT: BUF[i]='.';break;
case K_DEL: FlagDel=1;break;
case K_ENT: LcdCursor(0);return BUF;//按确认键后程序返回
default:FlagNoKey=1;break;
}
if (FlagDel)//执行按删除键之后的操作
{ if((i==length-1)&&(BUF[i]!=' '))
{ BUF[i]=' ';
LcdDispChar(y,x+i,BUF[i]);
LcdXY(y,x+i);
}
else
{ if(i)
{ BUF[--i]=' ';
LcdDispChar(y,x+i,BUF[i]);
LcdXY(y,x+i);
}
}
FlagDel=0;
}
else if(!FlagNoKey)//数字键按下后的操作
{ LcdDispChar(y,x+i,BUF[i]);
if(i<(length-1)){ i++;}
LcdXY(y,x+i);
}
}
}
/*=======================================================
从键盘输入一个数字字符串(使用os_KeyWait(),支持RTX51 RTOS的版本)
length:表示允许输入的字符串长度
程序返回字符串起始指针
例:ptr=os_SysInStr(1,7,5);//在显示屏的第一行第七列开始
//通过键盘输入一个长度不超过5个字符的字符串
========================================================*/
//以下是定义按键标识符和键值的对应表
/*==================================
7 8 9 A*
4 5 6 DEL
1 2 3 .
B* 0 C* ENT
*表示在本程序中未使用
==================================*/
char *os_SysInStr(char y,char x,char length)
{ char Value,i=0;
bit FlagDel=1;//定义删除键标志
bit FlagNoKey;//定义无有效按键标志
LcdXY(y,x);
LcdCursor(1);//开光标
for (i=0;i<length;i++)
{ BUF[i]=' ';//初始化字符串缓存
}
i=0;
while(1)
{ FlagNoKey=0;
Value=os_EventWait();
switch(Value)//不同按键做出不同反应
{ case K_0: BUF[i]='0';break;
case K_1: BUF[i]='1';break;
case K_2: BUF[i]='2';break;
case K_3: BUF[i]='3';break;
case K_4: BUF[i]='4';break;
case K_5: BUF[i]='5';break;
case K_6: BUF[i]='6';break;
case K_7: BUF[i]='7';break;
case K_8: BUF[i]='8';break;
case K_9: BUF[i]='9';break;
case K_DOT: BUF[i]='.';break;
case K_DEL: FlagDel=1;break;
case K_ENT: LcdCursor(0);return BUF;//按确认键后程序返回
default:FlagNoKey=1;break;
}
if (FlagDel)//执行按删除键之后的操作
{ if((i==length-1)&&(BUF[i]!=' '))
{ BUF[i]=' ';
LcdDispChar(y,x+i,BUF[i]);
LcdXY(y,x+i);
}
else
{ if(i)
{ BUF[--i]=' ';
LcdDispChar(y,x+i,BUF[i]);
LcdXY(y,x+i);
}
}
FlagDel=0;
}
else if(!FlagNoKey)//数字键按下后的操作
{ LcdDispChar(y,x+i,BUF[i]);
if(i<(length-1)){ i++;}
LcdXY(y,x+i);
}
}
}
/*===================================================
转换函数:字符串转成长整型变量
将Buffer指针开始的字符串(遇空格终止)转换成长整型变量
例:inte=SysStr2Inte(SysInStr(1,7,5));//从键盘输入一个长整型变量赋予inte
注意,若输入12。34,会被转换为长整型1234
====================================================*/
long int SysStr2Inte(char *Buffer)
{ char i=0,j;
bit FlagPoint=0;
long int result=0;
while((Buffer[i]!=' ')&&(Buffer[i]!='\0'))
{ if(Buffer[i]!='.')
{ result=result*10+Buffer[i]-'0';
}
else
{ FlagPoint=1;//表明存在小数点
j=i;//记录小数点位置,用于函数SysStr2Float(char *Buffer)
}
i++;
}
if(FlagPoint)
{ Buffer[0]=i-j-1;
}//将小数点的倒数位置保存在Buffer[0]传给函数SysStr2Float(char *Buffer)
else{ Buffer[0]=0;
}
return result;
}
/*===================================================
转换函数:字符串转成浮点变量
将Buffer指针开始的字符串(遇空格终止)转换成浮点型变量
例:f=SysStr2Float(SysInStr(1,7,5));//从键盘输入一个浮点型变量赋予f
====================================================*/
float SysStr2Float(char *Buffer)
{ long int inte;
float result;
char count;
inte=SysStr2Inte(Buffer);//先将字符串转换为长整型
count=Buffer[0];//读取小数点的倒数位置
result=(float)inte;//长整型转换成浮点(无小数点)
while(count--)
{ result=result/10;//加入小数点
}
return result;
}
/*===================================================
转换函数:长整型变量转成字符串
inte:长整型变量,若是显示字符型或整型变量需先转换成长整型
dot:是表示插入的小数点的位置,若dot为-1则不显示小数点
如inte=1234,dot=2表示显示12。34
程序返回字符串起始指针
例:LcdPutStr_data(1,1,SysInte2Str(inte,2));
====================================================*/
char *SysInte2Str(long int inte,char dot)
{ long int temp;
char i=15;
bit FlagMinus=0;//定义负数标志
if (inte<0)
{ FlagMinus=1;
inte=-inte;//若为负数则取绝对值
}
while(inte)
{ if(i==(15-dot)){ BUF[--i]='.';}//显示小数点
else//转换成字符
{ temp=inte/10;
BUF[--i]=inte-temp*10+'0';
inte=temp;
}
}
if(FlagMinus){ BUF[--i]='-';}//显示负号
return BUF+i;
}
/*===================================================
转换函数:浮点变量转成字符串
num:浮点型变量
dot:是表示保留的小数后几位数字,dot为-1时不显示小数点
如num=123.4567,dot=3表示显示123。456
程序返回字符串起始指针
例:LcdPutStr_data(1,1,SysFloat2Str(num,3));
====================================================*/
char *SysFloat2Str(float num,char dot)
{ long int inte;
char count;
if(dot!=-1)
{ count=dot;
while(count--)
{ num=num*10;
}
}
inte=(long)num;
return SysInte2Str(inte,dot);
}
/*===================================================
等待事件:等待一个事件的发生并返回事件类型号
适合用在嵌入了RTX51TINY RTOS的系统中
并且几乎不占用CPU时间片
====================================================*/
unsigned char os_EventWait(void)
{ os_wait(K_SIG,0,0);
return SysEvent;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -