51实现计算器.docx
《51实现计算器.docx》由会员分享,可在线阅读,更多相关《51实现计算器.docx(15页珍藏版)》请在冰豆网上搜索。
51实现计算器
/*
*Easycalculator
*
*K4:
+K8:
-K12:
*K16:
/K14:
ClearK15:
=
*
*MadebyKingst-刚哥
*/
#include
typedefunsignedcharuint8;
typedefunsignedintuint16;
typedefunsignedlonguint32;
typedefcharint8;
typedefintint16;
typedeflongint32;
sbitKeyIn1=P2^4;
sbitKeyIn2=P2^5;
sbitKeyIn3=P2^6;
sbitKeyIn4=P2^7;
sbitKeyOut1=P2^3;
sbitKeyOut2=P2^2;
sbitKeyOut3=P2^1;
sbitKeyOut4=P2^0;
sbitADDR0=P1^0;
sbitADDR1=P1^1;
sbitADDR2=P1^2;
sbitADDR3=P1^3;
sbitENLED=P1^4;
sbitBUZZ=P1^6;
#defineFADD10
#defineFSUB11
#defineFMUL12
#defineFDIV13
#defineFRES14
#defineFEQU15
#defineKEY_DELAY300
#defineBUZ_DELAY80
codeuint8Ledcode[13]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0x86};
uint8Led_n=0;
uint8Led_buf[6];
floatTmp1=0,Tmp2=0;
int8C_flag=0;
/*
*延时
*/
voiddelay(uint16n)
{
while(n--);
}
/*
*蜂鸣器发声
*/
voidbuzzer_sound(void)
{
uint16i;
for(i=0;i{
BUZZ=~BUZZ;
delay(100);
}
BUZZ=1;
}
/*
*按键扫描
*/
int8scan_key(void)
{
int8val=-1;
KeyOut1=0;
KeyOut2=1;
KeyOut3=1;
KeyOut4=1;
if(KeyIn1==0)
{
delay(KEY_DELAY);
if(KeyIn1==0)
val=1;
}
if(KeyIn2==0)
{
delay(KEY_DELAY);
if(KeyIn2==0)
val=2;
}
if(KeyIn3==0)
{
delay(KEY_DELAY);
if(KeyIn3==0)
val=3;
}
if(KeyIn4==0)
{
delay(KEY_DELAY);
if(KeyIn4==0)
val=FADD;
}
while((KeyIn1==0)||(KeyIn2==0)||(KeyIn3==0)||(KeyIn4==0));
KeyOut1=1;
KeyOut2=0;
KeyOut3=1;
KeyOut4=1;
if(KeyIn1==0)
{
delay(KEY_DELAY);
if(KeyIn1==0)
val=4;
}
if(KeyIn2==0)
{
delay(KEY_DELAY);
if(KeyIn2==0)
val=5;
}
if(KeyIn3==0)
{
delay(KEY_DELAY);
if(KeyIn3==0)
val=6;
}
if(KeyIn4==0)
{
delay(KEY_DELAY);
if(KeyIn4==0)
val=FSUB;
}
while((KeyIn1==0)||(KeyIn2==0)||(KeyIn3==0)||(KeyIn4==0));
KeyOut1=1;
KeyOut2=1;
KeyOut3=0;
KeyOut4=1;
if(KeyIn1==0)
{
delay(KEY_DELAY);
if(KeyIn1==0)
val=7;
}
if(KeyIn2==0)
{
delay(KEY_DELAY);
if(KeyIn2==0)
val=8;
}
if(KeyIn3==0)
{
delay(KEY_DELAY);
if(KeyIn3==0)
val=9;
}
if(KeyIn4==0)
{
delay(KEY_DELAY);
if(KeyIn4==0)
val=FMUL;
}
while((KeyIn1==0)||(KeyIn2==0)||(KeyIn3==0)||(KeyIn4==0));
KeyOut1=1;
KeyOut2=1;
KeyOut3=1;
KeyOut4=0;
if(KeyIn1==0)
{
delay(KEY_DELAY);
if(KeyIn1==0)
val=0;
}
if(KeyIn2==0)
{
delay(KEY_DELAY);
if(KeyIn2==0)
val=FRES;
}
if(KeyIn3==0)
{
delay(KEY_DELAY);
if(KeyIn3==0)
val=FEQU;
}
if(KeyIn4==0)
{
delay(KEY_DELAY);
if(KeyIn4==0)
val=FDIV;
}
while((KeyIn1==0)||(KeyIn2==0)||(KeyIn3==0)||(KeyIn4==0));
if(val>0)
buzzer_sound();
returnval;
}
/*
*验证数据有效性
*/
bitcheck_num(floatf_num)
{
if(f_num>=100000)
return1;
return0;
}
/*
*制作数码管错误标志
*/
voidmake_led_error(void)
{
int8i;
for(i=0;i<5;i++)
Led_buf[i]=Ledcode[10];
Led_buf[5]=Ledcode[12];
}
/*
*制作数码管整数数据
*/
voidmake_led_inumber(int32i_num)
{
bits_flag=0;
int16sit;
int8i;
if(i_num<0)
{
s_flag=1;
i_num=-i_num;
}
ET0=0;
for(i=4,sit=10000;i>=1;i--,sit/=10)
{
if(i_num>=sit)
break;
Led_buf[i]=Ledcode[10];
i_num-=i_num/sit*sit;
}
for(;i>=1;i--,sit/=10)
{
Led_buf[i]=Ledcode[i_num/sit];
i_num-=i_num/sit*sit;
}
Led_buf[0]=Ledcode[i_num]&0x7F;
if(s_flag)
Led_buf[5]=Ledcode[11];
else
Led_buf[5]=Ledcode[10];
ET0=1;
}
/*
*制作数码管浮点数据
*/
voidmake_led_fnumber(floatf_num)
{
bits_flag=0;
int32num;
int16sit;
int8i,decimal,dot_sit=0;
if(f_num<0)
{
s_flag=1;
f_num=-f_num;
}
num=(int32)(f_num*10000+0.5);
for(decimal=4;decimal>0;decimal--)
{
if(num%10!
=0)
break;
num/=10;
}
dot_sit=decimal;
if(f_num>=10000)
dot_sit=0;
elseif(f_num>=1000)
if(decimal>=1)
dot_sit=1;
elseif(f_num>=100)
if(decimal>=2)
dot_sit=2;
elseif(f_num>=10)
if(decimal>=3)
dot_sit=3;
for(i=0;if_num*=10;
num=(int32)(f_num+0.5);
ET0=0;
for(i=4,sit=10000;i>=1;i--,sit/=10)
{
if(num>=sit)
break;
if(i==dot_sit)
break;
Led_buf[i]=Ledcode[10];
num-=num/sit*sit;
}
for(;i>=1;i--,sit/=10)
{
Led_buf[i]=Ledcode[num/sit];
num-=num/sit*sit;
}
Led_buf[0]=Ledcode[num];
Led_buf[dot_sit]&=0x7F;
if(s_flag)
Led_buf[5]=Ledcode[11];
else
Led_buf[5]=Ledcode[10];
ET0=1;
}
/*
*数码管显示
*/
voidshow_num(uint8*buf)
{
ENLED=1;
switch(Led_n)
{
case0:
ADDR0=0;
ADDR1=0;
ADDR2=0;
P0=buf[0];
break;
case1:
ADDR0=1;
ADDR1=0;
ADDR2=0;
P0=buf[1];
break;
case2:
ADDR0=0;
ADDR1=1;
ADDR2=0;
P0=buf[2];
break;
case3:
ADDR0=1;
ADDR1=1;
ADDR2=0;
P0=buf[3];
break;
case4:
ADDR0=0;
ADDR1=0;
ADDR2=1;
P0=buf[4];
break;
case5:
ADDR0=1;
ADDR1=0;
ADDR2=1;
P0=buf[5];
break;
}
ENLED=0;
if(Led_n>=5)
Led_n=0;
else
Led_n++;
}
/*
*计算程序
*/
voidcalculate(int8key_val)
{
floatans;
biterr=0;
if((key_val>=FADD)&&(key_val<=FDIV))
{
C_flag=key_val;
}
elseif(key_val==FEQU)
{
switch(C_flag)
{
caseFADD:
ans=Tmp1+Tmp2;break;
caseFSUB:
ans=Tmp1-Tmp2;break;
caseFMUL:
ans=Tmp1*Tmp2;break;
caseFDIV:
if(Tmp2==0)
{
err=1;
break;
}
else
{
ans=Tmp1/Tmp2;
break;
}
}
if(check_num(ans))
err=1;
if(err)
make_led_error();
else
make_led_fnumber(ans);
C_flag=0;
Tmp1=0;
Tmp2=0;
}
elseif(key_val==FRES)
{
make_led_fnumber(0);
C_flag=0;
Tmp1=0;
Tmp2=0;
}
else
{
if(C_flag==0)
{
ans=Tmp1;
ans*=10;
ans+=key_val;
if(check_num(ans))
return;
else
Tmp1=ans;
make_led_inumber(Tmp1);
}
else
{
ans=Tmp2;
ans*=10;
ans+=key_val;
if(check_num(ans))
return;
else
Tmp2=ans;
make_led_inumber(Tmp2);
}
}
}
main()
{
int8key_val;
ADDR3=1;
ENLED=0;
make_led_inumber(0);
TMOD=0x01;
TH0=0xF8;
TL0=0xCC;
TR0=1;
ET0=1;
EA=1;
while
(1)
{
key_val=scan_key();
if(key_val==-1)
continue;
calculate(key_val);
}
}
voidtime0()interrupt1
{
TR0=0;
TH0=0xF8;
TL0=0xCC;
show_num(Led_buf);
TR0=1;
}