📄 calculator.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 + -