51实现计算器.docx

上传人:b****6 文档编号:7405973 上传时间:2023-01-23 格式:DOCX 页数:15 大小:16.23KB
下载 相关 举报
51实现计算器.docx_第1页
第1页 / 共15页
51实现计算器.docx_第2页
第2页 / 共15页
51实现计算器.docx_第3页
第3页 / 共15页
51实现计算器.docx_第4页
第4页 / 共15页
51实现计算器.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

51实现计算器.docx

《51实现计算器.docx》由会员分享,可在线阅读,更多相关《51实现计算器.docx(15页珍藏版)》请在冰豆网上搜索。

51实现计算器.docx

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;i

f_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;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 司法考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1