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

📄 calc.c

📁 应用于51的浮点数计算器程序
💻 C
字号:
#include"mobile.h"


uchar code ButtonEnter[]={"确定"};
uchar code ButtonReturn[]={"返回"};
uchar code Equal[]={"等于"};
uchar code Cleanup[]={"清除"};
uchar code numsign[]={'+','-','*','/'};
uchar code error[]={"错误!"};

#define   max_char  9
float AValue,
      BValue,
      result;
uchar LastValue,          //last count value
      radixpoint,         //flag of radix point
      state,              //0:data A//1:number sign//2:data B
      exit,               //can exit
      numbersign,
      disbuf[max_char];


void Calc_InitBuf(uchar *s)
{
	uchar i;
	*s='0';
	for(i=1;i<max_char;i++)
	{
		*(s+i)=' ';
	}
}


void Calc_InitCalc(void)
{
	AValue=0;
	BValue=0;
	LastValue=0;
	radixpoint=0;
	state=0;
	exit=0;
	Calc_InitBuf(disbuf);
	
	Lcd_WriteNull(14,0x80);
	Lcd_WriteNull(12,0x90);
	Lcd_WriteNull(12,0x88);
	Lcd_WriteWord(4,0x9e,ButtonReturn,0);
	
	
}


uchar Calc_textkey(uchar key)
{
	if((key>=0x30)&&(key<=0x39)) return 1;
	else return 0;
}

uchar Calc_textvalue(float dec)
{
	if((dec>=-9999999)&&(dec<=9999999)) return 1;
	else return 0;
}

float Calc_AsciiToDec(uchar *ascii)       //will do with ascii
{
	float value,digit;
	value=0;
	ascii=0;
	
	while(!((*ascii!='.')||(*ascii!=' ')))
	{
		digit=*ascii-48;
		value=value*10+digit;
		ascii++;
	}
	
	if(*ascii=='.')
	{
		ascii+=1;
		while(*ascii!=' ')
		{
			digit=*ascii-48;
			value=value*10+digit;
			ascii++;
		}
	}
	return value;
}


uchar Calc_DecToAscii(float dec)       //will do with dec               
{
	int temp;
	float tempresult;
	uchar i,j,rembuf,tempbuf[max_char-2],*ascii=&tempbuf[max_char-2];
	
	Calc_InitBuf(tempbuf);
	
	if(!dec) 
	{
		*ascii='0';
		goto loop;
	}
	
	if(dec<0)
	{
		*ascii='-';
		dec-=dec*2;
	}
	temp=dec;
	dec-=temp;
	
	for(i=max_char-2;i>0;--i)
	{
		rembuf=temp%10;
		tempresult=temp/10;
		
		if((!rembuf)&&(!tempresult))
		{
			ascii=disbuf;
			for(j=0;j<7;j++)
			{
				if(tempbuf[j]!=' ') 
				{
					*ascii=tempbuf[j];
					ascii++;
				}
			}
			break;
		}
		else
		{
			rembuf+=48;
			*ascii=rembuf;
			ascii--;
		}
		
		temp/=10;
	}
	
	if(i!=0)
	{
		*ascii='.';
		for(i-=1;i>0;i--)
		{
			rembuf=dec*10;
			dec*=10;
			*ascii=rembuf;
			ascii++;
		}
	}
	loop: return disbuf;
}


void Clac_Error(uchar *s)
{
	uchar i;
	for(i=0;i<5;i++)
	{
		*s=error[i];
		s++;
	}
}


void Calc_Operation(void)
{
	Calc_InitBuf(disbuf);
	switch(numbersign)
	{
		case '+' : 
		{
			result=AValue+BValue;
			if(Calc_textvalue(result)) Calc_DecToAscii(result);
			else Clac_Error(disbuf);
			break;
		}
		
		case '-' :
		{
			result=AValue-BValue;
			if(Calc_textvalue(result)) Calc_DecToAscii(result);
			else Clac_Error(disbuf);
			break;
		}
		
		case '*' :
		{
			result=AValue*BValue;
			if(Calc_textvalue(result)) Calc_DecToAscii(result);
			else Clac_Error(disbuf);
			break;
		}
		
		case '/' :
		{
			result=AValue/BValue;
			if(Calc_textvalue(result)) Calc_DecToAscii(result);
			else Clac_Error(disbuf);
			break;
		}
	}
}


void Calc_StartCalc(void)
{
	uchar key,line,*disptr,*numsignptr;
	disptr=disbuf;
	numsignptr=numsign;
	
	for(;;)
	{
		if(state==0)   line=0x80;        //L1
		key=Key_Scan();
		if(Calc_textkey(key))
		{
			exit=1;
			if(disptr!=&disbuf[max_char-2])
			{
				*disptr=key;
				Lcd_WriteWord(max_char,line,disbuf,0);
				disptr++;
			}	
		}
		
		
		else
		{
			switch(key)
			{
				case 0x0a :
				{
					if(radixpoint==0)
					{
						*disptr='.';
						disptr++;
						Lcd_WriteWord(max_char,line,disbuf,0);
						radixpoint=1;
					}
					break;
				}
				
				case 0x0b :
				{
					if(state!=2) 
					{
						AValue=Calc_AsciiToDec(disbuf);
						Calc_InitBuf(disbuf);
						disptr=0;
						Lcd_WriteWord(1,0x86,numsignptr,0);
						numbersign=*numsignptr;
						line=0x90;
						if(numsignptr=='/') numsignptr=0;
					}
					break;
				}
				
				case 0x0c :
				{
					if(!exit) exit=2;
					Calc_InitCalc();
					break;
				}
				
				case 0x0d :
				{
					if(state==2) 
					{
						BValue=Calc_AsciiToDec(disbuf);
						Calc_Operation();
						Lcd_WriteWord(9,0x88,disbuf,0);
						break;
					}
				}
				
				default : break;
			
			}
		}
	
	
	if(exit==2)  break;
	}
}



void main(void)
{
	Lcd_InitLcd();
	GroundLight= ON;
	Calc_InitCalc();
	Calc_StartCalc();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -