51实现计算器Word文档下载推荐.docx
- 文档编号:20516389
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:15
- 大小:16.23KB
51实现计算器Word文档下载推荐.docx
《51实现计算器Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《51实现计算器Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
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);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 实现 计算器
![提示](https://static.bdocx.com/images/bang_tan.gif)