基于AT89C51单片机C语言编写的计算器Word格式.docx
《基于AT89C51单片机C语言编写的计算器Word格式.docx》由会员分享,可在线阅读,更多相关《基于AT89C51单片机C语言编写的计算器Word格式.docx(10页珍藏版)》请在冰豆网上搜索。
![基于AT89C51单片机C语言编写的计算器Word格式.docx](https://file1.bdocx.com/fileroot1/2022-12/8/3b89cc15-10ca-4585-8c27-7663ac051c37/3b89cc15-10ca-4585-8c27-7663ac051c371.gif)
temp=P3;
temp=temp&
0xf0;
while(temp!
=0xf0)
delay(5);
switch(temp)
case0xee:
num=1;
break;
case0xde:
num=2;
case0xbe:
num=3;
case0x7e:
num=4;
P3=0xfd;
case0xed:
num=5;
case0xdd:
num=6;
case0xbd:
num=7;
case0x7d:
num=8;
P3=0xfb;
case0xeb:
num=9;
case0xdb:
num=10;
case0xbb:
num=11;
case0x7b:
num=12;
P3=0xf7;
case0xe7:
num=13;
case0xd7:
num=14;
case0xb7:
num=15;
case0x77:
num=16;
returnnum;
/***************89C51单片机【计算器】C语言程序******************/
/****************
P2位选P0段选时钟12MHZ
*********************/
/*包含的头文件*/
#defineucharunsignedchar
/*宏定义*/
#defineuintunsignedint
ucharLed[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
/*数码管段选*/
longfloatNumber[]={0,0,0,0};
/*数码管显示位控制寄存器*/
ucharA[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
longintD[]={0,0,0,0,0,0,0,0};
//数码管显示内容寄存器
ucharcodeC[]={0x0,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
/*数码管位选*/
/*列扫描控制LED1位2位3位4位5位6位7位8位*/
uchark=16;
/*
按键对外控制
*/
ucharb;
/*
按键【+】【-】【*】【/】对外的控制
longfloatOut_put;
/*定义变量【Out_put】作为结果
uchare=0;
数字的位存储递进的控制
*/
ucharg=0;
运算方式的控制变量
ucharL=0;
ucharg1=0;
ucharg2=0;
ucharg3=0;
ucharg4=0;
charj=-1;
与Number[]数组连用
ucharm=0;
按键【=】的控制变量
ucharn=0;
按键【.】的控制变量
ucharx=0;
小数点个数的记录变量
ucharxo=0;
控制开始计数小数点的变量
longintresult;
voidDelay(uinto)
/*延时函数delay()的定义*/
uinti,j;
for(i=0;
i<
o;
i++)
for(j=0;
j<
121;
j++)
{;
voidshow(longfloatOut_put)
{
ucharr;
uchark;
longintq,p;
uchars=0;
uchari;
longinttemp;
temp=Out_put;
if(
(Out_put-temp)!
=0)
{result=Out_put*10000;
r=4;
else
{result=Out_put;
r=0;
p=result;
if(m==1)
if(result<
0)
result=-result;
q=result;
for(i=1;
i<
=8;
i++){q=q/10;
if(q==0){k=i;
i=9;
}}P0=0x40;
P2=C[8-k];
Delay
(1);
}
//负号的显示
P0=0x80;
P2=C[r];
P0=0x00;
result=p;
P0=Led[result%10];
P2=C[8];
result=result/10;
Delay
(1);
if((result%10==0)&
&
(result%100==0)&
(result%1000==0)&
(result%10000==0)&
(result%100000==0)&
(result%1000000==0))
{P0=0x00;
}
else{P0=Led[result%10];
P2=C[7];
(result%100000==0))
P2=C[6];
(result%10000==0))
P2=C[5];
(result%1000==0))
P2=C[4];
(result%100==0))
P2=C[3];
if((result%10==0))
P2=C[2];
if(result==0)
P2=C[1];
voidIn_put()
//输入函数输入小数
加小数点
uchari;
if(k>
=0&
k<
=9)
switch(e)
case8:
D[7]=D[6];
A[7]=A[6];
//用来存放数值
case7:
D[6]=D[5];
A[6]=A[5];
case6:
D[5]=D[4];
A[5]=A[4];
case5:
D[4]=D[3];
A[4]=A[3];
case4:
D[3]=D[2];
A[3]=A[2];
case3:
D[2]=D[1];
A[2]=A[1];
case2:
D[1]=D[0];
A[1]=A[0];
case1:
if(n==0)
{D[0]=k;
A[0]=Led[k];
if(xo==1)
x++;
}
if(n==1)
A[0]=Led[k]|0x80;
xo=1;
n=0;
}
=11&
=15&
b==1)
switch(k)
case11:
g1++;
g++;
if(g2==1)L=1;
if(g3==1)L=2;
if(g4==1)L=3;
break;
//
+
case12:
g2++;
if(g1==1)L=4;
if(g3==1)L=5;
if(g4==1)L=6;
-
case13:
g3++;
if(g1==1)L=7;
if(g2==1)L=8;
if(g4==1)L=9;
*
case14:
g4++;
if(g1==1)L=10;
if(g2==1)L=11;
if(g3==1)L=12;
/
j++;
Number[j]=10000000*D[7]+1000000*D[6]+100000*D[5]+10000*D[4]+1000*D[3]+100*D[2]+10*D[1]+D[0];
=x;
i++){Number[j]=(float)Number[j]/10;
x=0;
for(i=0;
=7;
i++)
//数据存储器清零
D[i]=0;
//数据显示清零
{A[i]=0x00;
b=0;
e=0;
xo=0;
voidKey_scan()
//键盘扫描函数
Key_scan()
unsignedcharX,Y,Z;
P3=0xff;
P3=0x0f;
//先对P2置数行扫描
if(P3!
=0x0f)
//判断是否有键按下
Delay(20);
//延时10ms,软件去干扰
//确认按键按下;
X=P3;
//保存行扫描时有键按下时状态
P3=0xf0;
//列扫描
Y=P3;
//保存列扫描时有键按下时状态
Z=X|Y;
//取出键值
while(P3!
=0xf0);
//按键防止抖动
switch(Z)
//判断键值(那一个键按下)
case0xe7:
k=0;
e++;
In_put();
//数字【0】
case0xd7:
k=1;
e++;
//数字【1】
case0xdb:
k=2;
//数字【2】
case0xdd:
k=3;
//数字【3】
case0xb7:
k=4;
//数字【4】
case0xbb:
k=5;
//数字【5】
case0xbd:
k=6;
//数字【6】
case0x77:
k=7;
//数字【7】
case0x7b:
k=8;
//数字【8】
case0x7d:
k=9;
//数字【9】
case0xeb:
n=1;
//小数点【.】
case0x7e:
k=11;
b=1;
//字符【B+】
case0xbe:
k=12;
//字符【C-】
case0xde:
k=13;
//字符【D*】
case0xee:
k=14;
//字符【E/】
case0xed:
k=15;
m=1;
In_put();
//字符【F=】
voidYun_suan()
if(g1==1&
g==1)
Out_put=Number[0]+Number[1];
if(g2==1&
g==1)Out_put=Number[0]-Number[1];
if(g3==1&
Out_put=Number[0]*Number[1];
if(g4==1&
g==1)Out_put=Number[0]/Number[1];
if(g1==2&
g==2)Out_put=Number[0]+Number[1]+Number[2];
if(g2==2&
g==2)Out_put=Number[0]-Number[1]-Number[2];
if(g3==2&
g==2)
Out_put=Number[0]*Number[1]*Number[2];
if(g4==2&
g==2)Out_put=Number[0]/Number[1]/Number[2];
if(L==1)
Out_put=Number[0]-Number[1]+Number[2];
if(L==2)
Out_put=Number[0]*Number[1]+Number[2];
if(L==3)
Out_put=Number[0]/Number[1]+Number[2];
if(L==4)
Out_put=Number[0]+Number[1]-Number[2];
if(L==5)
Out_put=Number[0]*Number[1]-Number[2];
if(L==6)
Out_put=Number[0]/Number[1]-Number[2];
if(L==7)
Out_put=Number[0]+Number[1]*Number[2];
if(L==8)
Out_put=Number[0]-Number[1]*Number[2];
if(L==9)
Out_put=Number[0]/Number[1]*Number[2];
if(L==10)Out_put=Number[0]+Number[1]/Number[2];
if(L==11)Out_put=Number[0]-Number[1]/Number[2];
if(L==12)Out_put=Number[0]*Number[1]/Number[2];
voidXian_shi()
if(m!
=1)
Key_scan();
/*显示函数
与A[i]有关*/
P0=A[0];
P0=A[1];
P0=A[2];
P0=A[3];
P0=A[4];
P0=A[5];
P0=A[6];
P0=A[7];
while
(1)
Xian_shi();
Yun_suan();
show(Out_put);