基于51单片机的计算器(附Proteus仿真图且程序有详细注释)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
uchar temp,key;
lint x1=0,x2=0,y=0; //输入的数及其结果
void Init(); //系统初始化
void keyscan(); //键盘检测
void delay(uint); //延时
void DataOper(); //数据运算
void DataHandle(); //数据接收
case 15 : f1=0;f2=0;f3=0;f4=1;break;// "/"
}
}
}
void DisplayHandle() //将数据显示在数码管上
{
uchar i,x;
if((flag1==0)&&(flag2==0))
{
x=px1;
if(px1==0) display(7,0);
else
}
while(temp!=0xf0)
{
temp=P1;temp=temp&0xf0;
}
}
}
void DataOper()
{
uchar i,j,m=0;
lint k=0;
for(i=0;i<(px1-1);i++) //把第一个数组中的数处理成十进制数
{
k=DATA1[i];
for(j=0;j<(px1-i-1);j++)
{
uchar i;
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;i<8;i++)
{DATA1[i]=0;DATA2[i]=0;RESUIT[i]=0;}
}
void delay(msx) //msx为延时毫秒数
switch(temp)
{
case 0xe7: key=12;flag2=1;Init();break;
case 0xd7: key=13;flag2=1;DataOper();break;
case 0xb7: key=14;flag1=1;display(7,0);break;
case 0x77: key=15;flag1=1;display(7,0);break;
void DisplayHandle(); //显示处理
void display(uchar,uchar); //数码管显示函数
void main()
{
P2=0x00;
while(1)
{
keyscan();
DataHandle();
DisplayHandle();
}
}
void Init() //初始化,所有数据归零
case 0x7b: 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;
{
for(i=0;i<px1;i++)
{
display(8-x,DATA1[i]);
x--;
delay(5);
}
}
}
else if((flag1==1)&&(flag2==0))
{
x=px2;
if(px2==0) display(7,0);
else
{
for(i=0;i<px2;i++)
{
display(8-x,DATA2[i]);
if(f1==1) y=x1+x2; //根据标志位进行运算
else if(f2==1) y=x1-x2;
else if(f3==1) y=x1*x2;
else if(f4==1) y=x1/x2;
RESUIT[0]=y/10000000; //把各位分离出来存入结果数组中
RESUIT[1]=(y%10000000)/1000000;
{
DATA2[px2]=key;
px2++;
flag=0;
}
else if(flag1==1)
{
switch(key)
{
case 10 : f1=1;f2=0;f3=0;f4=0;break;// "+"
case 11 : f1=0;f2=1;f3=0;f4=0;break;// "-"
case 14 : f1=0;f2=0;f3=1;f4=0;break;// "*"
{
case 0xed: key=4;flag=1;break;
case 0xdd: key=5;flag=1;break;
case 0xbd: key=6;flag=1;break;
case 0x7d: 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)
{
case 0xeb: key=8; flag=1;break;
case 0xdb: key=9; flag=1;break;
case 0xbb: key=10;flag1=1;display(7,0);break;
pxΒιβλιοθήκη Baidu=m;
}
void DataHandle() //把每次按键的结果记录下来,并存到适当的位置
{
if((key<10)&&(flag==1)&&(flag1==0))
{
DATA1[px1]=key;
px1++;
flag=0;
}
else if((key<10)&&(flag==1)&&(flag1==1))
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++;
case 2 :P2=0xfb;break;
case 3 :P2=0xf7;break;
case 4 :P2=0xef;break;
case 5 :P2=0xdf;break;
case 6 :P2=0xbf;break;
case 7 :P2=0x7f;break;
}
P3=SMG[m];
}
void keyscan() //矩阵键盘扫描子函数
0x7f,0x6f
};
uchar DATA1[8]={0,0,0,0,0,0,0,0}; //第一个数
uchar DATA2[8]={0,0,0,0,0,0,0,0}; //第二个数
uchar RESUIT[8]={0,0,0,0,0,0,0,0};//结果
uchar px1=0,px2=0,px3=0,flag=0,flag1=0,flag2=0,flag3=0,f1=0,f2=0,f3=0,f4=0; //各全局变量
{
P1=0xfe;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P1;
switch(temp)
{
case 0xee: key=0;flag=1;break;
case 0xde: key=1;flag=1;break;
case 0xbe: key=2;flag=1;break;
{
uint i,j;
for(i=0;i<=msx;i++)
for(j=0;j<=110;j++);
}
void display(uchar n,uchar m) //n是第几只数码管,m是显示的数字是多少
{
switch(n)
{
case 0 :P2=0xfe;break;
case 1 :P2=0xfd;break;
case 0x7e: 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)
x--;
delay(3);
}
}
}
else if ((flag1==1)&&(flag2==1))
{
for(i=7;i>=px3;i--)
{
display(i,RESUIT[i]);
delay(3);
}
}
}
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define lint unsigned long int
uchar SMG[10]={0x3f,0x06,0x5b,0x4f, //数码管取模
0x66,0x6d,0x7d,0x07,
{
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];
相关文档
最新文档