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