1 / 23
文档名称:

基于51单片机的简易计算器.doc

格式:doc   大小:333KB   页数:23
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

基于51单片机的简易计算器.doc

上传人:drp539607 2019/8/14 文件大小:333 KB

下载得到文件列表

基于51单片机的简易计算器.doc

文档介绍

文档介绍:简介用51做的一个建议计算器,能计算7位数*7位数,小数点保留三位,其他不多说,上图和程序,由于时间关系,程序没完全优化,解决了按一次计算符号后再按符号键无效的问题。硬件电路单片机部分+矩阵键盘+1602显示  图3-1所示为简易计算器的电路原理图。P3口用于键盘输入,接4*4矩阵键盘,键值与键盘的对应表如表----所示,p0口和p2口用于显示,p2口用于显示数值的高位,po口用于显示数值的低位。图3-1简易计算器电路原理图PCB键值与功能对应表键值0123456789+-×/=ON/C功能0123456789+-×÷=清零说明矩阵键盘有16个按键,满足对简易计算器的计算实现,显示部分采用LCD1602,第一行显示计算的数值符号,第二行显示计算结果。最大能计算7位数*7位数的值,可以计算负数,小数点结果保留有三位,在每次按下计算符号后,接着只能按下数字,再按下符号键无效,也就是每次计算只能按一个计算符号,如输入错误需按N清零键,或者复位单片机。 #include<>#include<>#defineucharunsignedcharsbitlcden=P2^2;sbitlcdrs=P2^0;sbitlcdrw=P2^1;sbitlcdbf=P0^7;uchartemp,key,i,j,flag,fh,k;longa,b,c;ucharcodetable[]={1,2,3,0, 4,5,6,0, 7,8,9,0, 0,0,0,0};ucharcodetable2[]="123+456-789*000/";voiddelay(ucharms){ ucharx,y; for(x=ms;x>0;x--) for(y=110;y>0;y--);}/*-------------对LCD1602的操作-----------*/bitbusy(void)//判断忙碌{ bitres; lcdrs=0; lcdrw=1; lcden=1; _nop_(); _nop_(); res=lcdbf; lcden=0; returnres;}voidwrite_inst(ucharcmd)//写命令{ while(busy()==1);//忙碌就等待 lcdrs=0; lcdrw=0; lcden=0; _nop_(); _nop_(); P0=cmd; _nop_(); _nop_(); lcden=1; _nop_(); _nop_(); lcden=0;}()//写地址{ |0x80);}voidwrite_date(uchardat)//写数据{ while(busy()==1); lcdrs=1; lcdrw=0; lcden=0; P0=dat; _nop_(); _nop_(); lcden=1; _nop_(); _nop_(); lcden=0;}voidinit() //初始化{ lcden=1; write_inst(0x38);//显示8位2行 delay(5); write_inst(0x0c);//显示开,光标关,不闪烁 delay(5); write_inst(0x06);//增量方式不位移 delay(5); write_inst(0x80);//检测忙碌信号 delay(5); write_inst(0x01);// delay(5);}/*------------键盘扫描-----------*/voidkeyscan()//键盘扫描{ P3=0xfe; if(P3!=0xfe) { delay(20); if(P3!=0xfe) { temp=P3&0xf0; switch(temp) { case0xe0:key=0;break; case0xd0:key=1;break; case0xb0:key=2;break; case0x70:key=3;break; } } while(P3!=0xfe); if(key==0||key==1||key==2) { if(j!=0) { write_inst(0x01); j=0; } if(flag==0) { a=a*10+table[key]; } if(flag==1) { b=b*10+table[key]; } write_date(table2[key]); } else { if(k==0) { flag=1; k=1; fh=1; write_date(table2[key]); } } } P3=0xfd; if(P3!=0xfd) { delay(20); if(P3!=0xfd) { temp=P3&0xf0; switch(temp) { case0xe0:key=4;break; case