基于单片机的计算器,矩阵键盘输入,lcd1602液晶屏显示,可以进行加减乘除以及平方等运算
计算器仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #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;//错误标志、第一次清屏标志、小数点标志以及小数点个数 负号标志、负号个数
- uchar Key_num,last_key_num; //键号
- uchar flag=0,equal_flag; //运算符、等于符
- double num1=0,num2=0,num=0,result=0; //第一个数、第二个数、计算结果
- 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) //第一个数
- {
- 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黑下载附件…………
复制代码
所有资料51hei提供下载:
基于单片机计算器.rar
(85.18 KB, 下载次数: 63)
|