基于51单片机的lcd 1602液晶显示的计算器.docx
《基于51单片机的lcd 1602液晶显示的计算器.docx》由会员分享,可在线阅读,更多相关《基于51单片机的lcd 1602液晶显示的计算器.docx(18页珍藏版)》请在冰点文库上搜索。
![基于51单片机的lcd 1602液晶显示的计算器.docx](https://file1.bingdoc.com/fileroot1/2023-5/20/a42c750c-dd89-4b85-80a4-f0100f235867/a42c750c-dd89-4b85-80a4-f0100f2358671.gif)
基于51单片机的lcd1602液晶显示的计算器
基于51单片机的lcd1602液晶显示的计算器
/****************************************************************
阿斌独家制作:
计算器,1602液晶显示
可计算10以下数加减乘除
可连续运算,最大显示结果数值65536
*****************************************************************/
键盘设置:
液晶初始显示:
运算显示:
主程序:
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitlcden=P2^2;
sbitlcdrw=P2^1;
sbitlcdrs=P2^0;
ucharnum,temp,jia=0,jian=0,cheng=0,chu=0,qing=0;
uintkey,key1,shu;
ucharfuhao,flag1,flag=0;
uchartable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x0};
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
bitlcd_bz()
{
bitresult;
lcdrs=0;
lcdrw=1;
lcden=1;
_nop_();
_nop_();
_nop_();
_nop_();
result=(bit)(P0&0x80);
lcden=0;
returnresult;
}
voidwrite_com(ucharcom)
{
while(lcd_bz());
lcdrs=0;
lcden=0;
lcdrw=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_date(uchardate)
{
while(lcd_bz());
lcdrs=1;
lcden=0;
lcdrw=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidlcd_init()
{
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
voidkeyscan()
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xee:
key=1;num=0;break;
case0xde:
key=2;num=0;break;
case0xbe:
key=3;num=0;break;
case0x7e:
num=1;break;//加号
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xed:
key=4;num=0;break;
case0xdd:
key=5;num=0;break;
case0xbd:
key=6;num=0;break;
case0x7d:
num=2;break;//减号
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xeb:
key=7;num=0;break;
case0xdb:
key=8;num=0;break;
case0xbb:
key=9;num=0;break;
case0x7b:
num=3;break;//乘号
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xe7:
key=0;num=0;break;
case0xd7:
num=6;break;//清除
case0xb7:
num=5;break;//等于号
case0x77:
num=4;break;//除号
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
}
voiddisplay0(uintshu)
{
uintge;
ge=shu;
write_date(0x30+ge);
}
voiddisplay1(uintshu)
{
uintshi,ge;
shi=shu/10;
ge=shu%10;
write_date(0x30+shi);
write_date(0x30+ge);
}
voiddisplay2(uintshu)
{
uintbai,shi,ge;
bai=shu/100;
shi=shu%100/10;
ge=shu%10;
write_date(0x30+bai);
write_date(0x30+shi);
write_date(0x30+ge);
}
voiddisplay3(uintshu)
{
uintqian,bai,shi,ge;
qian=shu/1000;
bai=shu%1000/100;
shi=shu%100/10;
ge=shu%10;
write_date(0x30+qian);
write_date(0x30+bai);
write_date(0x30+shi);
write_date(0x30+ge);
}
voiddisplay4(uintshu)
{
uintwan,qian,bai,shi,ge;
wan=shu/10000;
qian=shu%10000/1000;
bai=shu%1000/100;
shi=shu%100/10;
ge=shu%10;
write_date(0x30+wan);
write_date(0x30+qian);
write_date(0x30+bai);
write_date(0x30+shi);
write_date(0x30+ge);
}
voiddisplay_key1(uintresult)
{
if(flag1==1)
{
write_com(0x01);
flag1=0;
}
shu=result;
write_com(0x80);
if(result<10)
display0(result);
if(result>=10&&result<100)
display1(result);
if(result>=100&&result<1000)
display2(result);
if(result>=1000&&result<10000)
display3(result);
if(result>=10000)
display4(result);
}
voiddis_key(result)
{
if(result<10)
display0(result);
if(result>=10&&result<100)
display1(result);
if(result>=100&&result<1000)
display2(result);
if(result>=1000&&result<10000)
display3(result);
if(result>=10000)
display4(result);
}
voiddisplay_key(uintresult)
{
if(shu<10)
{
write_com(0x80+2);
dis_key(result);
}
if(shu>=10&&shu<100)
{
write_com(0x80+3);
dis_key(result);
}
if(shu>=100&&shu<1000)
{
write_com(0x80+4);
dis_key(result);
}
if(shu>=1000&&shu<10000)
{
write_com(0x80+5);
dis_key(result);
}
if(shu>=10000)
{
write_com(0x80+6);
dis_key(result);
}
}
voiddisplay_fuhao()
{
switch(fuhao)
{
case1:
write_date(0x2b);break;
case2:
write_date(0x2d);break;
case3:
write_date(0x2a);break;
case4:
write_date(0x2f);break;
}
fuhao=0;
}
voidfuhao_pan()
{
if(flag1==1)
{
flag1=0;
write_com(0x01);
write_com(0x80+1);
display_fuhao();
}
if(shu<10)
write_com(0x80+1);
if(shu>=10&&shu<100)
write_com(0x80+2);
if(shu>=100&&shu<1000)
write_com(0x80+3);
if(shu>=1000&&shu<10000)
write_com(0x80+4);
if(shu>=10000)
write_com(0x80+5);
display_fuhao();
flag=1;
}
voidfuhao_deng()
{
write_com(0x80+0x40);
write_date(0x3d);
flag1=1;
flag=0;
}
voiddisplay_result(uintresult)
{
write_com(0x80+0x40+1);
if(result<10)
display0(result);
if(result>=10&&result<100)
display1(result);
if(result>=100&&result<1000)
display2(result);
if(result>=1000&&result<10000)
display3(result);
if(result>=10000)
display4(result);
}
voidjia1()
{
jia=1;
jian=cheng=chu=qing=0;
key1=key;
fuhao=1;
fuhao_pan();
}
voidjian1()
{
jian=1;
jia=cheng=chu=qing=0;
key1=key;
fuhao=2;
fuhao_pan();
}
voidcheng1()
{
cheng=1;
jia=jian=chu=qing=0;
key1=key;
fuhao=3;
fuhao_pan();
}
voidchu1()
{
chu=1;
jia=jian=cheng=qing=0;
key1=key;
fuhao=4;
fuhao_pan();
}
voidqing1()
{
qing=1;
jia=jian=cheng=chu=0;
key1=key=0;
}
voiddeng1()
{
if(jia)
key=key1+key;
if(jian)
key=key1-key;
if(cheng)
key=key1*key;
if(chu)
key=key1/key;
fuhao_deng();
display_result(key);
jia=jian=cheng=chu=qing=0;
}
voiddeal()
{
switch(num)
{
case0:
{
switch(flag)
{
case0:
display_key1(key);break;
case1:
display_key(key);break;
}
}break;
case1:
jia1();break;
case2:
jian1();break;
case3:
cheng1();break;
case4:
chu1();break;
case5:
deng1();break;
case6:
qing1();break;
}
}
voidmain()
{
lcd_init();
while
(1)
{
keyscan();
deal();
}
}