基于51单片机1602液晶显示简易计算器设计.docx
- 文档编号:4716540
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:20
- 大小:21.51KB
基于51单片机1602液晶显示简易计算器设计.docx
《基于51单片机1602液晶显示简易计算器设计.docx》由会员分享,可在线阅读,更多相关《基于51单片机1602液晶显示简易计算器设计.docx(20页珍藏版)》请在冰豆网上搜索。
基于51单片机1602液晶显示简易计算器设计
R2
'TRT
LCEd
3•
. 灼 U1 WXTMIO W XT.U2 P2TM, %• •■二的层 ST MT PS” C3 : : 4^- •幵•・/••• AC 6": AIAN »• •fxrm»zvx»rzn*nrSXKH»ZU*MrsAxnrz«Ai«V21iAtS fXDHM> M.V1X& rxairn fixvn ■xvnj »2crri F3“・T new灼 #include #include〈math・h> #defineuintunsignedint #defineucharunsignedchar ^definePI3.141592 sbitRS二P2P; sbitRW二P2°l; sbitEN二P2「2; sbitled=P2^4; sbitspeek=P3*7; uchartableO.j={''Welcometouse"};uchartablelrj={/zmadebyMs.Li"};uchartable2Lj={/zerrorz,}; ucharcount; voidmain(void) { ucharerror=0,i,first=0,dotl,dot2,dotl_num,dot2_num,minusl,minus2;//错误标志、第一次淸屏标志、小数点标志以及小数点个数负号标志、负号个数 ucharSin,Cos,Tan,In; ucharKey_num,]ast_key_num; //键号 ucharflag=0,equal_flag; 〃运算符、等于符 doublenuml^O,num2=0,num^O,result=0,save_result;//第一个数、第二个 数、计算结果 ucharfirst_num二0,Ans二0,second_num=0; InitLcdO; EA二1; ETO二1; TMOD二0X01; THO=(65536-500)/256; TLO=(65536-500)%256; write_com(0x80+0x40+15);write_Dat('O'); write_com(0x80); while(l) { while(key_scan0==0xff); TRO=1; if(first==0) { first=l;write_com(0x01); } Key_num=key_scan0; switch(key_scan0) { case1: if(last_key_num! =Key_num){ uTite_DatC1’);uTite_DatCn‘);ln=l; }break; case2: if(last_key_num! =Key_num){ write_Dat('s');write_Dat('i‘);write_Dat('n);Sin=l; }break; case3: if(last_key_num! =Key_num){ write_Dat('c);write_Dat('o');write_Dat('s');Cos=l; }break; case4: if(last_key_num! =Key_num) { write_Dat('t);write_Dat('a);write_Dat('n); Tan=l; }break; case5: if(last_key_num! =Key_num) { writjDat('r); flag=5; }break; case6: write_Dat('7');num=7;break;case7: write_DatC8');num二8;break;case8: write_Dat('9*)inum^;break;case9: if(last_key_num! 二Key_num) { write_Dat('+'); flag=l; }break; case10: if(last_key_num! =Key_num) { write_Dat('T); flag=6; }break; case11: write_DatC4’): num=4;break;case12: write_DatCo)intim^S;break;case13: write_Dat('6');num二6;break;case14: if(last_key_num! =Key_num) { write_Dat('-'); flag二2; }break; case15: if(last_key_num! =Key_num) if(equal_flag==l)write_com(0x01);write_com(0x80);write_Dat('A');write_Dat('n');write_Dat('s');write_Dat('=');save_result=result; } else{ if(Key_num! =l&&Key_num! =2&&Key_num! =3&&Key_num! =4&&Key_num! =22&&Key_num! =23&&Key_num! 二25) { write_Dat('A');write_DatCn);write_Dat('s');if(flag==O) { numl=save_result;first_num=l; } else { num2=save_result;second_num=l; } } } } break; case16: write_Dat(*V): num=l;break; case17: write_Dat('2’): num=2;break; case18: write_Dat(*3’): num=3;break; case19: if(last_key_num! =Key_num) { write_Ddt('*');flag=3; }break; case21: write_Dat('O');num二0;break; case22: if(last_key_num! =Key_num) 辻(flag==O)minusl++;if(minusl==l) writjDat('-'); } } else { minus2++; if(minus2==l) { uTite_Dat-'); } } }break; case23: if(last_key_num! =Key_num) { if(flag==O) { dotl++; if(dotl==l) { write_Dat('・’); } } else { dot2++; 辻(dot2==l) { uTite_Dat('・’); } } }break; case24: if(last_key_num! =Key_num) { write_Dat('/'); flag二4; }break; case25: if(last_key_num! =Key_num)write_Dat('=');equal_flag=l; }break; } if(Key_num! =l&&Key_num! =2&&Key_num! =3&&Key_num! =4&&Key_num! =15&&Key_num! =22&&Key_num匸23&&Key_num! 二25)//第一个数 { if(flag==O) { num1二num1*1O+num; num二0; if(dotl! =0) { dotl_num++; } first_num=l; } if(flag! 二0) { num2=num2*l0+num; num=0; if(dot2! =0) { dot2_num++; } second_num=l; } } if(equal_f1ag==l&&first_num==1) { if(dotl! =0) { numl=numl/pow(10,dotl_num): dotl=0; } if(dot2! =0) { num2=num2/pow(10,dot2_num); dot2=0; } if(minusl! =0) numl=numl*(-l); } if(minus2! =0) {num2=num2*(-l); } if(second_num! =0) { switch(flag) { case1: result=numl+nuni2: break; case2: result=numl-nuni2: break; case3: result=numl*nuni2;break; case4: if(num2! =0) { result=num1/num2; } else { write_com(0x80+0x40+10); for(i=0;i<5;i++) { ^Tite_Dat(table2[ij); } error=l; }break; case5: result^powCnuml,num2);break; case6: result^powCnuml,l/num2): break; } } elseif(second_num二二0&&Sin=0&&Cos=0&&Tan=0&&ln=0)result=numl; elseif(second_num==0&&(Sin=lCos==lTan==lln==l)){ if(Sin=l) result=sin(numl/180*PI)+0.005; if(Cos==l) result=cos(numl/180*PI)+0.005; 辻(Tan二二1) result=tan(numl/180*PI)+0.005; if(ln==l) if(numl>0) result=log(numl)+0.005;else write_com(0x80+0x40+10);for(i=0;i<5;i++) { utite_Dat(table2[i]); } error=l; } } } if(error! =1) display(result); } if(Key_num==20)//淸零 { numl=num2=result=0; flag=equal_flag=O; error=0;first=0; dotl_num二dot2_num=0; minusl=0;minus2=0; first_num=0,second_num=0; Sin=Cos=Tan=ln=0;write_com(0x01); write_com(0x80+0x40+15);write_Dat('O'); } last_key_num=Key_num; while(key_scan()! =0xff); } } voidtimeOOinterrupt1 { THO=(65536-600)/256; TLO=(65536-600)%256; count++; speek=! speek; if(count>50) TRO二0;count=0; voiddelay(uintx) { uchary; while(x―)for(y=0;y<120;y++); } voidwrite_com(unsignedcharc){ RS二0; RW•二0; EN=1; delay(5); P0二c; EN=0; voidwrite^Dat(unsignedcharc){ RS二1; RW•二0; EN=1; delay(5); P0二c; EN=0; voidInitLcdO { write_com(0x38);//displaymode write_com(0x06);//显示光标移动位置write_com(0x0c);//显示开及光标设置write_com(0x01);//显示淸屏 ucharkey_scan() ucharkey_num=0xff; uinttemp; P3=0x03; Pl=OxeO;temp=(P3<<8)Pl;if((temp&0x03e0)! =0x03e0) delay(10); if((temp&0x03e0)! =0x03e0) P3=0x03;//第一行 Pl=0xfe; temp=(P3«8)Pl; switch(temp) { case0x03de: key_num=l;break; case0x03be: key_num=2;break; caseOxO37e: key_num=3;break; case0x02fe: key_num=4;break; case0x01fe: key_num=5;break; } P3=0x03: //第二行 Pl=0xfd; temp=(P3<<8)Pl; switch(temp) { case0x03dd: key^um^G;break; case0x03bd: key_num=7;break; caseOxO37d: key_num=8;break; case0x02fd: key_num=9;break; case0x01fd: key_num=10;break; } P3=0x03;//第三行 Pl=0xfb; temp=(P3<<8)Pl; break;break;break;break;break; switch(temp) case0x03db: key_num=l1 case0x03bb: key_num=12 case0x037b: key_num=13 case0x02fb: key_num=14 case0x01fb: key_num=15} P3=0x03; //第四行 Pl=0xf7; temp=(P3<<8)Pl;switch(temp) case 0x03d7: key_num=16; break; case 0x03b7: key_num=17; break; case 0x0377: key_num=18; break; case 0x02f7: key_num=19; break; case 0x01f7: key_num=20; break; j P3=0x03; Pl=0xef; //第五行 temp=(P3«8)Pl;switch(temp) case case case case case } 0x03cf: key_num=21; 0x03af: key_num=22; 0x036f: key_num=23; 0x02ef: key_num=24; 0x0lef: key_num=25; break;break;break;break;break; return } key_num; voiddisplay(doubleData){ ucharxs=0,fs=0,i; if(Data<0) { fs=l; Data=Data*(-1); } if(Data>(long)Data) { xs=l; } 0'9 if(Data<10) { if(xs==l) Data=Data*100;write_.com(0x80+0x40+11);辻(fs=l)write_Dat(-); else write_Dat(''); write_Dat((long)Data/100+*0*); write^Dat('・’); write_Dat((long)Data/10%10+,0’); write_Dat((long)Data弔10+'0*); } elseif(xs==0) { write_com(0x80+0x40+14); if(fs=l) write^Dat('-'); else write_Dat(''); write_Dat((long)Data+,0,); } } else辻(Data<100)//10、99 { if(xs=l) { Data=Data*100; write_com(0x80+0x40+10); if(fs=l) write_Dat else write_Dat(''); write_Dat((long)Data/1000+,O'); write_Dat((long)Data/100%10+,0’); write_Dat('・’); write_Dat((long)Data/10%10+,O');write^Dat((long)Data%10+*0’); } elseif(xs==0) { write_com(0x80+0x40+13); if(fs=l) write_Dat else write_Dat(''); write_Dat((long)Data/10+*0’); write_Dat((long)Data%10+*O'); 辻(xs=l) { Data=Data*100; write_com(0x80+0x40+9); if(fs=l) write_Dat else write_Dat(''); writjDat((long)Data/10000+'O');write_Dat((long)Data/1000%10+'O');write_Dat((long)Data/100%10+,O'); write_Dat('・’); write_Dat((long)Data/10%10+,O'); write_Dat((long)Data%10+*0*); } elseif(xs==0) write_com(0x80+0x40+12);if(fs=l) write_Dat else write_Dat(''); write_Dat((1ong)Data/100+,O');write_Dat((1ong)Data/10%10+,O'); write_Dat((long)Data%10+*O'); } else辻(Data<10000)7/1000^9999 if(xs=l) Data=Data*100; write_com(0x80+0x40+8); if(fs=l) write^Dat else write_Dat(''); write_Dat((long)Data/100000+,O'); write^Dat((long)Data/10000%10+,O'); write_Dat((long)Data/1000%10+'O'); write_Dat((long)Data/100%10+,0*); write_Dat('・’); write_Dat((long)Data/10%10+,O'); write_Dat((long)Data%10+*0,); } elseif(xs==0) { write_com(0x80+0x40+11); if(fs=l) write_Dat else write_Dat(''); write.Dat((long)Data/1000+,CT);write.Dat((long)Data/100%10+,0*); write.Dat((long)Data/10%10+,O'); write_Dat((long)Data%10+,0’); } } else辻(Data<100000)//10000、99999 { if(xs~l) { Data=Data*100; write_com(0x80+0x40+7); if(fs=l) write_Dat else write_Dat(''); write^Dat((long)Data/1000000^>0’);write_Dat((long)Data/100000%10+,0*);write_Dat((long)Data/10000%10+'O'); write_Dat((long)Data/1000%10+'0’); write.Dat((long)Data/100%10+,O'); write_Dat('・’); write_Dat((long)Data/10%10+,0*);write_Dat((long)Data%10+*0*); } elseif(xs==0) { write_com(0x80+0x40+10); if(fs=l) write_Dat('」); else write_Dat(''); write_Dat((long)Data/10000+*O');write.Dat((long)Data/1000%10+>O');write_Dat((long)Data/100%10+,O');write_Dat((long)Data/10%10+,O');write.Dat((long)Data%10+*O'); } else辻(Data<1000000)//100000~999999 { if(xs==l) Data=Data*100; write_com(0x80+0x40+7); 辻(fs==l) write_Dat('」); else write_Dat(''); write_Dat(仃ong)Data/10000000+'0’);write_Dat((long)Data/1000000%10+? 0’);write_Dat((long)Data/100000%10+'O');write_Dat((long)Data/10000%10+'0’);write_Dat((long)Data/1000%10+'0’);write_Dat((long)Data/100%10+,O');write_Dat('・’); write.Dat((long)Data/100000%10+,0*);write.Dat((long)Data/100000%10+,O');write_Dat(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 1602 液晶显示 简易 计算器 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)