基于51单片机1602液晶显示简易计算器设计

时间: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);

write_ …… 此处隐藏:7380字,全部文档内容请下载后查看。喜欢就下载吧 ……

基于51单片机1602液晶显示简易计算器设计.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:7 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:29元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219