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

📄 calculator.c

📁 ARM44B0 做的计算器源程序
💻 C
字号:

#include	"Calculator.h"
#include	"Include.h"
#include	"Calculator_ICO.c"
#include	"Calculator_Small_ICO.c"
////
/*=========================================================================*/


struct	GUI_MENU	GUI_ICO_Menu_Calculator={	0,0,	0,0,0,0,
												Calculator,
												gImage_Calculator_ICO,
												"Calculator"


};

/*=========================================================================*/


/*=========================================================================*/
/*=========================================================================*/

struct	GUI_BUTTON		Cal_KeyBoard[]={
							
							{			0,0,0,0,	RGB565(0,0,0),RGB565(20,20,26),RGB565(31,20,8),		Up,	BN_BRIGHT,	Font_ASC_8_16,	ASC_ESC,	"Exit"},
							{			0,0,0,0,	RGB565(0,0,0),RGB565(20,20,26),RGB565(16,48,8),		Up,	BN_BRIGHT,	Font_ASC_12_24,	'\0',		"  "},
							{			0,0,0,0,	RGB565(0,0,0),RGB565(20,20,26),RGB565(16,48,8),		Up,	BN_BRIGHT,	Font_ASC_8_16,	'C',		"CE"},
							{			0,0,0,0,	RGB565(0,0,0),RGB565(20,20,26),RGB565(16,48,8),		Up,	BN_BRIGHT,	Font_ASC_8_16,	'\b',		"<-"},
							
							{			0,0,0,0,	RGB565(0,0,0),RGB565(20,20,26),RGB565(16,16,18),	Up,	BN_BRIGHT,	Font_ASC_12_24,	'7',		"7"},
							{			0,0,0,0,	RGB565(0,0,0),RGB565(20,20,26),RGB565(16,16,18),	Up,	BN_BRIGHT,	Font_ASC_12_24,	'8',		"8"},
							{			0,0,0,0,	RGB565(0,0,0),RGB565(20,20,26),RGB565(16,16,18),	Up,	BN_BRIGHT,	Font_ASC_12_24,	'9',		"9"},
							{			0,0,0,0,	RGB565(0,0,0),RGB565(20,20,26),RGB565(16,48,8),		Up,	BN_BRIGHT,	Font_ASC_8_16,	'/',		"÷"},
							
							{			0,0,0,0,	RGB565(0,0,0),RGB565(20,20,26),RGB565(16,16,18),	Up,	BN_BRIGHT,	Font_ASC_12_24,	'4',		"4"},
							{			0,0,0,0,	RGB565(0,0,0),RGB565(20,20,26),RGB565(16,16,18),	Up,	BN_BRIGHT,	Font_ASC_12_24,	'5',		"5"},
							{			0,0,0,0,	RGB565(0,0,0),RGB565(20,20,26),RGB565(16,16,18),	Up,	BN_BRIGHT,	Font_ASC_12_24,	'6',		"6"},
							{			0,0,0,0,	RGB565(0,0,0),RGB565(20,20,26),RGB565(16,48,8),		Up,	BN_BRIGHT,	Font_ASC_8_16,	'*',		"×"},
							
							{			0,0,0,0,	RGB565(0,0,0),RGB565(20,20,26),RGB565(16,16,18),	Up,	BN_BRIGHT,	Font_ASC_12_24,	'1',		"1"},
							{			0,0,0,0,	RGB565(0,0,0),RGB565(20,20,26),RGB565(16,16,18),	Up,	BN_BRIGHT,	Font_ASC_12_24,	'2',		"2"},
							{			0,0,0,0,	RGB565(0,0,0),RGB565(20,20,26),RGB565(16,16,18),	Up,	BN_BRIGHT,	Font_ASC_12_24,	'3',		"3"},
							{			0,0,0,0,	RGB565(0,0,0),RGB565(20,20,26),RGB565(16,48,8),		Up,	BN_BRIGHT,	Font_ASC_8_16,	'-',		"-"},
							
							{			0,0,0,0,	RGB565(0,0,0),RGB565(20,20,26),RGB565(16,16,18),	Up,	BN_BRIGHT,	Font_ASC_12_24,	'0',		"0"},
							{			0,0,0,0,	RGB565(0,0,0),RGB565(20,20,26),RGB565(16,16,18),	Up,	BN_BRIGHT,	Font_ASC_12_24,	'.',		"."},
							{			0,0,0,0,	RGB565(0,0,0),RGB565(20,20,26),RGB565(16,48,8),		Up,	BN_BRIGHT,	Font_ASC_12_24,	'=',		"="},
							{			0,0,0,0,	RGB565(0,0,0),RGB565(20,20,26),RGB565(16,48,8),		Up,	BN_BRIGHT,	Font_ASC_8_16,	'+',		"+"},
							                   
							
							
							
							
							{		0,0,0,0,	0,0,0,	Up,	255,	Font_ASC_12_24,	'\0',	"--"},

					};
								
/*=========================================================================*/

static	char	Cal_Type;

/*=========================================================================*/
/*=========================================================================*/
/*=========================================================================*/
/*=========================================================================*/

void	Cal_Output(U16 Front_RGB,U16 Back_RGB,U16 Pane_RGB,U8 Mode,const U8 *Char_Set,char *Str)

{
	

	GUI_MemdevDisable();
	
	GUI_BrightRectangle(0,0,LCD_XSIZE,32,RGB565(0,20,8));
	GUI_Label(0,0,LCD_XSIZE,32,RGB565(31,63,31),RGB_Tran,RGB_Tran,Center,Font_ASC_12_24,"Calculator");
	
		
	
	GUI_BrightRectangle(4,42,LCD_XSIZE-4*2,48,RGB565(0,0,31));

	//GUI_ShadeRectangle(4,40,LCD_XSIZE-4*2,48,RGB565(20,40,31),RGB565(5,10,24));
	
	
	GUI_LabelPrintf(4,42,LCD_XSIZE-4*2,48,Front_RGB,RGB_Tran,RGB_Tran,Mode,Char_Set,Str);

	

}

/*=========================================================================*/

/*=========================================================================*/

static	void	Show_Cal_Type(void)
{
		
	GUI_LabelPrintf(4,42,16,16,RGB_Red(31),RGB_Tran,RGB_Tran,Center,Font_ASC_8_16,"%c",Cal_Type);
	
	Uart_Printf(0,"\n(%c)\n",Cal_Type);
	
}
/*=========================================================================*/

void	Float_To_Str(char	*Str,char *fmt,double data)

{	
	
	S16 a=0;
	////
	
  	va_list ap;
    char string[256];
    va_start(ap,fmt);
    vsprintf(string,fmt,ap);
   
   for(a=0;*(string+a)!='\0';a++)
   {
    *(Str+a)=*(string+a);
  
  	}
  	*(Str+a)='\0';
    va_end(ap);

}

/*=========================================================================*/

static	int	Str_Of_ASC_Num(char *Str,char ASC)	//返回Str字符串中ASC字符的数量.

{
	int	a,i;
	
	a=0;
	i=0;
	////
	
	while(*(Str+i))
	{
	
		if(*(Str+i)==ASC)	a++;
		i++;	
	
	}
	return	a;

}

/*=========================================================================*/

void	Updata_Calculator_Interface(void)

{


	struct	GUI_BUTTON_CFG	bn_cfg={0,100,LCD_XSIZE,LCD_YSIZE-100,4,4,4,5,0};
	////
	
	GUI_MemdevEnable();
	GUI_ClrScreen(RGB565(16,32,18));
	GUI_MatrixButtons(&bn_cfg,Cal_KeyBoard);
	GUI_DisplayUpdata(0,0,LCD_XSIZE,LCD_YSIZE);
	GUI_MemdevDisable();
}

/*=========================================================================*/

char	Calculator_TP_Key(void)
{
	int a,i;
	////
	
	if(TS_PRESS_100MS())
	{
		a=TS_GetButtonValue(Cal_KeyBoard,&i);
		TS_Stop();
		return a;
	}
	else
	{
		TS_GetButtonValue(Cal_KeyBoard,&i);
		return 0;
	}
	
}

/*=========================================================================*/

void	Calculator(void)
{

	S16			Uart_Key,a,b;
	char		Buf[256];
	char		Buf1[256];
	char		Buf2[256];
	char		*Str1=Buf1;
	char		*Str2=Buf2;
	char		*Str=Buf;
	char		c;
	double 		Cal_buf1,Cal_buf2;

	////////
	
		
	Updata_Calculator_Interface();
	
	TS_Stop();
	////
	
Cal_Start:
	
	Buf1[0]='\0';
	Buf2[0]='\0';
	Cal_Output(RGB_Black,RGB_White,RGB_Gray,Right,Font_ASC_12_24,"  ");	
	////////
	
	Cal_Type='+';
	Str1="0";
	Str2="0";
	////
Num1:
	Uart_Puts(0,"Num1\n");
	////
	
	a=0;
	
	while(1)
	{
	
		Uart_Key=Calculator_TP_Key();
	
		if((Uart_Key=='+')||(Uart_Key=='-')||(Uart_Key=='*')||(Uart_Key=='/'))
		{
			
			if(a==0)
			{
				if(Uart_Key=='-')
				{
				
					*(Str1+(a++))=Uart_Key;
					*(Str1+a)='\0';
					Cal_Output(RGB_Black,RGB_White,RGB_Gray,Right,Font_ASC_12_24,Str1);
					////////
				
				}


			}
			////
			else
			{
				
				Cal_Type=Uart_Key;
				*(Str1+(a++))='\0';
				Cal_buf1=atof(Str1);
				Show_Cal_Type();

				goto	Num2;
			
			}
			
			
		
		}
		
		////
		
		if(Cal_Backspace_Key_Pressed())
			{
				if((--a)<=0)	a=0;
				*(Str1+(a))='\0';
			
				////
				if(strlen(Str1)>13)
				Cal_Output(RGB_Black,RGB_White,RGB_Gray,Right,Font_ASC_8_16,Str1);
				else
				Cal_Output(RGB_Black,RGB_White,RGB_Gray,Right,Font_ASC_12_24,Str1);
				////////

			
			}

			else
			{
				
				if(Cal_Num_Key_Pressed()||(Uart_Key=='.'))
				{	
					
					if( (a<16)&&(Uart_Key=='.') )		//"."
					{
						if(Str_Of_ASC_Num(Str1,'.')==0)
						{
							*(Str1+(a++))=Uart_Key;
							*(Str1+a)='\0';
						}

					}
					////
					
					if((a<16)&&Cal_Num_Key_Pressed())	//Number Key.
					{
						*(Str1+(a++))=Uart_Key;
						*(Str1+a)='\0';
					}
					////
					
					if(strlen(Str1)>13)
					Cal_Output(RGB_Black,RGB_White,RGB_Gray,Right,Font_ASC_8_16,Str1);
					else
					Cal_Output(RGB_Black,RGB_White,RGB_Gray,Right,Font_ASC_12_24,Str1);
					////////

				}			
				
			}
			
		////////
		
		if(Cal_CE_Key_Pressed())		goto	Cal_Start;
		if(Cal_Exit_Key_Pressed())		return;
		////
		
	}
	
	///////////////
	
Num2:
	
	Uart_Puts(0,"Num2\n");
	////
	b=0;
	while(1)
	{
		Uart_Key=Calculator_TP_Key();
		////
		if((Uart_Key=='+')||(Uart_Key=='-'))
		{
			if(b==0)
			{
			
				*(Str2+b++)=Uart_Key;
				*(Str2+b)='\0';

			}
			
			////
			
			if(strlen(Str2)>13)
			Cal_Output(RGB_Black,RGB_White,RGB_Gray,Right,Font_ASC_8_16,Str2);
			else
			Cal_Output(RGB_Black,RGB_White,RGB_Gray,Right,Font_ASC_12_24,Str2);
			////////
						
		
		}
		
		////////	
		
		if(Cal_Enter_Key_Pressed())
		
		{
			*(Str2+b)='\0';
			goto ss;
		}
		else
		{
			if(Cal_Num_Key_Pressed()||(Uart_Key=='.'))
			{
				
				if( (b<16) && (Uart_Key=='.') )			// "."
				{
					if(Str_Of_ASC_Num(Str2,'.')==0)
					{
						*(Str2+(b++))=Uart_Key;
						*(Str2+b)='\0';
			
					}
				}
				////
				
				if((b<16) && Cal_Num_Key_Pressed())		// Number Key.
				{
					*(Str2+(b++))=Uart_Key;
					*(Str2+b)='\0';
				}
				
				////
				
				if(strlen(Str2)>13)
				Cal_Output(RGB_Black,RGB_White,RGB_Gray,Right,Font_ASC_8_16,Str2);
				else
				Cal_Output(RGB_Black,RGB_White,RGB_Gray,Right,Font_ASC_12_24,Str2);
				////////

			}
		}
		
		////
		
		if(Cal_Backspace_Key_Pressed())
		{
			if((--b)<=0)	b=0;
			*(Str2+(b))='\0';
		
			////
			
			if(strlen(Str2)>13)
			Cal_Output(RGB_Black,RGB_White,RGB_Gray,Right,Font_ASC_8_16,Str2);
			else
			Cal_Output(RGB_Black,RGB_White,RGB_Gray,Right,Font_ASC_12_24,Str2);
			////////

			
		}
		
		////
		
		if(Cal_CE_Key_Pressed())		goto	Cal_Start;
		if(Cal_Exit_Key_Pressed())			return;
		
		////
		
	}
	
ss:
	
	////////////////
//	Delay_n15ms(30/15);
	Uart_Printf(0,"-> %s   /   %s \n",Str1,Str2);
	////
	Cal_buf2=atof(Str2);

	////
	if((Cal_Type=='/')&&(Cal_buf2==0))	goto	Cal_Err;	//除数不能为"0".
	////
	
	if(Cal_Type=='+')	{Cal_buf1+=Cal_buf2;Uart_Printf(0,"+ \n");goto	Cal_over;}
	
	if(Cal_Type=='-')	{Cal_buf1-=Cal_buf2;Uart_Printf(0,"- \n");goto	Cal_over;}
	
	if(Cal_Type=='*')	{Cal_buf1*=Cal_buf2;Uart_Printf(0,"* \n");goto	Cal_over;}
	
	if(Cal_Type=='/')	{Cal_buf1/=Cal_buf2;Uart_Printf(0,"/ \n");goto	Cal_over;}
		
	////////////////
	
Cal_over:
		
		if(Cal_buf1>9999999999999999)				goto	Cal_overflow;
		if(Cal_buf1<(-9999999999999999))			goto	Cal_overflow;
		////
		Float_To_Str(Str,"%.8f",Cal_buf1);
		a=strlen(Str);
	
		////
		a--;

		while(*(Str+a)=='0')		//去'0'.
		{
		
		*(Str+(a--))='\0';
			
				
		}
		////
		if(strlen(Str)>13)
		Cal_Output(RGB_Black,RGB_White,RGB_Gray,Right,Font_ASC_8_16,Str);
		else
		Cal_Output(RGB_Black,RGB_White,RGB_Gray,Right,Font_ASC_12_24,Str);
		////////
		
		while(1)
		{
			Uart_Key=Calculator_TP_Key();
			////
			if(Cal_CE_Key_Pressed())		goto	Cal_Start;
			if(Cal_Exit_Key_Pressed())			return;
			/////
			if(Cal_Add_Key_Pressed())		{Cal_Type='+';Show_Cal_Type();goto Num2;}
			if(Cal_Sub_Key_Pressed())		{Cal_Type='-';Show_Cal_Type();goto Num2;}
			if(Cal_Mul_Key_Pressed())		{Cal_Type='*';Show_Cal_Type();goto Num2;}
			if(Cal_Div_Key_Pressed())		{Cal_Type='/';Show_Cal_Type();goto Num2;}
			
			Delay_n15ms(45/15);
		}
		//////
		
Cal_overflow:
		
			Cal_Output(RGB_Red(31),RGB_White,RGB_Gray,Center,Font_ASC_8_16,"Data overflow");
			goto	Cal_wait;
			////
Cal_Err:		
			Cal_Output(RGB_Red(31),RGB_White,RGB_Gray,Center,Font_ASC_8_16,"Err!!!");
			goto	Cal_wait;
			////
		
Cal_wait:
			while(1)
			{
				Uart_Key=Calculator_TP_Key();
				////
				if(Cal_CE_Key_Pressed())			goto	Cal_Start;
				if(Cal_Exit_Key_Pressed())			return;
			
			}
		

}

/*=========================================================================*/
/*=========================================================================*/
/*=========================================================================*/
/*=========================================================================*/
/*=========================================================================*/
/*=========================================================================*/
/*=========================================================================*/
/*=========================================================================*/
/*=========================================================================*/
/*=========================================================================*/
/*=========================================================================*/

⌨️ 快捷键说明

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