科学计算器
1.任务
设计制作一个科学计算器。
2. 要求
(1)按数字 0-9 时应发出蜂鸣器声音,数越大,频率越高。 (20 分)
(2) 完成任意两位数(范围 0-99)的加减乘除运算,结果只需显示整数部分,但如果结果为负数应显示负号。 (20 分)
(3) 完成任意两位数(范围 0-99)的加减乘除运算, 结果要求有小数部分,显示为 xxxx.xxxx(小数点前不超过四位,小数点后若多于四位,只需显示四位),如果结果为负数应显示负号。 (20 分)
(4) 完成任意三位数(范围 0-999)的加减乘除运算, 结果只需显示整数部分,但如果结果为负数应显示负号。(10 分)
(5) 对任意两位整数进行开方运算,结果保留 4 位有效数字。(10 分)
(6) 请完成由三个任意二位数组成,格式为 dpdpd 形式表达式的运算(假定 d表示任意整数, p 表示任意操作符(加减乘除),x 表示单个数字, 则 dpdpd 的可能形式之一为 11/2+3)。
3.代码
#include<reg52.h>
#include<intrins.h>
#include<stdio.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
/************蜂鸣器*****************/
sbit beep=P3^7;
/************LCD*********************/
sbit lcden=P3^4;//液晶使能端
sbit lcdrs=P3^5;//液晶数据命令选择端
/*************按键******************/
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
sbit key5=P1^4;
sbit key6=P1^5;
sbit key7=P1^6;
sbit key8=P1^7;
sbit key9=P2^0;
sbit key10=P2^1;
sbit key11=P2^2;
sbit key12=P2^3;
sbit key13=P2^4;
sbit key14=P2^5;
sbit key15=P2^6;
sbit key16=P2^7;
sbit key17=P3^0;
sbit key18=P3^1;
sbit key19=P3^2;
sbit key20=P3^3;
uchar array[16]={'\0','\0','\0','\0','\0','\0'};// 键盘扫描
uchar str[16]={'\0','\0','\0','\0'}; // 主函数转换
uint idata va1_ge, va1_shi,va1_bai,va1_qian,va1_wan,va2_ge,va2_shi,va2_bai,va3_ge,va3_shi;//获取操作数
uchar idata operator,operator1 ,operator2;
int idata operator3_int,operator2_int,operator1_int,value_char,value_int,value_int_jueduizhi;//运算结果
float idata value_float;
int idata value_int_ge, value_int_shi, value_int_bai,value_int_qian,value_int_wan,value_int_shiwan,value_int_shiwan; //运算结果的各位
unsigned long int value_int_long;//运算结果
int idata jj=0;//array下标,
/********函数声明*********/
void key_scan(void);
void delay(uint z);
void write_com(uchar com);
void write_data(uchar date);
void LCD_Init(void);
void beep0(void);
void beep1(void);
void beep2(void);
void beep3(void);
void beep4(void);
void beep5(void);
void beep6(void);
void beep7(void);
void beep8(void);
void beep9(void);
/*************************主函数*****************/
void main(void)
{
int i=0;
LCD_Init();
beep=0;//不响
while(1)
{
key_scan();
/******************************两位数算数运算****************************/
if(array[5]=='='&&(array[2]=='+'||array[2]=='-'||array[2]=='*'||array[2]=='/'))
{
va1_shi=array[0]-48;
va1_ge=array[1]-48;
operator=array[2];
va2_shi=array[3]-48;
va2_ge=array[4]-48;
operator1_int=va1_shi*10+va1_ge;// 操作数1(十)
operator2_int=va2_shi*10+va2_ge;//操作数2(十)
switch(operator)
{
case '+':
value_int=operator1_int+operator2_int; //value_int(20-198)
if(value_int<=99)
{
value_int_ge= value_int%10;//取出个位数
str[0]=value_int_ge+48;
value_int_shi= value_int/10;//取出十位数
str[1]= value_int_shi+48;
write_data(str[1]);
write_data(str[0]);
}
else if(value_int>=100)
{
value_int_ge= value_int%10;//取出个位数
str[0]=value_int_ge+48;
value_int_shi= value_int/10%10;//取出十位数
str[1]= value_int_shi+48;
value_int_bai=value_int/100;//取出百位数
str[2]= value_int_bai+48;
write_data(str[2]);
write_data(str[1]);
write_data(str[0]);
}
break;
case '-':
value_int=operator1_int-operator2_int; //value_int(-99-99)
if(value_int<0)
{
if(value_int>-10)
{
value_int_jueduizhi=operator2_int-operator1_int;
str[0]=value_int_jueduizhi+48;
write_data('-');
write_data(str[0]);
}
else if(value_int<-10)
{
value_int_jueduizhi=operator2_int-operator1_int;
str[0]=value_int_jueduizhi%10+48;
str[1]=value_int_jueduizhi/10+48;
write_data('-');
write_data(str[1]);
write_data(str[0]);
}
}
else if(value_int==0)
{
write_data('0');
}
else if(value_int>0)
{
if(value_int>10)
{
value_int_ge= value_int%10;//取出个位数
str[6]=value_int_ge+48;
value_int_shi= value_int/10;//取出十位数
str[7]= value_int_shi+48;
write_data(str[7]);
write_data(str[6]);
}
else if(value_int<10)
{
str[8]=value_int+48;
write_data(str[8]);
}
}
break;
case '*':
value_int=operator2_int*operator1_int;
if(value_int<1000)
{
value_int_ge= value_int%10;//取出个位数
str[0]=value_int_ge+48;
value_int_shi= value_int/10%10;//取出十位数
str[1]= value_int_shi+48;
value_int_bai=value_int/100;//取出百位数
str[2]= value_int_bai+48;
write_data(str[2]);
write_data(str[1]);
write_data(str[0]);
}
else if(value_int>=1000)
{
value_int_ge= value_int%10;//取出个位数
str[0]=value_int_ge+48;
value_int_shi= value_int/10%10;//取出十位数
str[1]= value_int_shi+48;
value_int_bai=value_int/100%10;//取出百位数
str[2]= value_int_bai+48;
value_int_qian=value_int/1000;//取出千位数
str[3]= value_int_qian+48;
write_data(str[3]);
write_data(str[2]);
write_data(str[1]);
write_data(str[0]);
}
break;
//两位数除法运算
case '/': //0.101010-9.9
value_float=operator1_int/((float)operator2_int);
sprintf(str,"%1.4f",value_float);
if(operator1_int==operator2_int)
write_data(str[0]);
else if((str[2]!='0')&&(str[3]=='0')&&(str[4]=='0')&&(str[5]=='0'))
{write_data(str[0]);write_data(str[1]);write_data(str[2]); }
// if((str[2]!='0')&&(str[3]!='0')&&(str[4]=='0')&&(str[5]=='0'))
// {write_data(str[0]);write_data(str[1]);write_data(str[2]);write_data(str[3]); }
//
// if((str[2]!='0')&&(str[3]!='0')&&(str[4]!='0')&&(str[5]=='0'))
// {write_data(str[0]);write_data(str[1]);write_data(str[2]);write_data(str[3]);write_data(str[4]); }
//
else
{write_data(str[0]);write_data(str[1]);write_data(str[2]);write_data(str[3]);write_data(str[4]); write_data(str[5]);}
break;
}
for(i=0;i<=15;i++)
{
array[i]='\0';
}
jj=0;
}
/******************************二进制转换********************************************************/
else if((array[1]=='B')&&(array[2]=='='))
{
if(array[0]=='0')
{
write_data('0');
write_data('0');
write_data('0');
write_data('0');
}
if(array[0]=='1')
{
write_data('0');
write_data('0');
write_data('0');
write_data('1');
}
if(array[0]=='2')
{
write_data('0');
write_data('0');
write_data('1');
write_data('0');
}
if(array[0]=='3')
{
write_data('0');
write_data('0');
write_data('1');
write_data('1');
}
if(array[0]=='4')
{
write_data('0');
write_data('1');
write_data('0');
write_data('0');
}
if(array[0]=='5')
{
write_data('0');
write_data('1');
write_data('0');
write_data('1');
}
if(array[0]=='6')
{
write_data('0');
write_data('1');
write_data('1');
write_data('0');
}
if(array[0]=='7')
{
write_data('0');
write_data('1');
write_data('1');
write_data('1');
}
if(array[0]=='8')
{
write_data('1');
write_data('0');
write_data('0');
write_data('0');
}
if(array[0]=='9')
{
write_data('1');
write_data('0');
write_data('0');
write_data('1');
}
for(i=0;i<=15;i++)
{
array[i]='\0';
}
jj=0;
}
/****************************三位数算数运算**********************************************************/
else if((array[7]=='=')&&(array[4]!='.'))
{
va1_bai=array[0]-48; //第一个操作数的百位
va1_shi=array[1]-48;//第一个操作数的十位
va1_ge=array[2]-48;//第一个操作数的个位
operator=array[3];
va2_bai=array[4]-48; //第二个操作数的百位
va2_shi=array[5]-48;//第二个操作数的十位
va2_ge=array[6]-48;//第二个操作数的个位
operator1_int=va1_bai*100+va1_shi*10+va1_ge;
operator2_int= va2_bai*100+va2_shi*10+va2_ge;
switch(operator)
{
case '+':
value_int=operator1_int+operator2_int; //value_int(200-1998)
if(value_int<=999)
{
value_int_ge= value_int%10;//取出个位数
str[0]=value_int_ge+48;
value_int_shi= value_int/10%10;//取出十位数
str[1]= value_int_shi+48;
value_int_bai=value_int/100;//取出百位数
str[2]= value_int_bai+48;
write_data(str[2]);
write_data(str[1]);
write_data(str[0]);
}
else if(value_int>999)
{
value_int_ge= value_int%10;//取出个位数
str[0]=value_int_ge+48;
value_int_shi= value_int/10%10;//取出十位数
str[1]= value_int_shi+48;
value_int_bai=value_int/100%10;//取出百位数
str[2]= value_int_bai+48;
value_int_qian=value_int/1000;//取出千位数
str[3]= value_int_qian+48;
write_data(str[3]);
write_data(str[2]);
write_data(str[1]);
write_data(str[0]);
}
break;
case '*':
value_int_long=operator1_int*operator2_int;//操作数正确 计算结果不正确(14961) 实际998001
value_int_ge=value_int_long%10;//0
str[0]=value_int_ge+48;
value_int_shi=value_int_long/10%10;//5
str[1]=value_int_shi+48;
value_int_bai=value_int_long/100%10;//2
str[2]=value_int_bai+48;
value_int_qian=value_int_long/1000%10; //1
str[3]=value_int_qian+48;
value_int_wan=value_int_long/10000%10;//1
str[4]=value_int_wan+48;
value_int_shiwan=value_int_long/100000;//2
str[5]=value_int_shiwan+48; //0
if(str[5]!='0')
{write_data(str[5]);}
write_data(str[4]);
write_data(str[3]);
write_data(str[2]);
write_data(str[1]);
write_data(str[0]);
break;
case '/':
if((operator1_int==999)&&(operator2_int==100)) write_data('9');
else
{
value_float=operator1_int/(float)operator2_int;
sprintf(str,"%1.2f",value_float);
write_data(str[0]);
}
break;
case '-':
value_int=operator1_int-operator2_int;
if((value_int>=0)&&(value_int<10))
{
str[0]=value_int+48;
write_data(str[0]);
}
else if((value_int>=10)&&(value_int<100))
{
value_int_ge=value_int%10;
str[0]=value_int_ge+48;
value_int_shi=value_int/10;
str[1]=value_int_shi+48;
write_data(str[1]);
write_data(str[0]);
}
else if(value_int>=100)
{
value_int_ge=value_int%10;
str[0]=value_int_ge+48;
value_int_shi=value_int/10%10;
str[1]=value_int_shi+48;
value_int_bai=value_int/100;
str[2]=value_int_bai+48;
write_data(str[2]);
write_data(str[1]);
write_data(str[0]);
}
else if((-10<value_int)&&(value_int<0))
{
value_int_jueduizhi=operator2_int-operator1_int;
str[0]=value_int_jueduizhi+48;
write_data('-');
write_data(str[0]);
}
else if((-100<value_int)&&(value_int<=-10))
{
value_int_jueduizhi=operator2_int-operator1_int;
value_int_ge=value_int_jueduizhi%10;
str[0]=value_int_ge+48;
value_int_shi=value_int_jueduizhi/10;
str[1]=value_int_shi+48;
write_data('-');
write_data(str[1]);
write_data(str[0]);
}
else if(value_int<=-100)
{
value_int_jueduizhi=operator2_int-operator1_int;
value_int_ge=value_int_jueduizhi%10;//
str[0]=value_int_ge+48;
value_int_shi=value_int_jueduizhi/10%10;
str[1]=value_int_shi+48;
value_int_bai=value_int_jueduizhi/100;
str[2]=value_int_bai+48;
write_data('-');
write_data(str[2]);
write_data(str[1]);
write_data(str[0]);
}
break;
}
for(i=0;i<=15;i++)
{
array[i]='\0';
}
jj=0;
}
/****************************************对两位整数进行开方运算*************************************/
else if(array[2]=='K'&&array[3]=='=')
{
va1_shi=array[0]-48;
va1_ge=array[1]-48;
value_int=va1_shi*10+va1_ge;
value_float=sqrt(value_int);
sprintf(str,"%1.4f",value_float);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
write_data(str[3]);
write_data(str[4]);
for(i=0;i<=15;i++)
{
array[i]='\0';
}
jj=0;
}
/*****************正弦函数******************************************************/
else if(array[0]=='S')
{
/****************一位整数****************/
if(array[2]=='=')
{
value_int=array[1]-48;
value_float= value_int*(3.141592/180);//弧度
value_float=sin(value_float);
sprintf(str,"%1.6f",value_float);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
write_data(str[3]);
write_data(str[4]);
write_data(str[5]);
write_data(str[6]);
write_data(str[7]);
for(i=0;i<=15;i++)
{
array[i]='\0';
}
jj=0;
}
/****************两位整数****************/
else if(array[3]=='=')
{
va1_shi=array[1]-48;
va1_ge=array[2]-48;
value_int=va1_shi*10+va1_ge;//度数
value_float= value_int*(3.141592/180);//弧度
value_float=sin(value_float);
sprintf(str,"%1.6f",value_float);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
write_data(str[3]);
write_data(str[4]);
write_data(str[5]);
write_data(str[6]);
write_data(str[7]);
for(i=0;i<=15;i++)
{
array[i]='\0';
}
jj=0;
}
/***********************三位整数***********************/
else if(array[4]=='=')
{
va1_shi=array[2]-48;
va1_ge=array[3]-48;
va1_bai=array[1]-48;
value_int=va1_bai*100+va1_shi*10+va1_ge;//度数
value_float=value_int*(3.141592/180);//弧度
value_float=sin(value_float);
sprintf(str,"%1.5f",value_float);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
write_data(str[3]);
write_data(str[4]);
write_data(str[5]);
write_data(str[6]);
for(i=0;i<=15;i++)
{
array[i]='\0';
}
jj=0;
}
/***********************小数点前1位***********************/
else if((array[2]=='.')&&(array[5]=='='))
{
va1_shi=array[3]-48;
va1_ge=array[4]-48;
va1_bai=array[1]-48;
value_float=va1_bai+va1_shi*0.1+va1_ge*0.01;//度数
value_float=value_float*(3.141592/180);//弧度
value_float=sin(value_float);
sprintf(str,"%1.5f",value_float);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
write_data(str[3]);
write_data(str[4]);
write_data(str[5]);
write_data(str[6]);
for(i=0;i<=15;i++)
{
array[i]='\0';
}
jj=0;
}
/***********************小数点前2位***********************/
else if((array[3]=='.')&&(array[6]=='='))
{
va1_shi=array[2]-48;
va1_ge=array[5]-48;
va1_bai=array[4]-48;
va1_qian=array[1]-48;
value_float=va1_qian*10+va1_bai+va1_shi*0.1+va1_ge*0.01;//度数
value_float=value_float*(3.141592/180);//弧度
value_float=sin(value_float);
sprintf(str,"%1.5f",value_float);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
write_data(str[3]);
write_data(str[4]);
write_data(str[5]);
write_data(str[6]);
for(i=0;i<=15;i++)
{
array[i]='\0';
}
jj=0;
}
/***********************小数点前3位***********************/
else if((array[4]=='.')&&(array[7]=='='))
{
va1_shi=array[5]-48;
va1_ge=array[6]-48;
va1_bai=array[3]-48;
va1_qian=array[2]-48;
va1_wan=array[1]-48;
value_float=va1_wan*100+va1_qian*10+va1_bai+va1_shi*0.1+va1_ge*0.01;//度数
value_float=value_float*(3.141592/180);//弧度
value_float=sin(value_float);
sprintf(str,"%1.5f",value_float);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
write_data(str[3]);
write_data(str[4]);
write_data(str[5]);
write_data(str[6]);
for(i=0;i<=15;i++)
{
array[i]='\0';
}
jj=0;
}
}
/****************第六问 两位操作数 (加 减 塍 除) 两位操作数 (加 减 塍 除)两位操作数*******************/
else if(array[8]=='=')
{
va1_shi=array[0]-48;
va1_ge=array[1]-48;
operator1_int=va1_shi*10+va1_ge;//操作数1
operator1=array[2];
operator2=array[5];
va2_ge=array[4]-48;
va2_shi=array[3]-48;
operator2_int=va2_shi*10+va2_ge;//操作数2
va3_ge=array[7]-48;
va3_shi=array[6]-48;
operator3_int=va3_shi*10+va3_ge;//操作数3
if(operator1=='/')
{
/******先除 再加 范围10.0101-108.9000**********/
if(operator2=='+')
{
value_float=(operator1_int/(float)operator2_int)+operator3_int;
sprintf(str,"%.4f",value_float);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
write_data(str[3]);
write_data(str[4]);
write_data(str[5]);
write_data(str[6]);
write_data(str[7]);
write_data(str[8]);
write_data(str[9]);
}
/******先除 再除****范围0.0010-0.9900******/
if(operator2=='/')
{
value_float=(operator1_int/(float)operator2_int)/operator3_int;
sprintf(str,"%.6f",value_float);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
write_data(str[3]);
write_data(str[4]);
write_data(str[5]);
}
/******先除 再乘以****范围1.0100-980.1******/
else if(operator2=='*')
{
value_float=(operator1_int/(float)operator2_int)*operator3_int;
sprintf(str,"%.6f",value_float);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
write_data(str[3]);
write_data(str[4]);
write_data(str[5]);
}
/******先除 再减****范围1.0100-980.1******/
else if(operator2=='-')
{
value_float=(operator1_int/(float)operator2_int)-operator3_int;
sprintf(str,"%.6f",value_float);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
write_data(str[3]);
write_data(str[4]);
write_data(str[5]);
write_data(str[6]);
write_data(str[7]);
write_data(str[8]);
}
}
else if(operator1=='*')
{
/******先乘 再加 *******0**********/
if(operator2=='+')
{
value_int=operator1_int*operator2_int+operator3_int;
sprintf(str,"%.6d",value_int);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
write_data(str[3]);
write_data(str[4]);
write_data(str[5]);
}
/******先乘 再除 **********0**********/
else if(operator2=='/')
{
value_float=(operator1_int*(float)operator2_int)/operator3_int;
sprintf(str,"%.4f",value_float);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
write_data(str[3]);
write_data(str[4]);
write_data(str[5]);
write_data(str[6]);
write_data(str[7]);
write_data(str[8]);
write_data(str[9]);
}
/******先乘 再减 **********0**********/
else if(operator2=='-')
{
value_int=operator1_int*operator2_int-operator3_int;
sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
write_data(str[3]);
}
}
else if(operator1=='+')
{
/******先加 再加 *******0**********/
if(operator2=='+')
{
value_int=operator1_int+operator2_int+operator3_int;
if(value_int<100)
{ sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
}
else
{
sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
}
}
/******先加 再减 *******0**********/
else if(operator2=='-')
{
value_int=operator1_int+operator2_int-operator3_int;
if(value_int<0)
{
if(value_int<-10)
{
sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
}
else
{
sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
}
}
if(value_int>0)
{
if(value_int<10)
{
sprintf(str,"%d",value_int);
write_data(str[0]);
}
else if(value_int>=100)
{
sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
}
else
{
sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
}
}
}
/******************先加 再乘*************/
else if(operator2=='*')
{
value_int=operator1_int+operator2_int*operator3_int;
if(value_int<1000)
{
sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
}
else
{ sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
write_data(str[3]);
}
}
/******先加 再除*************/
else if(operator2=='/')
{
value_float=operator1_int+operator2_int/(float)operator3_int;
sprintf(str,"%.4f",value_float);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
write_data(str[3]);
write_data(str[4]);
write_data(str[5]);
write_data(str[6]);
write_data(str[7]);
write_data(str[8]);
write_data(str[9]);
}
}
else if(operator1=='-')
{
/**********************先减 再加 *******0**********/
if(operator2=='+')
{
value_int=operator1_int-operator2_int+operator3_int;
if(value_int>0)
{
if(value_int<10)
{
sprintf(str,"%d",value_int);
write_data(str[0]);
}
else if(value_int<100)
{
sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
}
else
{
sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
}
}
else
{
if(value_int>-10)
{
sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
}
else
{
sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
}
}
}
/**********************先减 再减 *******0**********/
else if(operator2=='-')
{
value_int=operator1_int-operator2_int-operator3_int;
if(value_int>0)
{
if(value_int<10)
{
sprintf(str,"%d",value_int);
write_data(str[0]);
}
else
{
sprintf(str,"%d",value_int);
write_data(str[0]); write_data(str[1]);
}
}
else if(value_int==0) write_data('0');
else
{
if(value_int>-10)
{
sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
}
else if(value_int<-100)
{
sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
write_data(str[3]);
}
else
{
sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
}
}
}
/**********************先减 再乘 范围是-9791到-1 *******0**********/
else if(operator2=='*')
{
value_int=operator1_int-operator2_int*operator3_int;
if(value_int>-10) //6
{
sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
}
else if (value_int>-100)
{
sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
}
else if (value_int>-1000)
{
sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
write_data(str[3]);
}
else
{
sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
write_data(str[3]);
write_data(str[4]);
}
}
/**********************先减 再除 范围是 *******0**********/
else if(operator2=='/')
{
value_float=operator1_int-operator2_int/(float)operator3_int;
if(value_float<1)
{
sprintf(str,"%.6f",value_float);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
}
else if(value_float<10)
{
sprintf(str,"%.6f",value_float);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
}
else
{
sprintf(str,"%.6f",value_float);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
write_data(str[3]);
write_data(str[4]) ;
write_data(str[5]) ;
}
}
}
for(i=0;i<=15;i++)
{
array[i]='\0';
}
jj=0;
}
/**************** 二位操作数 (加 减 塍 除) 一位操作数 (加 减 塍 除)二位操作数*******************/
/**************** 一位操作数 (加 减 塍 除) 一位操作数 (加 减 塍 除)一位操作数*******************/
else if(array[5]=='=')
{
operator1_int=array[0]-48;//操作数1
operator1=array[1];
operator2=array[3];
operator2_int=array[2]-48;;//操作数2
operator3_int=array[4]-48;//操作数3
if( operator1=='+')
{
/**********加 加*************/
if(operator2=='+')
{
value_int=operator1_int+operator2_int+operator3_int;
if(value_int<10)
{
sprintf(str,"%d",value_int);
write_data(str[0]);
}
else
{
sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
}
}
/********加*减*************/
else if(operator2=='-')
{
value_int=operator1_int+operator2_int-operator3_int;
if(value_int>0)
{
if(value_int<10)
{
str[0]=value_int+48;
write_data(str[0]);
}
else
{
sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
}
}
else
{
sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
}
}
/********加*乘**(0-90)***********/
else if(operator2=='*')
{
value_int=operator1_int+operator2_int*operator3_int;
if(value_int<10)
{
str[0]=value_int+48;
write_data(str[0]);
}
else
{
sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
}
}
/********加*除(0-18)*************/
else if(operator2=='/')
{
value_float=operator1_int+operator2_int/(float)operator3_int;
if(value_float<10)
{
sprintf(str,"%f",value_float);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
write_data(str[3]);
}
else
{
sprintf(str,"%f",value_float);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
write_data(str[3]);
}
}
}
else if(operator1=='-')
{
/*********************先减 在加***********************************/
if(operator2=='+')
{
value_int=operator1_int-operator2_int+operator3_int;
if(value_int<0)
{
sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
}
else if(value_int==0)
{
write_data('0');
}
else
{
if(value_int<10)
{
str[2]= value_int+48;
write_data(str[2]);
}
else
{
sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
}
}
}
/*********************先减 再减***********************************/
else if(operator2=='-')
{
value_int=operator1_int-operator2_int-operator3_int;
if(value_int<0)
{
if(value_int>-10)
{
sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
}
else
{
sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
}
}
else if(value_int==0)
{
write_data('0');
}
else
{
str[0]= value_int+48;
write_data(str[0]);
}
}
/*********************先减 再乘***********************************/
else if(operator2=='*')
{
value_int=operator1_int-operator2_int*operator3_int;
if(value_int>0)
{
str[0]= value_int+48;
write_data(str[0]);
}
else if(value_int==0)
{
write_data('0');
}
else
{
sprintf(str,"%d",value_int);
write_data(str[0]);
write_data(str[1]);
}
}
/*********************先减 再除***********************************/
else if(operator2=='/')
{
value_float=operator1_int-operator2_int/(float)operator3_int;
if(value_float>0)
{
sprintf(str,"%f",value_float);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
write_data(str[3]);
}
else
{
sprintf(str,"%f",value_float);
write_data(str[0]);
write_data(str[1]);
write_data(str[2]);
write_data(str[3]);
write_data(str[4]);
write_data(str[5]);
}
}
}
for(i=0;i<=15;i++)
{
array[i]='\0';
}
jj=0;
}
}
}
void key_scan(void)
{
uchar skey;
if(key1==0)
{
delay(10);
if(key1==0)
{
skey = '7';
array[jj++]=skey;
beep7();
}
while(!key1);
write_data(skey);
}
if(key2==0)
{
delay(10);
if(key2==0)
{
skey = '4';
array[jj++]=skey;
beep4();
}
while(!key2);
write_data(skey);
}
if(key3==0)
{
delay(10);
if(key3==0)
{
skey = '1';
array[jj++]=skey;
beep1();
}
while(!key3);
write_data(skey);
}
if(key4==0)
{
delay(10);
if(key4==0)
{
skey = '.';
array[jj++]=skey;
}
while(!key4);
write_data(skey);
}
if(key5==0)
{
delay(10);
if(key5==0)
{
skey = '8';
array[jj++]=skey;
beep8();
}
while(!key5);
write_data(skey);
}
if(key6==0)
{
delay(10);
if(key6==0)
{
skey = '5';
array[jj++]=skey;
beep5();
}
while(!key6);
write_data(skey);
}
if(key7==0)
{
delay(10);
if(key7==0)
{
skey = '2';
array[jj++]=skey;
beep2();
}
while(!key7);
write_data(skey);
}
if(key8==0)
{
delay(10);
if(key8==0)
{
skey = '0';
array[jj++]=skey;
beep0();
}
while(!key8);
write_data(skey);
}
if(key9==0)
{
delay(10);
if(key9==0)
{
skey = '9';
array[jj++]=skey;
beep9();
}
while(!key9);
write_data(skey);
}
if(key10==0)
{
delay(10);
if(key10==0)
{
skey = '6';
array[jj++]=skey;
beep6();
}
while(!key10);
write_data(skey);
}
if(key11==0)
{
delay(10);
if(key11==0)
{
skey = '3';
array[jj++]=skey;
beep3();
}
while(!key11);
write_data(skey);
}
if(key12==0)
{
delay(10);
if(key12==0)
{
skey = '=';
array[jj++]=skey;
}
while(!key12);
write_data(skey);
}
if(key13==0)
{
delay(10);
if(key13==0)
{
skey = '/';
array[jj++]=skey;
}
while(!key13);
write_data(skey);
}
if(key14==0)
{
delay(10);
if(key14==0)
{
skey = '*';
array[jj++]=skey;
}
while(!key14);
write_data(skey);
}
if(key15==0)
{
delay(10);
if(key15==0)
{
skey = '-';
array[jj++]=skey;
}
while(!key15);
write_data(skey);
}
if(key16==0)
{
delay(10);
if(key16==0)
{
skey = '+';
array[jj++]=skey;
}
while(!key16);
write_data(skey);
}
if(key17==0)
{
delay(10);
if(key17==0)
{
skey = 'C';
array[jj++]=skey;
}
write_data(skey);
delay(100);
while(!key17); write_com(0x01);//显示清屏
jj=0;
}
if(key18==0)
{
delay(10);
if(key18==0)
{
skey = 'K';
array[jj++]=skey;
}
while(!key18);
write_data(skey);
}
if(key19==0)
{
delay(10);
if(key19==0)
{
skey = 'B';
array[jj++]=skey;
}
while(!key19);
write_data(skey);
}
if(key20==0)
{
delay(10);
if(key20==0)
{
skey = 'S';
array[jj++]=skey;
}
while(!key20);
write_data(skey);
write_data('i');
write_data('n');
}
}
void beep0(void)
{
uchar i,j;
for(i=0;i<125;i++)
{
beep=!beep;
for(j=0;j<200;j++)
_nop_();
}
beep=0;//关闭蜂鸣器
}
void beep1(void)
{
uchar i,j;
for(i=0;i<125;i++)
{
beep=!beep;
for(j=0;j<180;j++)
_nop_();
}
beep=0;//关闭蜂鸣器
}
void beep2(void)
{
uchar i,j;
for(i=0;i<125;i++)
{
beep=!beep;
for(j=0;j<80;j++)
_nop_();
}
beep=0;//关闭蜂鸣器
}
void beep3(void)
{
uchar i,j;
for(i=0;i<125;i++)
{
beep=!beep;
for(j=0;j<140;j++)
_nop_();
}
beep=0;//关闭蜂鸣器
}
void beep4(void)
{
uchar i,j;
for(i=0;i<125;i++)
{
beep=!beep;
for(j=0;j<120;j++)
_nop_();
}
beep=0;//关闭蜂鸣器
}
void beep5(void)
{
uchar i,j;
for(i=0;i<125;i++)
{
beep=!beep;
for(j=0;j<100;j++)
_nop_();
}
beep=0;//关闭蜂鸣器
}
void beep6(void)
{
uchar i,j;
for(i=0;i<125;i++)
{
beep=!beep;
for(j=0;j<200;j++)
_nop_();
}
beep=0;//关闭蜂鸣器
}
void beep7(void)
{
uchar i,j;
for(i=0;i<125;i++)
{
beep=!beep;
for(j=0;j<160;j++)
_nop_();
}
beep=0;//关闭蜂鸣器
}
void beep8(void)
{
uchar i,j;
for(i=0;i<125;i++)
{
beep=!beep;
for(j=0;j<240;j++)
_nop_();
}
beep=0;//关闭蜂鸣器
}
void beep9(void)
{
uchar i,j;
for(i=0;i<125;i++)
{
beep=!beep;
for(j=0;j<160;j++)
_nop_();
}
beep=0;//关闭蜂鸣器
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
lcdrs=0;//选择写命令模式
P0=com;//将要写的命令字送到数据总线上
delay(5);//稍作延时以待数据稳定
lcden=1;//使能端给一高电平
delay(5);//稍作延时
lcden=0;//使能端置1以完成高脉冲
}
void write_data(uchar date)
{
lcdrs=1;//选择写数据模式
P0=date;//将要写的数据字送到数据总线上
delay(5);
lcden=1;// 使能端给一高电平
delay(5);
lcden=0;//使能端置1以完成高脉冲
}
void LCD_Init(void)
{
lcden=0;//液晶使能端为低电平
/*显示模式设置*/
write_com(0x38);//16*2显示 5*7点阵 8位数据接口
/*显示开/关及光标设置*/
write_com(0x0c);//设置开显示,不显示光标
write_com(0x06);//写一个字符后地址指针加1,整屏显示不移动
write_com(0x01);//显示清0,数据指针清0
write_com(0x80);//第一行显示
}