#include<reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit a=P2^2;
sbit b=P2^3;
sbit c=P2^4;
uint8 smg[]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};
uint8 sum[8];
uint8 m,button;
uint8 fuhao=0,clear=0,equal=0;
uint8 flag=0;//总符号标志位
uint16 qian=0,hou=0;
long dat=0;
uint8 jia=0,jian=0,cheng=0,chu=0;
void delay(uint16 i) //10ms
{
uint8 j,k;
for(;i>0;i--)
for(j=38;j>0;j--)
for(k=130;k>0;k--);
}
void delay1(uint8 i) //1.3ms
{
uint8 j,k;
for(;i>0;i--)
for(j=10;j>0;j--)
for(k=130;k>0;k--);
}
void keyscan()
{
uint8 value,h,l;
P1=0x0f;
h=P1&0x0f;
if(h!=0x0f)
{
delay(1);
if(h!=0x0f)
{
l=P1|0xf0;
P1=l;
l=P1&0xf0;
h=P1&0x0f;
value=h+l;
button=1; //有按键按下
delay(50); //如果不加这条语句的话,其按键按下一下会显示多个相同数字
switch(value)
{
case 0xee: m=0;break;
case 0xde: m=1;break;
case 0xbe: m=2;break;
case 0x7e: m=3;break;
case 0xed: m=4;break;
case 0xdd: m=5;break;
case 0xbd: m=6;break;
case 0x7d: m=7;break;
case 0xeb: m=8;break;
case 0xdb: m=9;break;
case 0xbb: clear=1;break; //清零 s11
case 0x7b: equal=1;break; //等于 s12
case 0xe7: fuhao=1;break; //加 s13
case 0xd7: fuhao=2;break; //减 s14
case 0xb7: fuhao=3;break; //乘 s15
case 0x77: fuhao=4;break; //除 s16
default : break;
}
}
}
}
void datapros()
{
uint8 i;
if(button==1&&flag==0)
{
qian=qian*10+m;
for(i=7;i>0;i--)
{
sum[i]=sum[i-1];
}
sum[0]=smg[m];
button=0;
m=0;
}
if(button==1&&flag==1)
{
hou=hou*10+m;
for(i=7;i>0;i--)
{
sum[i]=sum[i-1];
}
sum[0]=smg[m];
button=0;
m=0;
}
if(fuhao==1) //按下加号 如果按下加号后数码管熄灭,等待按下加数
{
flag=1;
fuhao=0;
sum[0]=0;
sum[1]=0;
sum[2]=0;
sum[3]=0;
sum[4]=0;
sum[5]=0;
sum[6]=0;
sum[7]=0;
jia=1;
}
else if(fuhao==2) // 按下减号 如果按下减号后数码管熄灭,等待按下减数
{
flag=1;
fuhao=0;
sum[0]=0;
sum[1]=0;
sum[2]=0;
sum[3]=0;
sum[4]=0;
sum[5]=0;
sum[6]=0;
sum[7]=0;
jian=1;
}
else if(fuhao==3) // 按下乘号 如果按下乘号后数码管熄灭,等待按下乘数
{
flag=1;
fuhao=0;
sum[0]=0;
sum[1]=0;
sum[2]=0;
sum[3]=0;
sum[4]=0;
sum[5]=0;
sum[6]=0;
sum[7]=0;
cheng=1;
}
else if(fuhao==4) // 按下除号 如果按下除号后数码管熄灭,等待按下除数
{
flag=1;
fuhao=0;
sum[0]=0;
sum[1]=0;
sum[2]=0;
sum[3]=0;
sum[4]=0;
sum[5]=0;
sum[6]=0;
sum[7]=0;
chu=1;
}
if(equal==1) //按下等于号
{
if(jia==1) //加法运算
{
flag=0;
equal=0;
jia=0;
dat=qian+hou;
hou=0;
qian=0;
m=0;
sum[0]=smg[dat%10000%1000%100/10];
sum[1]=smg[dat%10000%1000/100];
sum[2]=smg[dat%10000/1000];
sum[3]=smg[dat/10000];
sum[4]=0x00;
sum[5]=0x00;
sum[6]=0x00;
sum[7]=0x00;
}
if(jian==1) //减法运算
{
flag=0;
equal=0;
jian=0;
if(qian>=hou)
dat=qian-hou;
else
dat=hou-qian;
hou=0;
qian=0;
m=0;
sum[0]=smg[dat%10000%1000%100/10];
sum[1]=smg[dat%10000%1000/100];
sum[2]=smg[dat%10000/1000];
sum[3]=smg[dat/10000];
sum[4]=0x00;
sum[5]=0x00;
sum[6]=0x00;
sum[7]=0x00;
}
if(cheng==1) //乘法运算
{
flag=0;
equal=0;
cheng=0;
dat=qian*hou;
// if(dat>=100000) dat=0;
hou=0;
qian=0;
m=0;
sum[0]=smg[dat%100000%10000%1000/100];
sum[1]=smg[dat%100000%10000/1000];
sum[2]=smg[dat%100000/10000];
sum[3]=smg[dat/100000];
sum[4]=0x00;
sum[5]=0x00;
sum[6]=0x00;
sum[7]=0x00;
}
if(chu==1) //除法运算
{
flag=0;
equal=0;
chu=0;
dat=qian/hou;
hou=0;
qian=0;
m=0;
sum[0]=smg[dat%1000%100%10];
sum[1]=smg[dat%1000%100/10];
sum[2]=smg[dat%1000/100];
sum[3]=smg[dat/1000];
sum[4]=0x00;
sum[5]=0x00;
sum[6]=0x00;
sum[7]=0x00;
}
}
if(clear==1) //清零
{
clear=0;
qian=0;
hou=0;
dat=0;
sum[0]=0x3f;
sum[1]=0;
sum[2]=0;
sum[3]=0;
sum[4]=0;
sum[5]=0;
sum[6]=0;
sum[7]=0;
}
}
void display() //按键使数字向左移动
{
uint8 i;
for(i=0;i<8;i++)
{
switch(i)
{
case 0: a=1,b=1,c=1;break;
case 1: a=0,b=1,c=1;break;
case 2: a=1,b=0,c=1;break;
case 3: a=0,b=0,c=1;break;
case 4: a=1,b=1,c=0;break;
case 5: a=0,b=1,c=0;break;
case 6: a=1,b=0,c=0;break;
case 7: a=0,b=0,c=0;break;
}
P0=sum[i];;
delay1(1);
P0=0x00;
}
}
void main()
{
button=0;
while(1)
{
keyscan();
datapros();
display();
}
}