基于51单片机的科学计算器
科学计算器
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);//第一行显示
}
基于51单片机的科学计算器相关推荐
- c语言51单片机计算器,新基于51单片机的简易计算器
<新基于51单片机的简易计算器>由会员分享,可在线阅读,更多相关<新基于51单片机的简易计算器(24页珍藏版)>请在人人文库网上搜索. 1.基于51单片机的简易计算器1.前言: ...
- 基于51单片机的简单计算器
在上一篇中,我们已经说过了基于51单片机的简单拨号器,在下边,我们将写一个计算器程序,原理很简单,只需要在拨号器的基础上,算出拨号器所表示的数字,并进行计算即可. 代码如下: #include&quo ...
- 基于51单片机的简易计算器的实现
目录 一.硬件简介 1.LCD1602液晶显示器介绍 (1)LCD1602的组成 (2)各引脚功能介绍 (3)DDRAM 2.矩阵按键介绍 (1)矩阵按键的优点: (2)原理: (3)检测方法: (4 ...
- 基于51单片机的智能计算器Protues仿真设计
目录 一.设计背景 二.实现功能 三.硬件设计 3.1 总体硬件设计 3.2 键盘电路的设计 3.3 显示电路的设计 四.仿真演示 五.源程序 一.设计背景 随着社会的发展,科学的进步,人们的生活水 ...
- 基于51单片机的智能计算器
其实,说智能也不算智能,就是在计算器上加上了日历.时钟和温度显示而已.具体用到的也是51很基础的模块,一个键盘,一个1602,温度显示那块用到了DS18B20,硬件调试的部分也很少,主要是代码的书写. ...
- 基于51单片机的矩阵计算器设计
当初本科的毕业设计不是很完美,一直想把它完善一下,这学期刚开始有点时间,就以一个小项目的方式,综合自己这一年多来的代码阅读收获,重写了这个工程. 一,平台的重新搭建 Ø 在win7上重新安装了pro ...
- 51单片机的简易计算器设计(仿真+程序+原理图+PCB+设计报告)
本设计: 基于51单片机的简易计算器设计(仿真+程序+原理图+PCB+设计报告) 仿真:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 编号S0001 芯片可以替换为 ...
- 利用c51进行数模转换并在液晶屏上显示_基于C51单片机的智能计算器、矩阵键盘、lcd1602...
目录 1绪论.............................................................................................. ...
- 51单片机计算器_基于51单片机的倒计时温度检测报警器
基于51单片机的倒计时温度检测报警器 学习单片机断断续续半年了,在学长学姐的教学帮助下,完成了51单片机的入门学习,开始实践做项目,在一周时间内设计和制作出个人项目.起初,我设计和选择的是12864显 ...
最新文章
- 独家 | 几个Jupyter笔记本的使用技巧
- 2018.07.30 巴别时代
- Flex 布局 - 容器
- 高带宽低性能服务器,国外大带宽低延迟服务器首选天下数据美国服务器
- ReactJs 第三章 React元素的渲染
- 安装ceston8出现timeout_瓦罗兰特Valorant:显示逾时怎么办 瓦罗兰特time out解决
- [代码]获取源页的控件值
- spring boot 教程(三)配置详解
- PHP表单入库处理,ThinkPHP收集表单数据入库操作(三种方式)
- Win2003(R2 SP2)服务器纯净版系统
- 小爬需登录的网站之麦子学院
- HFSS天线设计实例_不同介质的BLE S11曲线
- 通过Kali模拟CC攻击进行WEB压力测试实操
- CODESYS 控制虚拟单轴运动
- APK Multi-Tool强大的APK反编译工具终极教程
- 舞魔金星[读书笔记]
- premiere cs6导出视频格式
- Android OCR数字识别
- 目标跟踪之数据标注软件ViBAT使用指导
- 百度飞桨和文心大模型助力,中康科技重构医疗科研大数据治理
热门文章
- Hopsan教程1-快速入门
- 正则手机号码校验11位,13,14,15,16,17,18,19开头
- 翻译-服务注册与发现
- 计算机组成原理试卷分析,计算机组成原理试卷分析.doc
- 使用《红孩儿工具箱》开发基于Cocos2d-x的《坦克大战》游戏
- yui java 右键_给YUI Compressor添加右键命令,完成快捷压缩
- 网页版github上新建文件夹
- 软件外包公司软件测试面试题
- java采集_Java实现一个小说采集程序的简单实例
- push和pop的区别?