当前位置:文档之家› 基于51单片机的计算器课程设计实验报告

基于51单片机的计算器课程设计实验报告

项目一:简单计算器
1.实验题目:用51单片机实现简单的计算器功能
2.实验截图:
1).实验运行前截图:
2).实验运行后截图:
3.实验代码:
#include<reg52.h>
#include<intrins.h>
#include<math.h>
#include<defined.H>
#include<LCD1602.h>
unsigned char table1[16]; //1602第一行显示字符unsigned char table2[16]; //1602第二行显示字符unsigned char code table_error[] = "error";
/* 键扫描函数 */
unsigned char keyscan() //扫描键盘函数
{
unsigned char key_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)
{
case 0xee:num='1';break;
case 0xde:num='2';break;
case 0xbe:num='3';break;
case 0xed:num='4';break;
case 0xdd:num='5';break;
case 0xbd:num='6';break;
case 0xeb:num='7';break;
case 0xdb:num='8';break;
case 0xbb:num='9';break;
case 0xd7:num='0';break;//按键0
case 0xe7:num='C';break;//按键*
case 0xb7:num='=';break;//按键#
case 0x7e:num='/';break;//按键A
case 0x7d:num='*';break;//按键B
case 0x7b:num='-';break;//按键C
case 0x77:num='+';break;//按键D
}
while(addres!=0xff)
{
P0=0x0f;
key_l=P0;
P0=0xf0;
key_h=P0;
addres=key_l | key_h;
}
return num;
}
}
return 0;
}
void clear_lcd(void) //清屏
{
unsigned char j;
for(j=0;j<16;j++)
{
table1[j]='\0';
table2[j]='\0';
}
}
void main()
{
unsigned char i=0,j;
unsigned char key;
unsigned char flag_operator = 0; //加减乘除标志位
unsigned char flag_equ = 0; //等于标志位
unsigned char flag_key = 0; //运算位标志
bit flag_MaxValue = 0;
bit flag_minus = 0;//负数
long int value = 0; //最终运算结果
unsigned long int value_H =0; //第一个数据
unsigned long int value_L = 0; //第二个数据
unsigned long int temp[]={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<i; 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<flag_operator; 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;
}
else if(table1[flag_operator] == '-')
{
value = value_H - value_L;
}
else if(table1[flag_operator] == '*')
{
value = value_H * value_L;
}
else if(table1[flag_operator] == '/')
{
value = value_H / value_L;
}
if(value == 0)
table2[15] = (value + 48);
else if(value<0)
{
value = abs(value);
flag_minus = 1;
}
else if(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);
}
}。

相关主题