|
基于單片機的計算器,矩陣鍵盤輸入,lcd1602液晶屏顯示,可以進行加減乘除以及平方等運算
計算器仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (17.58 KB, 下載次數(shù): 97)
下載附件
2018-4-21 15:23 上傳
0.png (47.22 KB, 下載次數(shù): 90)
下載附件
2018-4-21 15:24 上傳
單片機源程序如下:
- #include<reg52.h>
- #include<math.h>
- #include"define.h" //定義頭文件
- #include"delay.h" //延遲頭文件
- #include"display.h" //顯示頭文件
- #include"scan.h" //掃描頭文件
- #include"LCD1602.h" //LCD1602頭文件
- #include"interrupt.h" //中斷頭文件
- void main() //主程序
- {
- uchar error=0,i,first=0,dot1,dot2,dot1_num,dot2_num,minus1,minus2;//錯誤標(biāo)志、第一次清屏標(biāo)志、小數(shù)點標(biāo)志以及小數(shù)點個數(shù) 負(fù)號標(biāo)志、負(fù)號個數(shù)
- uchar Key_num,last_key_num; //鍵號
- uchar flag=0,equal_flag; //運算符、等于符
- double num1=0,num2=0,num=0,result=0; //第一個數(shù)、第二個數(shù)、計算結(jié)果
- uchar first_num=0,second_num=0;
- InitLcd();
- EA=1;
- ET0=1;
- TMOD=0X01;
- TH0=(65536-500)/256;
- TL0=(65536-500)%256;
- write_com(0x80+0x40+15);
- write_Dat('0');
- write_com(0x80);
- while(1)
- {
- while(key_scan()==0xff);
- TR0=1;
- if(first==0)
- {
- first=1;
- write_com(0x01);
- }
- Key_num=key_scan();
- switch(key_scan())
- {
-
- case 6:write_Dat('7');num=7;break;
- case 7:write_Dat('8');num=8;break;
- case 8:write_Dat('9');num=9;break;
- case 9:
- if(last_key_num!=Key_num)
- {
- write_Dat('+');
- flag=1;
- }break;
- case 10:
- if(last_key_num!=Key_num)
- {
- write_Dat('^');
- flag=5;
- }break;
- case 11:write_Dat('4');num=4;break;
- case 12:write_Dat('5');num=5;break;
- case 13:write_Dat('6');num=6;break;
- case 14:
- if(last_key_num!=Key_num)
- {
- write_Dat('-');
- flag=2;
- }break;
- case 15:
- if(last_key_num!=Key_num)
- {
- write_Dat('T');
- flag=6;
- }break;
- case 16:write_Dat('1');num=1;break;
- case 17:write_Dat('2');num=2;break;
- case 18:write_Dat('3');num=3;break;
- case 19:
- if(last_key_num!=Key_num)
- {
- write_Dat('*');
- flag=3;
- }break;
- case 21:write_Dat('0');num=0;break;
- case 22:
- if(last_key_num!=Key_num)
- {
- if(flag==0)
- {
- minus1++;
- if(minus1==1)
- {
- write_Dat('-');
- }
- }
- else
- {
- minus2++;
- if(minus2==1)
- {
- write_Dat('-');
- }
- }
- } break;
- case 23:
- if(last_key_num!=Key_num)
- {
- if(flag==0)
- {
- dot1++;
- if(dot1==1)
- {
- write_Dat('.');
- }
- }
- else
- {
- dot2++;
- if(dot2==1)
- {
- write_Dat('.');
- }
- }
- } break;
-
- case 24:
- if(last_key_num!=Key_num)
- {
- write_Dat('/');
- flag=4;
- }break;
- case 25:
- if(last_key_num!=Key_num)
- {
- write_Dat('=');
- equal_flag=1;
- }break;
- }
- if(Key_num!=1&&Key_num!=2&&Key_num!=3&&Key_num!=4&&Key_num!=15&&Key_num!=22&&Key_num!=23&&Key_num!=25) //第一個數(shù)
- {
- if(flag==0)
- {
- num1=num1*10+num;
- num=0;
- if(dot1!=0)
- {
- dot1_num++;
- }
- first_num=1;
- }
- if(flag!=0)
- {
- num2=num2*10+num;
- num=0;
- if(dot2!=0)
- {
- dot2_num++;
- }
- second_num=1;
- }
- }
- if(equal_flag==1&&first_num==1)
- {
- if(dot1!=0)
- {
- num1=num1/pow(10,dot1_num);
- dot1=0;
- }
- if(dot2!=0)
- {
- num2=num2/pow(10,dot2_num);
- dot2=0;
- }
- if(minus1!=0)
- {
- num1=num1*(-1);
- }
- if(minus2!=0)
- {
- num2=num2*(-1);
- }
- if(second_num!=0)
- {
- switch(flag)
- {
- case 1:result=num1+num2;break;
- case 2:result=num1-num2;break;
- case 3:result=num1*num2;break;
- case 4:
- if(num2!=0)
- {
- result=num1/num2;
- }
- else
- {
- write_com(0x80+0x40+10);
- for(i=0;i<5;i++)
- {
- write_Dat(table2[i]);
- }
- error=1;
- } break;
- case 5: result=pow(num1,num2);break;
- case 6: result=pow(num1,1/num2);break;
- }
- }
-
- if(error!=1)
- display(result);
- }
-
- if(Key_num==20) //清零
- {
- num1=num2=result=0;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
基于單片機計算器.rar
(85.18 KB, 下載次數(shù): 63)
2018-4-21 10:32 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
|