⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 syssubs.c

📁 学习12864液晶显示测试
💻 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 + -