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