switch (KeyValue)
{
//key计算最新键入的值,用temp存放被加(减、乘、除)数,result存放最新键入的值或计算结果
case 0:dan='1';key=key*10+1;result=key;break;//键入1,dan储存刚输入的单个数位上的数字
case 1:dan='2';key=key*10+2;result=key;break;//键入2
case 2:dan='3';key=key*10+3;result=key;break;//键入3
case 3:x='+';xf=1;temp=result;key=0;a=1;break; //选择加法,x储存选择的运算符,选择后xf置为1
case 4:dan='4';key=key*10+4;result=key;break;//键入4
case 5:dan='5';key=key*10+5;result=key;break;//键入5
case 6:dan='6';key=key*10+6;result=key;break;//键入6
case 7:x='-';xf=1;temp=result;key=0;b=1;break; //选择减法,
case 8:dan='7';key=key*10+7;result=key;break;//键入7
case 9:dan='8';key=key*10+8;result=key;break;//键入8
case 10:dan='9';key=key*10+9;result=key;break;//键入9
case 11:x='*';xf=1;temp=result;key=0;c=1;break; //选择乘法
case 12:temp=key=result=0;a=b=c=d=0;x=dan=0;xf=y=bei=0;break;//所有清零
case 13:dan='0';key=key*10+0;result=key;break;//键入0
case 14:if(a==1) {result=temp+result;a=0;key=0;} //计算运算结果
if(b==1) {result=temp-result;b=0;key=0;}
if(c==1) {result=temp*result;c=0;key=0;}
if(d==1)
{
if (result==0) //若除数为0,运算非法,error置为1
{error=1;result=0;d=0;key=0;}
else
{result=temp/result;d=0;key=0;}
}
y=1; //将要输出运算结果,则y置为1
break;
case 15:x='/';xf=1;temp=result;key=0;d=1;break; //选择除法
}
//LCD显示
if (y==0)//若y为0,则不是输出结果,而是输出等式的左边
{
if (KeyValue==12) OLED_Clear() ;//清零则清屏
else if(x==0&&bei==0) bei=1,OLED_Clear() ,OLED_WR_Byte(dan, 1);//若x和bei都为0,则当前正开始输入被加(减、乘、除)数,要清屏再输出,同时bei置为1
else if(x==0&&bei==1) OLED_WR_Byte( dan, 1);//若x为0,bei为1,则运算符未选择,即当前仍然在输入被加(减、乘、除)数,继续逐位输出显示
else if(x!=0&&xf==1) xf=0,bei=0,OLED_Clear() ,LcdDisplay_1(result),OLED_WR_Byte(x,1);//若x和xf都不为0,则为刚选择运算符,将运算符输出且xf重新置为0,此时被加(减、乘、除)数已输完,bei也要重新置为0
else if(x!=0&&xf==0) OLED_WR_Byte( dan,1);//若运算符已选但不是刚选,则当前正输入加(减、乘、除)数,逐位输出显示
}
else //否则输出结果
{
LcdDisplay_2(result); //输出结果
x=0; //运算符已选,重新置为0
y=0; //输出结果后,重新置为0
}
}
}
}
}
void LcdDisplay_1(long number)//在第一行输出被加(减、乘、除)数
{
int i,n[5]={0}; //不能设成unsigned
if (number<0)
OLED_WR_Byte('-',1);
number=abs(number); //取绝对值
if (number-10000>=0) i=5; //判断有效位数
else if (number-1000>=0) i=4;
else if (number-100>=0) i=3;
else if (number-10>=0) i=2;
else i=1;
n[4]=number/ 10000; //提取各位上的数
n[3]=number % 10000 / 1000;
n[2]=number % 1000 / 100;
n[1]=number % 100 / 10;
n[0]=number % 10;
for (i=i-1;i>=0;i--) //若设成unsigned,此处形成死循环!!!
{
OLED_WR_Byte(n[i]+48,1);//输出
}
}
void LcdDisplay_2(long number)//在第二行输出结果
{
int i,n[5]; //不能设成unsigned
//判断运算是否合法
if (error==1) //若error为1,则运算非法
{
error=0; //error重新置为0
OLED_Clear() ; //清屏
OLED_WR_Byte(0x80,0); //数据指针返回首位
for (i=0;i<9;i++) //输出提示
OLED_WR_Byte( e[i],1);
Delay_ms(1500);
OLED_Clear() ; //再次清屏
}
else //合法则输出结果
{
OLED_WR_Byte('=',1); //先在第一行输出'='
OLED_WR_Byte( 0xc0,0); //数据指针设置在第二行首位
if (number<0) //负数则输出负号
OLED_WR_Byte('-',1);
number=abs(number);
if (number-10000>=0) i=5; //判断有效位数
else if (number-1000>=0) i=4;
else if (number-100>=0) i=3;
else if (number-10>=0) i=2;
else i=1;
n[4]=number/10000;
n[3]=number%10000/1000;
n[2]=number%1000/100;
n[1]=number%100/10;
n[0]=number%10;
for (i=i-1;i>=0;i--) //若设成unsigned,此处形成死循环!!!
{
OLED_WR_Byte(n[i]+48,1);
}
}
/*
SBUF = '0'+m; //将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0; //发送完成标志位清零
*/
}
void Delay_ms(unsigned int ms)//延时函数,延时1ms
{
int j;
for(;ms>0;ms--)
for(j=140;j>0;j--);
}