51单片机双显示计算器.docx
《51单片机双显示计算器.docx》由会员分享,可在线阅读,更多相关《51单片机双显示计算器.docx(28页珍藏版)》请在冰豆网上搜索。
![51单片机双显示计算器.docx](https://file1.bdocx.com/fileroot1/2022-11/30/3be70e39-b450-4c33-ab8d-38d5988c9d5b/3be70e39-b450-4c33-ab8d-38d5988c9d5b1.gif)
51单片机双显示计算器
自己制作的单片机程序,既可以用数码管显示,也可以用1602显示
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcodetabledu[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
ucharcodetablewe[4]={4,5,6,7};
uchartable[]="0123456789";
unsignedchardispbuf[4]={0,0,0,0};
ucharaa,temp,key,keypos,flag,fuhao,a0,b0,c0,d0,e0;
longnum1,num2,num3;
sbitRS=P2^5;
sbitRW=P2^6;
sbitE=P2^7;
sbitkey1=P3^4;
voidkeyscan1();
voidukeyscan1();
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidchange(uchar*p,ucharcount)
{
count=4-count;
while(count<3)
{
*(p+count)=*(p+count+1);
count++;
}
}
longjisuan(intx,chary,intz)
{
longm;
if(y==10)m=x+z;
if(y==11)m=x-z;
if(y==12)m=x*z;
if(y==13)m=x/z;
returnm;
}bitBusy(void)
{
bitbusy_flag=0;
RS=0;
RW=1;
E=1;
delay
(1);
busy_flag=(bit)(P0&0x80);
E=0;
returnbusy_flag;
}
voidwcmd(uchardel)
{
while(Busy());
RS=0;RW=0;E=0;
P0=del;
delay
(1);
E=1;
delay
(1);
E=0;
}
voidwdata(uchardel)
{
while(Busy());
RS=1;RW=0;E=0;
P0=del;
delay
(1);
E=1;
delay
(1);
E=0;
}
voidkeyscan()
{
P1=0xfe;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xee:
key=1;
break;
case0xde:
key=2;
break;
case0xbe:
key=3;
break;
case0x7e:
key=4;
break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
if((key>=0)&&(key<11))
{
keypos++;
if(keypos<=4)
{
change(dispbuf,keypos);
dispbuf[3]=key;
}
}
}
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xed:
key=5;
break;
case0xdd:
key=6;
break;
case0xbd:
key=7;
break;
case0x7d:
key=8;
break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
if((key>=0)&&(key<11))
{
keypos++;
if(keypos<=4)
{
change(dispbuf,keypos);
dispbuf[3]=key;
}
}
}
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xeb:
key=9;
break;
case0xdb:
key=0;
break;
case0xbb:
key=10;
break;
case0x7b:
key=11;
break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
if((key>=0)&&(key<10))
{
keypos++;
if(keypos<=4)
{
change(dispbuf,keypos);
dispbuf[3]=key;
}
}
if((key>9)&&(key<14))
{
fuhao=key;
num1=1000*dispbuf[0]+100*dispbuf[1]+10*dispbuf[2]+dispbuf[3];
dispbuf[0]=0;dispbuf[1]=0;dispbuf[2]=0;dispbuf[3]=0;
keypos=0;
while
(1)
{
keyscan1();
if(key==15)break;
}
}
if(key==15)
{
dispbuf[0]=0;dispbuf[1]=0;dispbuf[2]=0;dispbuf[3]=0;
}
}
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xe7:
key=12;
break;
case0xd7:
key=13;
break;
case0xb7:
key=14;
break;
case0x77:
key=15;
break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
if((key>9)&&(key<14))
{
fuhao=key;
num1=1000*dispbuf[0]+100*dispbuf[1]+10*dispbuf[2]+dispbuf[3];
dispbuf[0]=0;dispbuf[1]=0;dispbuf[2]=0;dispbuf[3]=0;
keypos=0;
while
(1)
{
keyscan1();
if(key==15)break;
}
}
if(key==15)
{
dispbuf[0]=0;dispbuf[1]=0;dispbuf[2]=0;dispbuf[3]=0;
}
}
}
if(keypos==4)keypos=0;
}
voidkeyscan1()
{
P1=0xfe;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xee:
key=1;
break;
case0xde:
key=2;
break;
case0xbe:
key=3;
break;
case0x7e:
key=4;
break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
if((key>=0)&&(key<11))
{
keypos++;
if(keypos<=4)
{
change(dispbuf,keypos);
dispbuf[3]=key;
}
}
}
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xed:
key=5;
break;
case0xdd:
key=6;
break;
case0xbd:
key=7;
break;
case0x7d:
key=8;
break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
if((key>=0)&&(key<11))
{
keypos++;
if(keypos<=4)
{
change(dispbuf,keypos);
dispbuf[3]=key;
}
}
}
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xeb:
key=9;
break;
case0xdb:
key=0;
break;
case0xbb:
key=10;
break;
case0x7b:
key=11;
break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
if((key>=0)&&(key<10))
{
keypos++;
if(keypos<=4)
{
change(dispbuf,keypos);
dispbuf[3]=key;
}
}
if((key>9)&&(key<14))
{
num1=num3;
fuhao=key;
dispbuf[0]=0;dispbuf[1]=0;dispbuf[2]=0;dispbuf[3]=0;
keypos=0;
}
}
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xe7:
key=12;
break;
case0xd7:
key=13;
break;
case0xb7:
key=14;
break;
case0x77:
key=15;
break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
if((key>9)&&(key<14))
{
num1=num3;
fuhao=key;
dispbuf[0]=0;dispbuf[1]=0;dispbuf[2]=0;dispbuf[3]=0;
keypos=0;
}
if(key==14)
{
num2=1000*dispbuf[0]+100*dispbuf[1]+10*dispbuf[2]+dispbuf[3];
num3=jisuan(num1,fuhao,num2);
dispbuf[0]=num3/1000;
dispbuf[1]=num3%1000/100;
dispbuf[2]=num3%1000%100/10;
dispbuf[3]=num3%1000%100%10;
}
}
}
if(keypos==4)keypos=0;
}voidukeyscan()
{
P1=0xfe;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xee:
key=1;
break;
case0xde:
key=2;
break;
case0xbe:
key=3;
break;
case0x7e:
key=4;
break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
wdata(table[key]);
num1=num1*10+key;
}
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xed:
key=5;
break;
case0xdd:
key=6;
break;
case0xbd:
key=7;
break;
case0x7d:
key=8;
break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
wdata(table[key]);
num1=num1*10+key;
}
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xeb:
key=9;
break;
case0xdb:
key=0;
break;
case0xbb:
key=10;
break;
case0x7b:
key=11;
break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
if(key==0||key==9)
{
wdata(table[key]);
num1=num1*10+key;
}
if((key>9)&&(key<14))
{
fuhao=key;
if(key==10)key=0x2B;
elseif(key==11)key=0x2d;
elseif(key==12)key=0x2a;
elseif(key==13)key=0x2f;
wdata(key);
while
(1)
{
ukeyscan1();
if(key==15)break;
}
}
if(key==15)
{
wcmd(0x01);wcmd(0x0e);
num1=0;num2=0;num3=0;fuhao=0;
}
}
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xe7:
key=12;
break;
case0xd7:
key=13;
break;
case0xb7:
key=14;
break;
case0x77:
key=15;
break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
if((key>9)&&(key<14))
{
fuhao=key;
if(key==10)key=0x2B;
elseif(key==11)key=0x2d;
elseif(key==12)key=0x2a;
elseif(key==13)key=0x2f;
wdata(key);
while
(1)
{
ukeyscan1();
if(key==15)break;
}
}
if(key==15)
{
wcmd(0x01);wcmd(0x0e);
num1=0;num2=0;num3=0;fuhao=0;
}
}
}
}
voidukeyscan1()
{
P1=0xfe;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xee:
key=1;
break;
case0xde:
key=2;
break;
case0xbe:
key=3;
break;
case0x7e:
key=4;
break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
wdata(table[key]);
num2=num2*10+key;
}
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xed:
key=5;
break;
case0xdd:
key=6;
break;
case0xbd:
key=7;
break;
case0x7d:
key=8;
break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
wdata(table[key]);
num2=num2*10+key;
}
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xeb:
key=9;
break;
case0xdb:
key=0;
break;
case0xbb:
key=10;
break;
case0x7b:
key=11;
break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
if(key==0||key==9)
{
wdata(table[key]);
num2=num2*10+key;
}
if((key>9)&&(key<14))
{
wcmd(0x0e);
wdata(0x01);
num1=num3;
fuhao=key;
if(key==10)key=0x2B;
elseif(key==11)key=0x2d;
elseif(key==12)key=0x2a;
elseif(key==13)key=0x2f;
if(a0!
=0)wdata(table[a0]);
if(b0!
=0)wdata(table[b0]);
else{if(a0!
=0)wdata(table[b0]);}
if(c0!
=0)wdata(table[c0]);
else{if((a0!
=0)||(b0!
=0))wdata(table[c0]);}
if(d0!
=0)wdata(table[d0]);
else{if((a0!
=0)||(b0!
=0)||(c0!
=0