基于51单片机1602液晶显示简易计算器设计Word文件下载.docx
- 文档编号:17652989
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:20
- 大小:21.51KB
基于51单片机1602液晶显示简易计算器设计Word文件下载.docx
《基于51单片机1602液晶显示简易计算器设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于51单片机1602液晶显示简易计算器设计Word文件下载.docx(20页珍藏版)》请在冰豆网上搜索。
#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:
write_Dat('
s'
i‘);
n);
Sin=l;
case3:
c);
o'
Cos=l;
case4:
=Key_num)
t);
a);
Tan=l;
case5:
writjDat('
r);
flag=5;
case6:
write_Dat('
7'
num=7;
break;
case7:
write_DatC8'
num二8;
case8:
9*)inum^;
case9:
二Key_num)
+'
flag=l;
case10:
if(last_key_num!
=Key_num)
T);
flag=6;
case11:
write_DatC4’):
num=4;
case12:
write_DatCo)intim^S;
case13:
6'
num二6;
case14:
-'
flag二2;
case15:
if(equal_flag==l)write_com(0x01);
write_com(0x80);
A'
n'
='
);
save_result=result;
else{
if(Key_num!
=l&
&
Key_num!
=2&
=3&
=4&
=22&
=23&
二25)
);
write_DatCn);
if(flag==O)
numl=save_result;
first_num=l;
else
num2=save_result;
second_num=l;
case16:
write_Dat(*V):
num=l;
case17:
2’):
num=2;
case18:
write_Dat(*3’):
num=3;
case19:
write_Ddt('
*'
flag=3;
case21:
num二0;
case22:
辻(flag==O)minusl++;
if(minusl==l)
minus2++;
if(minus2==l)
uTite_Dat-'
}break;
case23:
if(flag==O)
dotl++;
if(dotl==l)
・’);
dot2++;
辻(dot2==l)
uTite_Dat('
case24:
/'
flag二4;
case25:
=Key_num)write_Dat('
equal_flag=l;
if(Key_num!
=l&
=2&
=3&
=4&
=15&
Key_num!
=22&
Key_num匸23&
二25)//第一个数
num1二num1*1O+num;
if(dotl!
=0)
dotl_num++;
first_num=l;
if(flag!
二0)
num2=num2*l0+num;
num=0;
if(dot2!
dot2_num++;
second_num=l;
if(equal_f1ag==l&
first_num==1)
numl=numl/pow(10,dotl_num):
dotl=0;
num2=num2/pow(10,dot2_num);
dot2=0;
if(minusl!
numl=numl*(-l);
if(minus2!
{num2=num2*(-l);
if(second_num!
switch(flag)
result=numl+nuni2:
break;
case2:
result=numl-nuni2:
case3:
result=numl*nuni2;
if(num2!
result=num1/num2;
write_com(0x80+0x40+10);
for(i=0;
i<
5;
i++)
^Tite_Dat(table2[ij);
error=l;
result^powCnuml,num2);
result^powCnuml,l/num2):
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;
utite_Dat(table2[i]);
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;
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;
P0二c;
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&
//第一行
Pl=0xfe;
temp=(P3«
switch(temp)
case0x03de:
key_num=l;
case0x03be:
key_num=2;
caseOxO37e:
key_num=3;
case0x02fe:
key_num=4;
case0x01fe:
key_num=5;
P3=0x03:
//第二行
Pl=0xfd;
temp=(P3<
case0x03dd:
key^um^G;
case0x03bd:
key_num=7;
caseOxO37d:
key_num=8;
case0x02fd:
key_num=9;
case0x01fd:
key_num=10;
//第三行
Pl=0xfb;
case0x03db:
key_num=l1
case0x03bb:
key_num=12
case0x037b:
key_num=13
case0x02fb:
key_num=14
case0x01fb:
key_num=15}
//第四行
Pl=0xf7;
switch(temp)
case
0x03d7:
key_num=16;
0x03b7:
key_num=17;
0x0377:
key_num=18;
0x02f7:
key_num=19;
0x01f7:
key_num=20;
j
Pl=0xef;
//第五行
0x03cf:
key_num=21;
0x03af:
key_num=22;
0x036f:
key_num=23;
0x02ef:
key_num=24;
0x0lef:
key_num=25;
return
key_num;
voiddisplay(doubleData){
ucharxs=0,fs=0,i;
if(Data<
fs=l;
Data=Data*(-1);
if(Data>
(long)Data)
xs=l;
0'
9
10)
if(xs==l)
Data=Data*100;
write_.com(0x80+0x40+11);
辻(fs=l)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((long)Data+,0,);
else辻(Data<
100)//10、99
if(xs=l)
write_Dat
write_Dat((long)Data/1000+,O'
write_Dat((long)Data/100%10+,0’);
write_Dat((long)Data/10%10+,O'
write^Dat((long)Data%10+*0’);
write_com(0x80+0x40+13);
write_Dat((long)Data/10+*0’);
write_Dat((long)Data%10+*O'
辻(xs=l)
write_com(0x80+0x40+9);
writjDat((long)Data/10000+'
write_Dat((long)Data/1000%10+'
O'
write_Dat((long)Data/100%10+,O'
write_Dat((long)Data%10+*0*);
write_com(0x80+0x40+12);
if(fs=l)
write_Dat((1ong)Data/100+,O'
write_Dat((1ong)Data/10%10+,O'
write_Dat((long)Data%10+*O'
10000)7/1000^9999
write_com(0x80+0x40+8);
write^Dat
write_Dat((long)Data/100000+,O'
write^Dat((long)Data/10000%10+,O'
write_Dat((long)Data/1000%10+'
write_Dat((long)Data/100%10+,0*);
write_Dat((long)Data%10+*0,);
write_com(0x80+0x40+11);
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’);
100000)//10000、99999
if(xs~l)
write_com(0x80+0x40+7);
write^Dat((long)Data/1000000^>
0’);
write_Dat((long)Data/100000%10+,0*);
write_Dat((long)Data/10000%10+'
0’);
write.Dat((long)Data/100%10+,O'
write_Dat((long)Data/10%10+,0*);
write_Dat((long)Data%10+*0*);
elseif(xs==0)
」);
write_Dat((long)Data/10000+*O'
write.Dat((long)Data/1000%10+>
write_Dat((long)Data/10%10+,O'
write.Dat((long)Data%10+*O'
1000000)//100000~999999
if(xs==l)
write_com(0x80+0x40+7);
辻(fs==l)
write_Dat(仃ong)Data/10000000+'
write_Dat((long)Data/1000000%10+?
write_Dat((long)Data/100000%10+'
write.Dat((long)Data/100000%10+,0*);
write.Dat((long)Data/100000%10+,O'
write_Dat(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 1602 液晶显示 简易 计算器 设计