花了两天写的51简易计算器

2020-01-27 11:40发布

能实现加减乘除(如果是整数的话可以进行两次运算(1+1*1)或者(1+1) 如果不是整数的话只能一次运算(1.1+1.1))。(1/3=0.333)能精确到小数点三位吧。
5*5矩阵。能进行简单的COS(x),sin(x),tan(x)。还有返回BACK键跳出上次的值。
弱弱的问下这个拿去参加学校的比赛是不是太简单了点啊,也没什么创新。上面有很多的课题,不过都不大会,,也没时间,所以选了做个计算器。不过自己也尽力了。。
#include<reg51.h>
#include<intrins.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs = P1^0;  
sbit rw = P1^1;
sbit ep = P1^2;
uchar x=0;
uchar w=0;
uchar number[8];
uchar idata i,j4,j9,j14,j19,j22,j23,j,j24,j22;
uchar idata den1,jian1[3],jia1[3],cheng1[3],chu1[3],jia[2],dian[2];
float idata data2=0,data1=0,data3=0,data5,data8,data7,data9,data10;
float idata data4,data6;
uint alldata=0,xiaoshu;
uint dato[10];
uchar chu2;
uchar cos2=0,sin2=0,tan2=0,gen2=0,jia2=0,jian2=0,cheng2=0;
uchar prekeyno=25,keyno=25;
void delay(uchar x) //矩阵键盘的延迟
{
uchar t;
while(x--)for(t=0;t<120;t++);
}
void keyscan()         //矩阵键盘扫描
{
uchar temp;
P2=0X00;  
P3=0xff;
delay(1);
if(P3!=0xFF){        //是否有键按下去       
P2=0XFF;P3=0X00;
delay(1);
temp=P2;
switch(temp)        //扫描按键在哪列
{
case 0xfe:keyno=0;break;
case 0xfd:keyno=1;break;
case 0xfb:keyno=2;break;
case 0xf7:keyno=3;break;
case 0xef:keyno=4;break;
}
P2=0x00;P3=0xff; //扫描按键在哪行
delay(1);
temp=P3;
switch(temp)
{
case 0xfe:keyno+=0;break;
case 0xfd:keyno+=5;break;
case 0xfb:keyno+=10;break;
case 0xf7:keyno+=15;break;
case 0xef:keyno+=20;break;
}
}
}
uchar lcd_bz()
{                   // 测试LCD忙碌状态
uchar result;
rs = 0;rw = 1;ep = 1;
_nop_();_nop_();_nop_();_nop_();
result = (P0 & 0x80);
ep = 0;
return result;
}

lcd_wcmd(uchar c)
{       // 写入指令数据到LCD
while(lcd_bz());
rs = 0;rw = 0;ep = 0;
_nop_();_nop_();
P0 = c;
_nop_();_nop_();_nop_();_nop_();
ep = 1;
_nop_();_nop_();_nop_();_nop_();
ep = 0;  
}

lcd_pos(uchar pos)
{       //设定显示位置
lcd_wcmd(pos | 0x80);
}
lcd_wdat(uchar d)
{       //写入字符显示数据到LCD
while(lcd_bz());
rs = 1;rw = 0;ep = 0;
P0 = d;
_nop_();_nop_();_nop_();
_nop_();
ep = 1;_nop_();_nop_();_nop_();_nop_();
ep = 0;
}

lcd_init()
{       //LCD初始化设定
lcd_wcmd(0x38);   //
delay(2);
lcd_wcmd(0x38);   //
delay(2);
lcd_wcmd(0x38);   //
delay(2);
lcd_wcmd(0x08);   //
delay(2);
lcd_wcmd(0x01);   //
delay(2);
lcd_wcmd(0x06);   //
delay(2);
lcd_wcmd(0x0c);
delay(2);
}
uint shi(uchar k)
{
int m=1;
while(k!=0)
{
m=m*10;
k--;
}
return(m);
}
void jiajianchenchu()
{
uchar k;
if((jia[1]!=0)&&(jia[2]==0)&&(dian[1]==0)){for(k=1;k<jia[1];k++){data1=data1+dato[k]*shi(jia[1]-1-k);}}
if((jia[1]!=0)&&(jia[2]==0)&&(dian[1]!=0)){for(k=1;k<dian[1];k++){data1=data1+dato[k]*shi(dian[1]-1-k);}
for(k=dian[1]+1;k<jia[1];k++){data9=data9+dato[k]*shi(jia[1]-1-k);}data1=data9/(pow(10,jia[1]-dian[1]-1))+data1;}//按了一次逻辑运算符号
if((jia[2]!=0)){for(k=jia[1]+1;k<jia[2];k++){data2=data2+dato[k]*shi(jia[2]-1-k);}}//按了两次逻辑运算符号

}                                                          
void zhengfu()
{
if(data5<0){lcd_pos(0x40);lcd_wdat('-');}
}
void deng()
{
uchar k;
if((jia[2]==0)&&(den1!=0)&&(dian[1]==0)&&dian[2]==0){for(k=jia[1]+1;k<den1;k++){data2=data2+dato[k]*shi(den1-1-k);}}//算术中就只有一个运算符号
if((jia[2]==0)&&(den1!=0)&&(dian[1]>jia[1])&&(dian[2]==0)){for(k=jia[1]+1;k<dian[1];k++){data2=data2+dato[k]*shi(dian[1]-1-k);}
for(k=dian[1]+1;k<den1;k++){data10=data10+dato[k]*shi(den1-1-k);}data2=data10/(pow(10,den1-dian[1]-1))+data2;;}
if((jia[2]==0)&&(den1!=0)&&(dian[1]!=0)&&(dian[1]<jia[1])&&(dian[2]==0)){for(k=jia[1]+1;k<den1;k++){data2=data2+dato[k]*shi(den1-1-k);}}
if((jia[2]==0)&&(den1!=0)&&(dian[1]!=0)&&dian[2]!=0){for(k=jia[1]+1;k<dian[2];k++){data2=data2+dato[k]*shi(dian[2]-1-k);}
for(k=dian[2]+1;k<den1;k++){data10=data10+dato[k]*shi(den1-1-k);}data2=data10/(pow(10,den1-dian[2]-1))+data2;}
if(jia[2]!=0&&den1!=0){for(k=jia[2]+1;k<den1;k++){data3=data3+dato[k]*shi(den1-1-k);}}
if(cos2!=0){for(k=2;k<den1;k++){data1=data1+dato[k]*shi(den1-1-k);}
alldata=(int)cos(data1*3.14/180 );data4=fabs(cos(data1*3.14/180 ))-alldata;data5=cos(data1*3.15/180);}
if(sin2!=0){for(k=2;k<den1;k++){data1=data1+dato[k]*shi(den1-1-k);}
alldata=(int)sin(data1*3.14/180 );data4=fabs(sin(data1*3.14/180 ))-alldata;data5=sin(data1*3.15/180);}
if(tan2!=0){for(k=2;k<den1;k++){data1=data1+dato[k]*shi(den1-1-k);}
alldata=(int)tan(data1*3.14/180 );data4=fabs(tan(data1*3.14/180 ))-alldata;data5=tan(data1*3.15/180);}
}//算术中有两个运算符号

void huanyuan()         //取数字
{
number[0]=(alldata/10000);
number[1]=(alldata% 10000)/1000;
number[2]=(alldata% 1000)/100;
number[3]=(alldata% 100)/10;
number[4]= alldata% 10;
if(data4!=0){xiaoshu=(int)(data4*1000);number[5]=(xiaoshu/100);number[6]=(xiaoshu%100)/10;number[7]=xiaoshu%10;}
}
void xianshi()        //显示数字
{uchar k;
uchar mm[5];
uchar n=1,j=0,i=0;
zhengfu();
if(alldata!=0){for(k=0;k<5;k++){if(number[k]!=0){mm[i++]=k;}} j=mm[0];
for(j;j<5;j++){lcd_pos(0x40+n);lcd_wdat(number[j]+0x30);n++;delay(10);}
if(data4!=0){lcd_pos(0x40+n);n=n+1;lcd_wdat(0xa5);for(k=5;k<8;k++){lcd_pos(0x40+n);lcd_wdat(number[k]+0x30);n++;delay(10);}}}
if((alldata==0)&&(data4!=0)){lcd_pos(0x41);lcd_wdat('0');delay(10);lcd_wdat(0xa5);n=3;for(k=5;k<8;k++){lcd_pos(0x40+n);lcd_wdat(number[k]+0x30);n++;delay(10);}}
}   
void dataall()
{
if(jia2==2){alldata=(data1+data2+data3);}//两
if(jian2==2){alldata=fabs(data1-data2-data3);data5=data1-data2-data3;}//两个减号
if(cheng2==2){alldata=(data1*data2*data3);}//两个乘号
if(chu2==2){alldata=((data1/data2)/data3);data4=(data1/data2/data3-alldata);}//两个除号
if((jia2==1)&&(jia[2]==0)){alldata=(int)(data1+data2);data4=(data2+data1)-alldata;}//一个加号
if((jian2==1)&&(jia2==0)&&(cheng2==0)&&(chu2==0)){alldata=fabs(data1-data2);data5=data1-data2;data4=(fabs(data1-data2)-alldata);}//一个减号
if((cheng2==1)&&(jia2==0)&&(chu2==0)&&(jian2==0)){alldata=data1*data2;data4=((data1*data2)-alldata);}//一个乘号
if((chu2==1)&&(jia2==0)&&(cheng2==0)&&(jian2==0)){alldata=(int)(data1/data2);data4=((data1/data2)-(int)(data1/data2));}//一个除号
if((jia2==1)&&(jian2==1)){if(jia1[1]>jian1[1]){alldata=fabs(data1-data2+data3);data5=data1-data2+data3;}
                           if(jia1[1]<jian1[1]){alldata=fabs(data1+data2-data3);data5=(data1+data2-data3);}}//加减
if((jia2==1)&&(chu2==1)){if(chu1[1]>jia1[1]){alldata=(data1+data2/data3);data4=((data1+data2/data3)-alldata);}//加除
                        if(chu1[1]<jia1[1]){alldata=(data1/data2+data3);data4=((data1/data2+data3)-alldata);}}
if((jia2==1)&&(cheng2==1)){if(cheng1[1]>jia1[1]){alldata=(data1+data2*data3);}//加乘
                         if(cheng1[1]<jia1[1]){alldata=(data1*data2+data3);}}
if((cheng2==1)&&(chu2==1)){if(cheng1[1]>chu1[1]){alldata=data1/data2*data3;data4=((data1/data2*data3)-alldata);}
                            if(cheng1[1]<chu1[1]){alldata=(data1*data2/data3);data4=((data1*data2/data3)-alldata);}}//乘除
if((jian2==1)&&(chu2==1)){if(jian1[1]>chu1[1]){alldata=fabs(data1/data2-data3);data4=((data1/data2-data3)-alldata);data5=(data1/data2-data3);}
                           if(jian1[1]<chu1[1]){alldata=fabs(data1-data2/data3);data4=fabs((data1-data2/data3)-alldata);data5=(data1-data2/data3);}  }//减除
if((jian2==1)&&(cheng2==1)){if(cheng1[1]>jian1[1]){alldata=fabs(data1-data2*data3);data4=(data1-data2*data3);}
                          if(cheng1[1]<jian1[1]){alldata=fabs(data1*data2-data3);data4=fabs(data1*data2-data3);}}//建成

huanyuan();xianshi();                                                                                                                                                                                                                   
}
void panduanjuzhen() //判断并显示矩阵案的键                                                         
{
if (prekeyno!=keyno)
{i++;x++;
lcd_pos(x);       
switch(keyno)
{
case 0:lcd_wdat('c');delay(10);lcd_wdat('o');delay(10);lcd_wdat('s');cos2++;x=x+2;while(P3!=0XFF);break;
case 1:lcd_wdat('s');delay(10);lcd_wdat('i');delay(10);lcd_wdat('n');sin2++;x=x+2;while(P3!=0XFF);break;
case 2:lcd_wdat('t');delay(10);lcd_wdat('a');delay(10);lcd_wdat('n');tan2++;x=x+2;while(P3!=0XFF);break;
case 3:{lcd_init();delay(10);lcd_pos(0x01);lcd_wdat('0');data6=alldata;data7=data4;data8=data5;cos2=0;i=0;data1=0;data2=0;data3=0;data4=0;alldata=0;data5=0;x=0;j=0;
chu2=0;cheng2=0;jia2=0;jian2=0;sin2=0;tan2=0;j9=0;j14=0;j19=0;j24=0;j23=0;j22=0;while(P3!=0XFF);den1=0;jia[0]=0;jia[2]=0;dian[1]=0;dian[2]=0;data9=0;data10=0;}break;
case 4:{alldata=data6;data4=data7;data5=data8;huanyuan();xianshi();alldata=0;data4=0;data5=0;x=0;}break;
case 5:{lcd_wdat('1');dato=1;while(P3!=0XFF);};break;
case 6:{lcd_wdat('2');dato=2;while(P3!=0XFF);};break;
case 7:{lcd_wdat('3');dato=3;while(P3!=0XFF);};break;
case 8:{j++;j9++;lcd_wdat('+');jia[j]=i;jia1[j9]=i;jia2++;jiajianchenchu();while(P3!=0XFF);}break;
//case 9:{j1++;lcd_wdat('c');delay(10);lcd_wdat('o');delay(10);lcd_wdat('s');cos1[j1]=i;cos2++;}break;
case 10:{lcd_wdat('4');dato=4;while(P3!=0XFF);};break;
case 11:{lcd_wdat('5');dato=5;while(P3!=0XFF);};break;
case 12:{lcd_wdat('6');dato=6;while(P3!=0XFF);};break;
case 13:{j++;j14++;lcd_wdat('-');jia[j]=i;jian1[j14]=i;jian2++;jiajianchenchu();while(P3!=0XFF);}break;
//case 14:{j1++;lcd_wdat('c');delay(10);lcd_wdat('o');delay(10);lcd_wdat('s');cos1[j1]=i;cos2++;}break;
case 15:{lcd_wdat('7');dato=7;while(P3!=0XFF);};break;
case 16:{lcd_wdat('8');dato=8;while(P3!=0XFF);};break;
case 17:{lcd_wdat('9');dato=9;while(P3!=0XFF);};break;
case 18:{j++;j19++;lcd_wdat('*');jia[j]=i;cheng1[j19]=i;cheng2++;jiajianchenchu();while(P3!=0XFF);}break;
//case 19:{j1++;lcd_wdat('c');delay(10);lcd_wdat('o');delay(10);lcd_wdat('s');cos1[j1]=i;cos2++;}break;
case 20:{lcd_wdat('0');dato=0;while(P3!=0XFF);};break;
case 21:{j22++;lcd_wdat(0xa5);dian[j22]=i;while(P3!=0XFF);}break;
case 22:{lcd_wdat('=');den1=i;deng();dataall();while(P3!=0XFF);}break;
case 23:{j++;j24++;lcd_wdat('/');jia[j]=i;chu1[j24]=i;chu2++;jiajianchenchu();while(P3!=0XFF);}break;
}
}
keyno=25;
}
   
void main()
{
uchar n=0,m=0;
lcd_init();
while(1){
keyscan();
panduanjuzhen();lcd_pos(0x40);// b=a-(int)a; /*  小数部分 */c=(int)a; /* 整数部分 */

}}

点击此处下载 ourdev_547990.rar(文件大小:55K) (原文件名:计算器.rar)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
46条回答
snomom
1楼-- · 2020-02-03 04:06
外行问问怎么样用?
WM_CH
2楼-- · 2020-02-03 07:21
 精彩回答 2  元偷偷看……
AIHHLI
3楼-- · 2020-02-03 08:29
代码真够乱的,函数变量名不建议用拼音。
unnormal
4楼-- · 2020-02-03 12:59
能计算的最大位数以及最多多少个数据计算?支持一下

一周热门 更多>