标题:
单片机计算器设计(可进行加减乘除以及平方等运算)带仿真与源码
[打印本页]
作者:
凤飞飞纷纷
时间:
2018-4-21 10:34
标题:
单片机计算器设计(可进行加减乘除以及平方等运算)带仿真与源码
基于单片机的计算器,矩阵键盘输入,lcd1602液晶屏显示,可以进行加减乘除以及平方等运算
计算器仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
(17.58 KB, 下载次数: 97)
下载附件
2018-4-21 15:23 上传
0.png
(47.22 KB, 下载次数: 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;//错误标志、第一次清屏标志、小数点标志以及小数点个数 负号标志、负号个数
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)
2018-4-21 10:32 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
ztw
时间:
2018-5-2 21:21
楼主,目标无法创建怎么回事啊
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1