89C51单片机【计算器】C语言程序
89C51单片机【计算器】C语言程序2010-12-15 16:54/*89C51单片机【计算器】C语言程序*/
/*P2位选P0段选时钟12MHZ*/
#include reg52.h/*包含的头文件*/
#define uchar unsigned char/*宏定义*/
#define uint unsigned int uchar Led[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};/*数码管段选*/
long float Number={0,0,0,0};/*数码管显示位控制寄存器*/
uchar A={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
long int D={0,0,0,0,0,0,0,0};//数码管显示内容寄存器
uchar code C={0x0,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};/*数码管位选*/
/*列扫描控制LED 1位2位3位4位5位6位7位8位*/
uchar k=16;/*按键对外控制*/
uchar b;/*按键【+】【-】【*】【/】对外的控制*/
long float Out_put;/*定义变量【Out_put】作为结果*/
uchar e=0;/*数字的位存储递进的控制*/
uchar g=0;/*运算方式的控制变量*/
uchar L=0;/*运算方式的控制变量*/
uchar g1=0;/*运算方式的控制变量*/
uchar g2=0;/*运算方式的控制变量*/
uchar g3=0;/*运算方式的控制变量*/
uchar g4=0;/*运算方式的控制变量*/
char j=-1;/*与Number数组连用*/
uchar m=0;/*按键【=】的控制变量*/
uchar n=0;/*按键【.】的控制变量*/
uchar x=0;/*小数点个数的记录变量*/
uchar xo=0;/*控制开始计数小数点的变量*/
long int result;
void Delay(uint o)/*延时函数delay()的定义*/
{
uint i,j;
for(i=0;i o;i++)
{
for(j=0;j 121;j++){;}
}
}
void show(long float Out_put)
{uchar r;
uchar k;
long int q,p;
uchar s=0;
uchar i;
long int temp;
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;p=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];Delay(1);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=result/10;Delay(1);}
if((result%10==0)&&(result%100==0)&&(result%1000==0)&&(result%10000==0)&&(result%100000==0)){P0=0x00;}
else{P0=Led[result%10];P2=C[6];result=result/10;Delay(1);}
if((result%10==0)&&(result%100==0)&&(result%1000==0)&&(result%10000==0)){P0=0x00;}
else{P0=Led[result%10];P2=C[5];result=result/10;Delay(1);}
if((result%10==0)&&(result%100==0)&&(result%1000==0)){P0=0x00;}
else{P0=Led[result%10];P2=C[4];result=result/10;Delay(1);}
if((result%10==0)&&(result%100==0)){P0=0x00;}
else{P0=Led[result%10];P2=C[3];result=result/10;Delay(1);}
if((result%10==0)){P0=0x00;}
else{P0=Led[result%10];P2=C[2];result=result/10;Delay(1);}
if(result==0){P0=0x00;}
else{P0=Led[result%10];P2=C[1];result=result/10;Delay(1);}
}
}
void In_put()//输入函数输入小数加小数点
{
uchar i;
if(k=0&&k=9)
switch(e)
{
case 8:D[7]=D[6];A[7]=A[6];//用来存放数值
case 7:D[6]=D[5];A[6]=A[5];
case 6:D[5]=D[4];A[5]=A[4];
case 5:D[4]=D[3];A[4]=A[3];
case 4:D[3]=D[2];A[3]=A[2];
case 3:D[2]=D[1];A[2]=A[1];
case 2:D[1]=D[0];A[1]=A[0];
case 1: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;}
}
if(k=11&&k=15&&b==1)
{switch(k)
{
case 11:g1++;g++;if(g2==1)L=1;if(g3==1)L=2;if(g4==1)L=3;break;//+
case 12:g2++;g++;if(g1==1)L=4;if(g3==1)L=5;if(g4==1)L=6;break;//-
case 13:g3++;g++;if(g1==1)L=7;if(g2==1)L=8;if(g4==1)L=9;break;//*
case 14:g4++;g++;if(g1==1)L=10;if(g2==1)L=11;if(g3==1)L=12;break;///
}
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];
for(i=1;i=x;i++){Number[j]=(float)Number[j]/10;}
x=0;
for(i=0;i=7;i++)//数据存储器清零
D[i]=0;
for(i=0;i=8;i++)//数据显示清零
{A[i]=0x00;}
b=0;e=0;xo=0;
}
}
void Key_scan()//键盘扫描函数Key_scan()
{
unsigned char X,Y,Z;
P3=0xff;
P3=0x0f;//先对P2置数行扫描
if(P3!=0x0f)//判断是否有键按下
{
Delay(20);//延时10ms,软件去干扰
if(P3!=0x0f)//确认按键按下;
{
X=P3;//保存行扫描时有键按下时状态
P3=0xf0;//列扫描
Y=P3;//保存列扫描时有键按下时状态
Z=X|Y;//取出键值
while(P3!=0xf0);//按键防止抖动
switch(Z)//判断键值(那一个键按下)
{
case 0xe7:k=0;e++;In_put();break;//数字【0】
case 0xd7:k=1;e++;In_put();break;//数字【1】
case 0xdb:k=2;e++;In_put();break;//数字【2】
case 0xdd:k=3;e++;In_put();break;//数字【3】
case 0xb7:k=4;e++;In_put();break;//数字【4】
case 0xbb:k=5;e++;In_put();break;//数字【5】
case 0xbd:k=6;e++;In_put();break;//数字【6】
case 0x77:k=7;e++;In_put();break;//数字【7】
case 0x7b:k=8;e++;In_put();break;//数字【8】
case 0x7d:k=9;e++;In_put();break;//数字【9】
case 0xeb:n=1;In_put();break;//小数点【.】
case 0x7e:k=11;b=1;In_put();break;//字符【B+】
case 0xbe:k=12;b=1;In_put();break;//字符【C-】
case 0xde:k=13;b=1;In_put();break;//字符【D*】
case 0xee:k=14;b=1;In_put();break;//字符【E/】
case 0xed:k=15;m=1;b=1;In_put();break;//字符【F=】
}
}
}
}
void Yun_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&&g==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];
}
void Xian_shi()
{
if(m!=1)
{
Key_scan();
/*显示函数与A[i]有关*/
P0=A[0];P2=C[8];Delay(1);
P0=A[1];P2=C[7];Delay(1);
P0=A[2];P2=C[6];Delay(1);
P0=A[3];P2=C[5];Delay(1);
P0=A[4];P2=C[4];Delay(1);
P0=A[5];P2=C[3];Delay(1);
P0=A[6];P2=C[2];Delay(1);
P0=A[7];P2=C[1];Delay(1);
}
}
void main()
{
while(1)
{
Xian_shi();
Yun_suan();
show(Out_put);
}
}
展开阅读全文