📄 calculate.c
字号:
err=3;
break;
case '*': if(opd1!=0&&opd2!=0)
{
if((((double)opd1/100.0*opd2)>MAX_VALUE)||(((double)opd1/100.0*opd2)<-MAX_VALUE))
err=3;
}
*result=((double)opd1)/100*opd2;
break;
case '/':
if(opd2==0)
err=2;
else
{
*result=(((double)opd1/100.0)/((double)opd2/100.0))*100;
/*
mod=opd1%opd2;
if(mod>=5&&(*result)>=0)
(*result)++;
if(mod>=5&&(*result)<0)
(*result)--;
*/
}
break;
}
return err;
}
//========================================================================
uchar LongToString(long num,uchar *str) //长整型转换为字符串
{
uchar xdata pos=0,buf[12];
uchar xdata m,i,end,temp;
memset(buf,0,12);
if(num<0)
{
str[pos]='-';
pos++;
num=-num;
}
else if(num==0)
{
str[0]='0';
str[1]='\0';
return 0;
}
i=0;
while(num>0)
{
m=num%10;
buf[i]=m+'0';
num=num/10;
i++;
}
i=0;
end=strlen(buf)-1;
while(i<end)
{
temp=buf[i];
buf[i]=buf[end];
buf[end]=temp;
i++;
end--;
}
strcpy(str+pos,buf);
return 0;
}
/*=========================================================
功能:
首先判断ch在*status状态下是否可接受(即str1+str2+ch是否为正确的表达式),
如不可以接受,则返回0,不作任何处理,
如可接受,作如下处理:
如ch为运算符,str+ch->str2,返回1,
如ch不为运算符,str2+ch->str2,返回值是2;
参数:str1为在LCD第三行显示的表式,str2为最后操作数表达式,str1+str2为完整
表达式,ch为将要接受的字符。*status为表达式的状态,在不同状态,表达式应接受
字符表达式是不同的。
===========================================================*/
uchar AddCh(uchar *status,uchar *str,uchar ch)
{
uchar xdata len,ret=100;
len=strlen(str);
switch(*status)
{
case 0:
if(ch=='0')
*status=1;
else if(ch>'0'&&ch<='9')
*status=2;
else if(ch=='.')
{
*status=3;
str[len]='0';
len++;
}
else
ret=0;
if(ret)
{
str[len]=ch;
str[len+1]='\0';
ret=2;
}
break;
case 1:
if(ch=='.')
{
*status=3;
str[len]=ch;
str[len+1]='\0';
ret=2;
}
else if(ch>='1'&&ch<='9')
{
*status=2;
str[len-1]=ch;
str[len]='\0';
ret=2;
}
else if(ch=='+'||ch=='-'||ch=='*'||ch=='/')
{
*status=0;
str[len]=ch;
str[len+1]='\0';
ret=1;
}
else
ret=0;
break;
case 2:
if((ch>='0'&&ch<='9'&&strlen(str)<6))
{
str[len]=ch;
str[len+1]='\0';
ret=2;
}
else if(ch==CAL_KEY00&&strlen(str)<5)
{
str[len]='0';
str[len+1]='0';
str[len+2]='\0';
ret=2;
}
else if(ch=='.')
{
*status=3;
str[len]=ch;
str[len+1]='\0';
ret=2;
}
else if(ch=='+'||ch=='-'||ch=='*'||ch=='/')
{
*status=0;
str[len]=ch;
str[len+1]='\0';
ret=1;
}
else
ret=0;
break;
case 3:
if(ch>='0'&&ch<='9')
{
*status=4;
str[len]=ch;
str[len+1]='\0';
ret=2;
}
else if(ch==CAL_KEY00)
{
*status=5;
str[len]='0';
str[len+1]='0';
str[len+2]='\0';
ret=2;
}
else if(ch=='+'||ch=='-'||ch=='*'||ch=='/')
{
*status=0;
str[len]=ch;
str[len+1]='\0';
ret=1;
}
else
ret=0;
break;
case 4:
if(ch>='0'&&ch<='9')
{
*status=5;
str[len]=ch;
str[len+1]='\0';
ret=2;
}
else if(ch=='+'||ch=='-'||ch=='*'||ch=='/')
{
*status=0;
str[len]=ch;
str[len+1]='\0';
ret=1;
}
else
ret=0;
break;
case 5:
if(ch=='+'||ch=='-'||ch=='*'||ch=='/')
{
*status=0;
str[len]=ch;
str[len+1]='\0';
ret=1;
}
else
ret=0;
break;
}
return ret;
}
/*=====================================================================
功能:此函数根据str最后一个字符ch(必为运算符)来进行运算,
如ch为'+''-',则进行表达式(除ch外的表达式)进行运算,否则
看此表达式是否有乘除运算,有只需算乘除运算
返回0运算正确,其它值表达式错误!
=====================================================================*/
uchar OperateByStr1(uchar *str)
{
uchar xdata len,ret,pos,i,k,ch;
uchar xdata str1[25];
len=strlen(str);
ch=str[len-1];
str[len-1]='\0';
if(ch=='+'||ch=='-')
{
ret=OperateByStr(str);
if(ret)
return ret;
}
else
{
len=len-1;
for(i=len;i>0;i--)
if(str[i-1]=='+'||str[i-1]=='-')
break;
pos=i;
k=0;
while(i<=len)
{
str1[k]=str[i];
k++;
i++;
}
str[pos]='\0';
ret=OperateByStr(str1);
if(ret)
return ret;
strcat(str,str1);
}
len=strlen(str);
str[len]=ch;
str[len+1]='\0';
return 0;
}
//===================================================
uchar CalWaitKey()
{
uchar key=0;
while(key==0)
{
openbacklight();
if(low_pwr) return VOID;
key=get_key();
}
/*if(key==ADD_KEY)
key='+';
else if(key==SUB_KEY)
key='-';
else */
/*if(key==MUL_KEY)
key='*';
else if(key==DIV_KEY)
key='-';
else if(key==KEY00)
key=CAL_KEY00;*/
//else if(key=='+'||key=='-')
//key=0x01;
return key;
}
/*-------------------------------------------------------------------------------
Funtion: 计算日期 (加减)
Input : TUcDateBuf:日期指针;TcDays:加减天数
Output : 计算得到的日期指针 date_result
Date: 2003-01-18
Editor:
----------------------------------------------------------------------------*/
void calc_date(uchar *TUcDateBuf,char TcDays,uchar *date_result)
{
uchar xdata m_day,i;
code uchar date[12] = {31,28,31,30,31,30,31,31,30,31,30,31};//非润年
code uchar date_r[12] = {31,29,31,30,31,30,31,31,30,31,30,31};//润年
////////////////Bcd to Bin and calculate day/////////////////
date_result[0] = (TUcDateBuf[0]>>4)*10 +(TUcDateBuf[0]&0xf);
date_result[1] = (TUcDateBuf[1]>>4)*10 +(TUcDateBuf[1]&0xf);
date_result[2] = (TUcDateBuf[2]>>4)*10 +(TUcDateBuf[2]&0xf)+ TcDays;
//////////////润年//////////////////
if(date_result[0]%4==0) m_day = date_r[date_result[1]-1];
else m_day = date[date_result[1]-1];
////////////////calculate date/////////////////
if(date_result[2]>m_day)
{
date_result[1] += 1;
if(date_result[1]>12)
{
date_result[0] += 1;
date_result[1] = 1;
}
date_result[2] = 1;
}
else if(!date_result[2])
{
date_result[1] -= 1;
if(!date_result[1])
{
date_result[0] -= 1;
date_result[1] = 12;
}
if(date_result[0]%4==0) date_result[2] = date_r[date_result[1]-1];
else date_result[2] = date[date_result[1]-1];
}
for(i=0;i<3;i++) date_result[i] = ((date_result[i]/10)<<4)|(date_result[i]%10);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -