基于51单片机1602液晶显示简易计算器设计
时间:2025-06-21
时间:2025-06-21
#include<reg52.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
#define PI 3.141592
sbit RS = P2^0;
sbit RW = P2^1;
sbit EN = P2^2;
sbit led=P2^4;
sbit speek=P3^7;
uchar table0[]={"Welcome to use"};
uchar table1[]={"made by Ms. Li"};
uchar table2[]={"error"};
uchar count;
void main(void)
{
uchar error=0,i,first=0,dot1,dot2,dot1_num,dot2_num,minus1,minus2;//错误标志、第一次清屏标志、小数点标志以及小数点个数 负号标志、负号个数 uchar Sin,Cos,Tan,ln;
uchar Key_num,last_key_num; //键号
uchar flag=0,equal_flag; //运算符、等于符
double num1=0,num2=0,num=0,result=0,save_result; //第一个数、第二个数、计算结果
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 1: if(last_key_num!=Key_num) { write_Dat('l'); write_Dat('n'); ln=1; }break; case 2: if(last_key_num!=Key_num) { write_Dat('s'); write_Dat('i'); write_Dat('n'); Sin=1; }break; case 3: if(last_key_num!=Key_num) { write_Dat('c'); write_Dat('o'); write_Dat('s'); Cos=1;
case 4: if(last_key_num!=Key_num) { write_Dat('t'); write_Dat('a'); write_Dat('n'); Tan=1; }break; case 5: if(last_key_num!=Key_num) { write_Dat('^'); flag=5; }break; 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('T'); flag=6; }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) { if(equal_flag==1) {
write_com(0x01);
write_com(0x80);
write_Dat('A');
write_Dat('n');
write_Dat('s');
write_Dat('=');
save_result=result;
}
else
{
if(Key_num!=1&&Key_num!=2&&Key_num!=3&&Key_num!=4&&Key_num!=22&&Key_num!=23&&Key_num!=25)
{
write_Dat('A');write_Dat('n');write_Dat('s'); if(flag==0)
{
num1=save_result;
first_num=1;
}
else
{
num2=save_result;
second_num=1;
}
}
}
}
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; } } else if(second_num==0&&Sin==0&&Cos==0&&Tan==0&&ln==0) result=num1; else if(second_num==0&&(Sin==1||Cos==1||Tan==1||ln==1)) { if(Sin==1) result=sin(num1/180*PI)+0.005; if(Cos==1) result=cos(num1/180*PI)+0.005; if(Tan==1) result=tan(num1/180*PI)+0.005; if(ln==1)
{
if(num1>0)
result=log(num1)+0.005; else
{
write_com(0x80+0x40+10); for(i=0;i<5;i++) {
write_Dat(table2[i]); }
error=1;
}
}
}
if(error!=1)
display(result);
}
if(Key_num==20) //清零
{
num1=num2=result=0;
flag=equal_flag=0;
error=0;first=0;
dot1_num=dot2_num=0;
minus1=0;minus2=0;
first_num=0,second_num=0;
Sin=Cos=Tan=ln=0;
write_com(0x01);
write_com(0x80+0x40+15);
下一篇:东南亚各国民俗文化教学大纲