您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于51单片机的计算器(附Proteus仿真图且程序有详细注释)
#includereg52.h#defineuintunsignedint#defineucharunsignedchar#definelintunsignedlongintucharSMG[10]={0x3f,0x06,0x5b,0x4f,//数码管取模0x66,0x6d,0x7d,0x07,0x7f,0x6f};ucharDATA1[8]={0,0,0,0,0,0,0,0};//第一个数ucharDATA2[8]={0,0,0,0,0,0,0,0};//第二个数ucharRESUIT[8]={0,0,0,0,0,0,0,0};//结果ucharpx1=0,px2=0,px3=0,flag=0,flag1=0,flag2=0,flag3=0,f1=0,f2=0,f3=0,f4=0;//各全局变量uchartemp,key;lintx1=0,x2=0,y=0;//输入的数及其结果voidInit();//系统初始化voidkeyscan();//键盘检测voiddelay(uint);//延时voidDataOper();//数据运算voidDataHandle();//数据接收voidDisplayHandle();//显示处理voiddisplay(uchar,uchar);//数码管显示函数voidmain(){P2=0x00;while(1){keyscan();DataHandle();DisplayHandle();}}voidInit()//初始化,所有数据归零{uchari;px1=0;px2=0;px3=0;flag=0;flag1=0;flag2=0;flag3=0;f1=0;f2=0;f3=0;f4=0;x1=0;x2=0;y=0;for(i=0;i8;i++){DATA1[i]=0;DATA2[i]=0;RESUIT[i]=0;}}voiddelay(msx)//msx为延时毫秒数{uinti,j;for(i=0;i=msx;i++)for(j=0;j=110;j++);}voiddisplay(ucharn,ucharm)//n是第几只数码管,m是显示的数字是多少{switch(n){case0:P2=0xfe;break;case1:P2=0xfd;break;case2:P2=0xfb;break;case3:P2=0xf7;break;case4:P2=0xef;break;case5:P2=0xdf;break;case6:P2=0xbf;break;case7:P2=0x7f;break;}P3=SMG[m];}voidkeyscan()//矩阵键盘扫描子函数{P1=0xfe;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P1;switch(temp){case0xee:key=0;flag=1;break;case0xde:key=1;flag=1;break;case0xbe:key=2;flag=1;break;case0x7e:key=3;flag=1;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}P1=0xfd;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P1;switch(temp){case0xed:key=4;flag=1;break;case0xdd:key=5;flag=1;break;case0xbd:key=6;flag=1;break;case0x7d:key=7;flag=1;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}P1=0xfb;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P1;switch(temp){case0xeb:key=8;flag=1;break;case0xdb:key=9;flag=1;break;case0xbb:key=10;flag1=1;display(7,0);break;case0x7b:key=11;flag1=1;display(7,0);break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}P1=0xf7;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P1;switch(temp){case0xe7:key=12;flag2=1;Init();break;case0xd7:key=13;flag2=1;DataOper();break;case0xb7:key=14;flag1=1;display(7,0);break;case0x77:key=15;flag1=1;display(7,0);break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}voidDataOper(){uchari,j,m=0;lintk=0;for(i=0;i(px1-1);i++)//把第一个数组中的数处理成十进制数{k=DATA1[i];for(j=0;j(px1-i-1);j++){k=k*10;}x1=x1+k;}x1=x1+DATA1[px1-1];for(i=0;i(px2-1);i++)//把第二个数组中的数处理成十进制数{k=DATA2[i];for(j=0;j(px2-i-1);j++){k=k*10;}x2=x2+k;}x2=x2+DATA2[px2-1];if(f1==1)y=x1+x2;//根据标志位进行运算elseif(f2==1)y=x1-x2;elseif(f3==1)y=x1*x2;elseif(f4==1)y=x1/x2;RESUIT[0]=y/10000000;//把各位分离出来存入结果数组中RESUIT[1]=(y%10000000)/1000000;RESUIT[2]=(y%1000000)/100000;RESUIT[3]=(y%100000)/10000;RESUIT[4]=(y%10000)/1000;RESUIT[5]=(y%1000)/100;RESUIT[6]=(y%100)/10;RESUIT[7]=y%10;while(!RESUIT[m])m++;px3=m;}voidDataHandle()//把每次按键的结果记录下来,并存到适当的位置{if((key10)&&(flag==1)&&(flag1==0)){DATA1[px1]=key;px1++;flag=0;}elseif((key10)&&(flag==1)&&(flag1==1)){DATA2[px2]=key;px2++;flag=0;}elseif(flag1==1){switch(key){case10:f1=1;f2=0;f3=0;f4=0;break;//+case11:f1=0;f2=1;f3=0;f4=0;break;//-case14:f1=0;f2=0;f3=1;f4=0;break;//*case15:f1=0;f2=0;f3=0;f4=1;break;///}}}voidDisplayHandle()//将数据显示在数码管上{uchari,x;if((flag1==0)&&(flag2==0)){x=px1;if(px1==0)display(7,0);else{for(i=0;ipx1;i++){display(8-x,DATA1[i]);x--;delay(5);}}}elseif((flag1==1)&&(flag2==0)){x=px2;if(px2==0)display(7,0);else{for(i=0;ipx2;i++){display(8-x,DATA2[i]);x--;delay(3);}}}elseif((flag1==1)&&(flag2==1)){for(i=7;i=px3;i--){display(i,RESUIT[i]);delay(3);}}}
本文标题:基于51单片机的计算器(附Proteus仿真图且程序有详细注释)
链接地址:https://www.777doc.com/doc-5118555 .html