51实现计算器Word文档下载推荐.docx

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

51实现计算器Word文档下载推荐.docx

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

51实现计算器Word文档下载推荐.docx

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<

BUZ_DELAY;

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)

if(KeyIn2==0)

val=2;

if(KeyIn3==0)

if(KeyIn3==0)

val=3;

if(KeyIn4==0)

if(KeyIn4==0)

val=FADD;

while((KeyIn1==0)||(KeyIn2==0)||(KeyIn3==0)||(KeyIn4==0));

KeyOut1=1;

KeyOut2=0;

val=4;

val=5;

val=6;

val=FSUB;

KeyOut3=0;

val=7;

val=8;

val=9;

val=FMUL;

KeyOut4=0;

val=0;

val=FRES;

val=FEQU;

val=FDIV;

if(val>

0)

buzzer_sound();

returnval;

*验证数据有效性

bitcheck_num(floatf_num)

if(f_num>

=100000)

return1;

return0;

*制作数码管错误标志

voidmake_led_error(void)

int8i;

5;

Led_buf[i]=Ledcode[10];

Led_buf[5]=Ledcode[12];

*制作数码管整数数据

voidmake_led_inumber(int32i_num)

bits_flag=0;

int16sit;

if(i_num<

s_flag=1;

i_num=-i_num;

ET0=0;

for(i=4,sit=10000;

i>

=1;

i--,sit/=10)

if(i_num>

=sit)

break;

i_num-=i_num/sit*sit;

for(;

i>

Led_buf[i]=Ledcode[i_num/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)

int32num;

int8i,decimal,dot_sit=0;

if(f_num<

f_num=-f_num;

num=(int32)(f_num*10000+0.5);

for(decimal=4;

decimal>

0;

decimal--)

if(num%10!

=0)

num/=10;

dot_sit=decimal;

=10000)

dot_sit=0;

elseif(f_num>

=1000)

if(decimal>

=1)

dot_sit=1;

=100)

=2)

dot_sit=2;

=10)

=3)

dot_sit=3;

dot_sit;

f_num*=10;

num=(int32)(f_num+0.5);

if(num>

if(i==dot_sit)

num-=num/sit*sit;

Led_buf[i]=Ledcode[num/sit];

Led_buf[0]=Ledcode[num];

Led_buf[dot_sit]&

=0x7F;

*数码管显示

voidshow_num(uint8*buf)

ENLED=1;

switch(Led_n)

case0:

ADDR0=0;

ADDR1=0;

ADDR2=0;

P0=buf[0];

case1:

ADDR0=1;

P0=buf[1];

case2:

ADDR1=1;

P0=buf[2];

case3:

P0=buf[3];

case4:

ADDR2=1;

P0=buf[4];

case5:

P0=buf[5];

ENLED=0;

if(Led_n>

=5)

Led_n=0;

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;

caseFMUL:

ans=Tmp1*Tmp2;

caseFDIV:

if(Tmp2==0)

{

err=1;

break;

}

else

ans=Tmp1/Tmp2;

}

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

if(C_flag==0)

ans=Tmp1;

ans*=10;

ans+=key_val;

if(check_num(ans))

return;

else

Tmp1=ans;

make_led_inumber(Tmp1);

ans=Tmp2;

Tmp2=ans;

make_led_inumber(Tmp2);

main()

int8key_val;

ADDR3=1;

make_led_inumber(0);

TMOD=0x01;

TH0=0xF8;

TL0=0xCC;

TR0=1;

EA=1;

while

(1)

key_val=scan_key();

if(key_val==-1)

continue;

calculate(key_val);

voidtime0()interrupt1

TR0=0;

show_num(Led_buf);

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

当前位置:首页 > 高等教育 > 理学

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

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