2022年2022年计算器c程序 .pdf
#include unsigned char code disp_tab13=0 x28,0 x7e,0 xa2,0 x62,0 x74,0 x61,0 x21,0 x7a,0 x20,0 x60,0 xff,0 xa1,0 xf7; unsigned char code disp_tab_point13=0 x08,0 x5e,0 x82,0 x42,0 x54,0 x41,0 x01,0 x5a,0 x00,0 x40,0 xff,0 x40; unsigned char disp_buf8=10,10,10,10,10,10,10,0,disp_buf_X8,disp_buf_Y8; unsigned char keynum,shift_point; float X,Y ,Z; bit flag_div,flag_mul,flag_add,flag_sub,flag_point,flag_result,flag_keynum,no_keynum;bit flag_add_cal,flag_sub_cal,flag_cal,flag_error,flag_store_Y ,flag_fushu; bit flag_add1,flag_sub1,flag_mul1,flag_mul_cal,flag_div1,flag_div_cal;sbit flag_clear=P30; sbit flag_OFF=P31; void mdelay(unsigned int Delay); unsigned char keyscan(void); void display(void); void readkey(unsigned char date); void pro_display(void); void store_X(void); void store_Y(void); void CHANGE_BCD(void); main() unsigned char i; while(1) readkey(keyscan(); pro_display(); if(!flag_OFF) for(i=0;i8;i+) disp_bufi=10; if(!flag_clear) flag_add_cal=0; flag_sub_cal=0; flag_mul_cal=0; flag_div_cal=0; flag_add1=0; flag_sub1=0; flag_mul1=0; flag_div1=0; flag_add=0; flag_sub=0; flag_mul=0; flag_div=0; flag_cal=0; flag_point=0; flag_result=0; flag_keynum=0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 9 页 - - - - - - - - - no_keynum=0; flag_store_Y=0; X=0; Y=0; Z=0; for(i=0;i=0) flag_fushu=0; / else Z=X+Y ; CHANGE_BCD(); else flag_add=0; store_X();/ 只要按了就存储当前值为X flag_cal=1; flag_add1=1;flag_sub1=0;flag_mul1=0;flag_div1=0; else if(flag_sub)/ 减法 if(flag_sub_cal) flag_sub_cal=0; flag_cal=1; store_Y(); / if(flag_fushu) if(X=Y)&(!flag_fushu) Z=X-Y ; else if(!flag_fushu) flag_fushu=1; Z=Y-X; else if(flag_fushu) Z=Y+X; CHANGE_BCD(); else 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 9 页 - - - - - - - - - flag_sub=0; store_X();/ 只要按了就存储当前值为X flag_cal=1; flag_sub1=1;flag_add1=0;flag_mul1=0;flag_div1=0; else if(flag_mul) / 乘法 if(flag_mul_cal) flag_mul_cal=0; flag_cal=1; store_Y(); Z=X*Y ; CHANGE_BCD(); else flag_mul=0; store_X();/ 只要按了就存储当前值为X flag_cal=1; flag_mul1=1;flag_add1=0;flag_sub1=0;flag_div1=0; else if(flag_div) / 除法 if(flag_div_cal) flag_div_cal=0; flag_cal=1; store_Y(); if(Y=0.) flag_error=1; else Z=X/Y ; CHANGE_BCD(); else flag_div=0; store_X();/ 只要按了加号就存储当前值为X flag_cal=1; flag_div1=1;flag_add1=0;flag_sub1=0;flag_mul1=0; else if(flag_result)/= 号键计算结果 flag_result=0; if(flag_add1|flag_sub1|flag_mul1|flag_div1) if(!flag_store_Y) store_Y();flag_store_Y=1;/存储 =号按时的第一次值为Y if(flag_add1) Z=X+Y ; X=Z; flag_add_cal=0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 9 页 - - - - - - - - - if(flag_sub1) flag_sub_cal=0; if(X=Y)&(!flag_fushu) Z=X-Y ;X=Z; else if(!flag_fushu) flag_fushu=1; Z=Y-X;X=Z; else if(flag_fushu) Z=Y+X;X=Z; if(flag_mul1) flag_mul_cal=0; Z=X*Y ; X=Z; if(flag_div1) flag_div_cal=0; if(Y=0.) flag_error=1; else Z=X/Y ; X=Z; CHANGE_BCD(); display(); else flag_cal=1; void mdelay(unsigned int Delay) unsigned int i; for(;Delay0;Delay-) for(i=0;i124;i+) ; void pro_display(void)/ 输入显示处理程序 unsigned char i; if(flag_cal)/ 如果有 +-*/ 键按下if(flag_keynum|flag_point)/如果再有数字键按下 flag_cal=0; flag_keynum=0; flag_add_cal=1; flag_sub_cal=1; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 9 页 - - - - - - - - - flag_mul_cal=1; flag_div_cal=1; shift_point=0; for(i=0;i7;i+) disp_bufi=10; if(flag_point) disp_buf7=0;flag_point=0;shift_point=7; else disp_buf7=keynum; else /没有数字键则显示display(); else /没有 +-*/ 键按下,就等待数字键键入,并作一些处理 if(disp_buf1=10)/判断是否到了首位 if(flag_point)/ 判断是否按了 .号if(shift_point=0)/ 如果是第一次按的.号flag_point=0;shift_point=7; if(flag_keynum)/ 有数字键按下 flag_keynum=0; if(disp_buf7=0)&(disp_buf6=10)&(shift_point=0)/末尾位为0 且前面一位没数值且没有. if(keynum!=0)/ 如果键值不为0 则送末位disp_buf7=keynum;display(); else display(); else/末尾位不为0 for(i=0;i7;i+)/全体向首部移一位disp_bufi=disp_bufi+1; if(shift_point) shift_point-; disp_buf7=keynum; /将得到的数值放置末位display(); else display(); else keynum=0;flag_keynum=0;display(); void display(void)/ 数码管显示程序 unsigned char tmp=0 xfe,i; for(i=0;i7;i+) P2=tmp; if(shift_point) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 9 页 - - - - - - - - - if(shift_point=i) P0=disp_tab_pointdisp_bufi; else P0=disp_tabdisp_bufi; else P0=disp_tabdisp_bufi; mdelay(1); tmp=(tmp1)|0 x01; P2=0 x7f; if(shift_point) if(shift_point!=7) P0=disp_tabdisp_buf7; else P0=disp_tab_pointdisp_buf7; else P0=disp_tab_pointdisp_buf7; mdelay(1); unsigned char keyscan(void)/ 键盘扫描程序 unsigned char test,tmp; P1=0 xf0; if(P1&0 xf0)!=0 xf0) mdelay(1); if(P1&0 xf0)!=0 xf0) test=0 xfe; while(test&0 x10)!=0) P1=test; if(P1&0 xf0)!=0 xf0) tmp=(P1&0 xf0)|0 x0f; return(test)+(tmp); else test=(test1)|0 x01; return(0); void readkey(unsigned char date)/ 键值解释程序 while(P1&0 xf0)!=0 xf0) display();/ 等待键释放; switch(date) case 0X11: flag_add=1;break; case 0X21: flag_result=1;break; case 0X41: keynum=0;flag_keynum=1;break; case 0X81: flag_point=1;break; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 9 页 - - - - - - - - - case 0X12: flag_sub=1;break; case 0X22: keynum=3;flag_keynum=1;break; case 0X42: keynum=2;flag_keynum=1;break; case 0 x82: keynum=1;flag_keynum=1;break; case 0 x14: flag_mul=1;break; case 0 x24: keynum=6;flag_keynum=1;break; case 0 x44: keynum=5;flag_keynum=1;break; case 0 x84: keynum=4;flag_keynum=1;break; case 0 x18: flag_div=1;break; case 0 x28: keynum=9;flag_keynum=1;break; case 0 x48: keynum=8;flag_keynum=1;break; case 0 x88: keynum=7;flag_keynum=1;break; case 0 x00: no_keynum=1;break; void store_X(void) unsigned char i; for(i=0;i8;i+) disp_buf_Xi=disp_bufi; for(i=0;i8;i+) if(disp_buf_Xi=10) disp_buf_Xi=0; X=disp_buf_X1*1000000+disp_buf_X2*100000+disp_buf_X3*10000+disp_buf_X4*1000+disp_buf_X5*100+disp_buf_X6*10+disp_buf_X7; if(shift_point=6) X=X/10.; if(shift_point=5) X=X/100.; if(shift_point=4) X=X/1000.; if(shift_point=3) X=X/10000.; if(shift_point=2) X=X/100000.; if(shift_point=1) X=X/1000000.; void store_Y(void) unsigned char i; for(i=0;i8;i+) disp_buf_Yi=disp_bufi; for(i=0;i8;i+) if(disp_buf_Yi=10) disp_buf_Yi=0; Y=disp_buf_Y1*1000000+disp_buf_Y2*100000+disp_buf_Y3*10000+disp_buf_Y4*1000+disp_buf_Y5*100+disp_buf_Y6*10+disp_buf_Y7; if(shift_point=6) Y=Y/10.; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 9 页 - - - - - - - - - if(shift_point=5) Y=Y/100.; if(shift_point=4) Y=Y/1000.; if(shift_point=3) Y=Y/10000.; if(shift_point=2) Y=Y/100000.; if(shift_point=1) Y=Y/1000000.; void CHANGE_BCD(void) unsigned long tmp; unsigned char j; if(Z10.)/Z10 Z=Z*1000000;shift_point=1; else if(Z100.)/10=Z100 Z=Z*100000;shift_point=2; else if(Z1000.)/100=Z1000 Z=Z*10000;shift_point=3; else if(Z10000.)/1000=Z10000 Z=Z*1000;shift_point=4; else if(Z100000.)/10000=Z100000 Z=Z*100;shift_point=5; else if(Z1000000.)/100000=Z1000000 Z=Z*10;shift_point=6; else if(Z10000000.)/1000000=Z=10000000 flag_error=1; if(!flag_error) tmp=(long)Z; disp_buf1=(char)(tmp/1000000); disp_buf2=(char)(tmp%1000000/100000); disp_buf3=(char)(tmp%100000/10000); disp_buf4=(char)(tmp%10000/1000); disp_buf5=(char)(tmp%1000/100); disp_buf6=(char)(tmp%100/10); disp_buf7=(char)(tmp%10); if(flag_error) /flag_error=0; shift_point=0; disp_buf7=0; disp_buf6=10; disp_buf5=10; disp_buf4=10; disp_buf3=10; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 9 页 - - - - - - - - - disp_buf2=10; disp_buf1=10; disp_buf0=11;/E if(flag_fushu) disp_buf0=12;/- if(!flag_error) for(j=0;j7;j+) if(disp_buf7=0)&(shift_point7)/最后一位为0 if(disp_buf0=12) shift_point+; disp_buf7=disp_buf6; disp_buf6=disp_buf5; disp_buf5=disp_buf4; disp_buf4=disp_buf3; disp_buf3=disp_buf2; disp_buf2=disp_buf1; disp_buf1=10; else shift_point+; disp_buf7=disp_buf6; disp_buf6=disp_buf5; disp_buf5=disp_buf4; disp_buf4=disp_buf3; disp_buf3=disp_buf2; disp_buf2=disp_buf1; disp_buf1=disp_buf0; else break; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 9 页 - - - - - - - - -