基于51单片机的计算器课程设计报告及实验报告.docx
《基于51单片机的计算器课程设计报告及实验报告.docx》由会员分享,可在线阅读,更多相关《基于51单片机的计算器课程设计报告及实验报告.docx(9页珍藏版)》请在冰豆网上搜索。
![基于51单片机的计算器课程设计报告及实验报告.docx](https://file1.bdocx.com/fileroot1/2023-5/16/da6c7282-a815-46f3-8fb4-de45d244129f/da6c7282-a815-46f3-8fb4-de45d244129f1.gif)
基于51单片机的计算器课程设计报告及实验报告
项目一:
简单计算器
1.实验题目:
用51单片机实现简单的计算器功能
2.实验截图:
1).实验运行前截图:
2).实验运行后截图:
3.实验代码:
#include
#include
#include
#include
#include
unsignedchartable1[16];//1602第一行显示字符
unsignedchartable2[16];//1602第二行显示字符
unsignedcharcodetable_error[]="error";
/*键扫描函数*/
unsignedcharkeyscan()//扫描键盘函数
{
unsignedcharkey_l,key_h,addres,num;
P0=0x0f;
key_l=P0;
P0=0xf0;
key_h=P0;
addres=key_l|key_h;
if(addres!
=0xff)
{
Delayms
(1);
if(addres!
=0xff)
{
P0=0x0f;
key_l=P0;
P0=0xf0;
key_h=P0;
addres=key_l|key_h;
switch(addres)
{
case0xee:
num='1';break;
case0xde:
num='2';break;
case0xbe:
num='3';break;
case0xed:
num='4';break;
case0xdd:
num='5';break;
case0xbd:
num='6';break;
case0xeb:
num='7';break;
case0xdb:
num='8';break;
case0xbb:
num='9';break;
case0xd7:
num='0';break;//按键0
case0xe7:
num='C';break;//按键*
case0xb7:
num='=';break;//按键#
case0x7e:
num='/';break;//按键A
case0x7d:
num='*';break;//按键B
case0x7b:
num='-';break;//按键C
case0x77:
num='+';break;//按键D
}
while(addres!
=0xff)
{
P0=0x0f;
key_l=P0;
P0=0xf0;
key_h=P0;
addres=key_l|key_h;
}
returnnum;
}
}
return0;
}
voidclear_lcd(void)//清屏
{
unsignedcharj;
for(j=0;j<16;j++)
{
table1[j]='\0';
table2[j]='\0';
}
}
voidmain()
{
unsignedchari=0,j;
unsignedcharkey;
unsignedcharflag_operator=0;//加减乘除标志位
unsignedcharflag_equ=0;//等于标志位
unsignedcharflag_key=0;//运算位标志
bitflag_MaxValue=0;
bitflag_minus=0;//负数
longintvalue=0;//最终运算结果
unsignedlongintvalue_H=0;//第一个数据
unsignedlongintvalue_L=0;//第二个数据
unsignedlonginttemp[]={1,10,100,1000,10000,100000,1000000,10000000,100000000};
Initialize_LCD();
while
(1)
{
key=keyscan();
if(key!
=0)
{
if(key=='C')//清除键C按下
{
clear_lcd();
i=0;
flag_operator=0;flag_equ=0;value=0;value_H=0;value_L=0;flag_key=0;flag_minus=0;
}
else
{
for(j=0;j
{
table1[15-i+j]=table1[15-i+j+1];
}
table1[15]=key;
//table1[i]=key;
i++;
}
if(key=='=')
{
for(j=0;j<16;j++)//确定运算符位置
{
if(table1[j]=='=')
{
flag_equ=j;
flag_key++;
break;
}
if(table1[j]=='+'||table1[j]=='-'||table1[j]=='*'||table1[j]=='/')
{
flag_operator=j;
flag_key++;
}
}
for(j=16-i;j{
//value_H=value_H+(table1[j]-48)*(pow(10,(flag_operator-j-1)));
value_H=value_H+(table1[j]-48)*temp[flag_operator-j-1];
}
for(j=flag_operator+1;j<15;j++)//第二个数据处理
{
//value_L=value_L+(table1[j]-48)*pow(10,(flag_equ-j-1));
value_L=value_L+(table1[j]-48)*temp[flag_equ-j-1];
}
if(table1[flag_operator]=='+')
{
value=value_H+value_L;
}
elseif(table1[flag_operator]=='-')
{
value=value_H-value_L;
}
elseif(table1[flag_operator]=='*')
{
value=value_H*value_L;
}
elseif(table1[flag_operator]=='/')
{
value=value_H/value_L;
}
if(value==0)
table2[15]=(value+48);
elseif(value<0)
{
value=abs(value);
flag_minus=1;
}
elseif(value>2000000000)
{
flag_MaxValue=1;
//break;
}
j=15;
while(value!
=0)
{
table2[j]=(value%10+48);
value=value/10;
j--;
}
if(flag_minus)//负数
{
table2[j]='-';
}
}
if(flag_key>2||table1[0]=='0'||flag_MaxValue==1)
{
ShowString(5,1,table_error);
while(keyscan()!
='C');
clear_lcd();
i=0;
flag_operator=0;flag_equ=0;value=0;value_H=0;value_L=0;flag_key=0;flag_minus=0;
}
}
ShowString(0,0,table1);
ShowString(0,1,table2);
}
}