科学计算器
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]=='=')&