![]() |
發(fā)布時間: 2019-5-6 10:32
正文摘要:之前在學(xué)校基本沒學(xué)過單片機之類的,后來去了一家公司實習(xí),在一個搞單片機的大佬下開始學(xué)習(xí),就做了個計算器,主要算法:加減乘除乘方開方三角函數(shù)排列組合等等,矩陣鍵盤用的5*7的,有些鍵沒用上,屏幕LCD1602,原 ... |
#define uchar unsigned char #define uint unsigned int uchar temp/*接收的字符*/,i/*通用數(shù)*/,gao/*兩位數(shù)的十位*/,di/*個位*/; bit fun_two;//第二功能標(biāo)志 float val1/*運算數(shù)1*/,val2/*運算數(shù)2*/,ans/*最終結(jié)果*/; char tab[32]/*輸入接收數(shù)組*/,weishu/*浮點數(shù)位數(shù)*/; char tab2[9]/*輸出緩沖數(shù)組*/; uchar fuhao/*運算符號標(biāo)志*/; //鍵盤鍵碼數(shù)組,部分為ASCII碼 //鍵盤上的ABCDF,鍵并沒有用上(E作為浮點數(shù)的格式符了), //這是由于單片機ROM只有8K,不能再擴展功能了(十六進制),但是保留按鍵。 uchar code keyval[5][7]={ 0Xb2,0X31,0X34,0X37,0X2E,0X41,0Xa9, 0X20,0X32,0X35,0X38,0X30,0XA1,0Xaa, 0Xb3,0X33,0X36,0X39,0XA6,0XA5,0Xb1, 0X20,0X2b,0Xb0,0X2a,0X2f,0Xa0,0X20, 0Xb4,0Xa2,0Xa3,0XA4,0XA7,0XA8,0X3d, }; //數(shù)據(jù)處理函數(shù) void come_in() { val1=atof(tab); //ASCII碼轉(zhuǎn)浮點數(shù) for(i=0;i<32;i++) //數(shù)組復(fù)位0 { tab[i]=0; } i=0; } //鍵盤掃描程序 //5*7鍵盤,列在P3口的高5位上,行在P1口低7位上 //返回值為keyval[]中的對應(yīng)鍵碼 uchar keyscan() { uchar temp; uchar hang,lie; P3=0xf8|P3; P3_7=0; if(P1!=0xff) { lie=0; temp=P1; } else { P3=0xf8|P3; P3_6=0; if(P1!=0xff) { lie=1; temp=P1; } else { P3=0xf8|P3; P3_5=0; if(P1!=0xff) { lie=2; temp=P1; } else { P3=0xf8|P3; P3_4=0; if(P1!=0xff) { lie=3; temp=P1; } else { P3=0xf8|P3; P3_3=0; if(P1!=0xff) { lie=4; temp=P1; } } } } } switch(temp) { case 0xbf:hang=0;break; case 0xdf:hang=1;break; case 0xef:hang=2;break; case 0xf7:hang=3;break; case 0xfb:hang=4;break; case 0xfd:hang=5;break; case 0xfe:hang=6;break; } while(P1!=0xff); //松手檢測 return (keyval[lie][hang]); } void keypad() { P3=0x07&P3; // P1=0xff; // if(P1!=0xff); // 判斷有無按鍵 delay(10); //延時去抖 if(P1!=0xff) //再次判斷 { temp=keyscan(); //掃描鍵盤,取得鍵碼 if(((temp>=0x30)&&(temp<=0x39))||(temp==0x2e)||(temp==0x2d)||(temp==0x45))//判斷鍵碼是否為浮點數(shù)關(guān)鍵字 { write_1602dat(temp); //顯示鍵碼 tab[i]=temp; //數(shù)據(jù)給tab[] i++; } else //若不為浮點數(shù)數(shù)關(guān)鍵字,則復(fù)雜了!。! { switch(temp) //判斷鍵碼 { case 0x2b: //加號 { come_in(); //數(shù)據(jù)處理 write_1602dat(0x2b); //寫加號 fuhao=temp; //取得運算符 val2=val1; //數(shù)據(jù)轉(zhuǎn)移 val1=0; //val1復(fù)位,等待下一個數(shù) } break; case 0xb0: //減號 { come_in(); //同加號 write_1602dat(0x2d); //寫減號 val2=val1; //同加號 fuhao=temp; //同加號 val1=0; //同加號 } break; case 0x2a: //乘號 { come_in(); //同加號 write_1602dat(0x2a); //寫乘號 val2=val1; //同加號 fuhao=temp; //同加號 val1=0; //同加號 } break; case 0x2f: //除號 { //同加號 come_in(); //同加號 write_1602dat(0x2f); //寫除號 val2=val1; //同加號 fuhao=temp; //同加號 val1=0; //同加號 } break; case 0xa0: //N次方 { come_in(); //同加號 write_1602dat(0x5e); //寫‘^’ val2=val1; //同加號 fuhao=temp; //同加號 val1=0; //同加號 } break; case 0xa1: //N次方根 { come_in(); //同加號 write_1602dat(0xa2); //寫根號 val2=val1; //同加號 fuhao=temp; //同加號 val1=0; //同加號 } break; case 0xa2: //sin { if(fun_two==0) //判斷第二功能標(biāo)準(zhǔn),如果0,寫“sin:” { write_1602dat('s'); write_1602dat('i'); write_1602dat('n'); write_1602dat(':'); } else //如果0,寫“asin:” { write_1602dat('a'); write_1602dat('s'); write_1602dat('i'); write_1602dat('n'); write_1602dat(':'); } fuhao=temp; val1=0; } break; case 0xa3: //cos { if(fun_two==0) //判斷第二功能標(biāo)準(zhǔn),如果0,寫“cos:” { write_1602dat('c'); write_1602dat('o'); write_1602dat('s'); write_1602dat(':'); } else //判斷第二功能標(biāo)準(zhǔn),如果0,寫“acos:” { write_1602dat('a'); write_1602dat('c'); write_1602dat('o'); write_1602dat('s'); write_1602dat(':'); }; fuhao=temp; val1=0; } break; case 0xa4: //tan { if(fun_two==0) //判斷第二功能標(biāo)準(zhǔn),如果0,寫“tan:” { write_1602dat('t'); write_1602dat('a'); write_1602dat('n'); write_1602dat(':'); } else //判斷第二功能標(biāo)準(zhǔn),如果0,寫“atan:” { write_1602dat('a'); write_1602dat('t'); write_1602dat('a'); write_1602dat('n'); write_1602dat(':'); }; fuhao=temp; val1=0; } break; case 0xa5: //log { come_in(); write_1602dat(0x7e); //寫對數(shù)符號 write_1602dat('l'); write_1602dat('o'); write_1602dat('g'); write_1602dat(0x7f); val2=val1; fuhao=temp; val1=0; } break; case 0xa6: //階乘 { come_in(); write_1602dat('!'); //寫階乘符號 fuhao=temp; val2=val1; val1=0; } break; case 0xa7: //排列組合 { come_in(); write_1602dat(0x7e); if(fun_two==0)write_1602dat('C');//判斷第二功能標(biāo)準(zhǔn),如果0,則為排列,如果1為組合” else write_1602dat('A'); write_1602dat(0x7f); val2=val1; fuhao=temp; val1=0; } break; case 0xa8: //累加 { come_in(); write_1602dat(0x7e); //寫累加符號 val2=val1; fuhao=temp; val1=0; } break; case 0xaa: //left { weizhi=weizhi+1; //左移 write_1602com(weizhi); i=i+1; } break; case 0xa9: //right { weizhi=weizhi-1; //右移 write_1602com(weizhi); i=i-1; } break; case 0xb1: //刪除 { weizhi=weizhi-1; write_1602com(weizhi); write_1602dat(0x20); weizhi=weizhi-1; write_1602com(weizhi); i=i-1; tab[i]=' '; } break; case 0xb2: //第二功能 { P2_7=!P2_7; fun_two=!fun_two; } break; case 0xb3: //led { P3_2=!P3_2; } break; case 0x3d: //OK鍵 { come_in(); switch(fuhao) { case 0x2b:ans=val1+val2;break;// 加 case 0xb0:ans=val2-val1;break;// 減 case 0x2a:ans=val2*val1;break;// 乘 case 0x2f:ans=val2/val1;break;// 除 case 0xa0:ans=pow(val2,val1);break;//N次方 case 0xa1:ans=exp(log(val1)/val2);break;//開N次方 case 0xa2:{if(fun_two==0)ans=sin(val1);else ans=asin(val1);fun_two=0;}break;// sin case 0xa3:{if(fun_two==0)ans=cos(val1);else ans=acos(val1);fun_two=0;}break;//cos case 0xa4:{if(fun_two==0)ans=tan(val1);else ans=atan(val1);fun_two=0;}break;//tan case 0xa5:ans=log(val1)/log(val2);break;//log case 0xa6:ans=jiecheng(val2);break;//階乘 case 0xa7:{if(fun_two==0)ans=zuhe(val2,val1);else ans=pailie(val2,val1);}break;//組合 case 0xa8:ans=leijia(val2,val1);break;//累加 default:ans=val1; } sprintf(tab2,"%f",ans); //浮點數(shù)轉(zhuǎn)字符串 weishu=lang(ans); //取得浮點數(shù)位數(shù) if(weishu>7) //位數(shù)大于7科學(xué)計數(shù)顯示 { for(i=8;i>1;i--) { tab2[i]=tab2[i-1]; } tab2[1]='.'; write_1602com(er+9); weizhi=er+8; write_1602dat('x'); write_1602dat('1'); write_1602dat('0'); write_1602dat('^'); if(weishu>9) //大于9,取得位數(shù)十位,個位,分別顯示 { gao=weishu/10; di=weishu%10; write_1602dat(gao+'0'); write_1602dat(di+'0'); } else write_1602dat(weishu+'0'); } else if(weishu<(-7)) //位數(shù)為負數(shù) { weishu=0-weishu; //變正數(shù) ans=ans*pow(10,weishu); //ans變假分數(shù) sprintf(tab2,"%f",ans); //后面基本同上 write_1602com(er+9); weizhi=er+9; write_1602dat('x'); write_1602dat('1'); write_1602dat('0'); write_1602dat('^'); write_1602dat('-'); if(weishu>9) { gao=weishu/10; di=weishu%10; write_1602dat(gao+'0'); write_1602dat(di+'0'); } else write_1602dat(weishu+'0'); } write_1602com(er); weizhi=er; for(i=0;i<8;i++) { write_1602dat(tab2[i]); delay(1); } write_1602com(er+15); weizhi=er+15; } break; case 0xb4: //復(fù)位鍵 { write_1602com(0x01); //清顯示 write_1602com(0x80); //指針復(fù)位 weizhi=0x80; for(i=0;i<32;i++) { tab[i]=0; //tab[]清0 } for(i=0;i<9;i++) { tab2[i]=0; //tab2[]清0 } val2=0; //該清0的都清0 val1=0; fun_two=0; ans=0; i=0; gao=0;di=0; temp=0; fuhao=0; P2_7=0; } break; } } } } |
Powered by 單片機教程網(wǎng)