四位简易计算器精确到一位小数点.docx
- 文档编号:6719835
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:13
- 大小:16.26KB
四位简易计算器精确到一位小数点.docx
《四位简易计算器精确到一位小数点.docx》由会员分享,可在线阅读,更多相关《四位简易计算器精确到一位小数点.docx(13页珍藏版)》请在冰点文库上搜索。
四位简易计算器精确到一位小数点
/****************************四位简易计算器(精确到一位小数点)********************************************
P0接4*4键盘的8个针脚
P1接共阴数码管a-h对应P1^0-P1^7
P3接S1-S8对应P3^0-P3^7
**************************************************************************************/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitP0_4=P0^4;
sbitP0_5=P0^5;
sbitP0_6=P0^6;
sbitP0_7=P0^7;
sbitdin=P1^7;
//0123456789-
ucharcodedisplay[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
uchardataweima[]={0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff};
uchardatashu[4]={0,0,0,0};
uchardatak,key,i=0,temp,re=0;
intdatakey1,key2,x=0,y=0,sh;
intdataresult;
//*******************************延迟函数1ms*************************************
voiddelay(void)
{
uintn,m;
for(m=0;m<1;m)
for(n=0;n<110;n);
}
//********************************输入小数点*******************************************
voidxiaoshu(void)
{
if(re!
=0)
{
for(re=0;re<4;re)
shu[re]=0;
re=0;
i=0;
x=0;
y=0;
key1=0;
key2=0;
weima[0]=0xf7;
weima[1]=0xf7;
weima[2]=0xfb;
weima[3]=0xfd;
weima[4]=0xfe;
weima[5]=0xff;
weima[6]=0xff;
weima[7]=0xff;
}
else
{
x=i;
y;
}
}
//*********************************数码显示***********************************
voidscan(void)
{
intk;
for(k=0;k<4;k)
{
P1=display[shu[k]];
P3=weima[k4];
if((x!
=0)&&(k==x-1))
din=1;
delay();
P3=0xff;
}
}
//*****************************按键识别*********************************
voidanjian(void)
{
//----------扫描第1行-------------------
P0=0xff;
P0_4=0;
temp=P0;
temp=temp&0x0f;
if(temp!
=0x0f)
{
delay();//防抖动
temp=P0;
temp=temp&0x0f;
if(temp!
=0x0f)
{
switch(temp)
{
case0x07:
key=1;i;break;//“1“
case0x0b:
key=2;i;break;//“2“
case0x0d:
key=3;i;break;//“3“
case0x0e:
key=10;break;//““
}
}
temp=P0;
temp=temp&0x0f;
while(temp!
=0x0f)//松键判断
{
temp=P0;
temp=temp&0x0f;
}
}
//----------扫描第2行-------------------
P0=0xff;
P0_5=0;
temp=P0;
temp=temp&0x0f;
if(temp!
=0x0f)
{
delay();
temp=P0;
temp=temp&0x0f;
if(temp!
=0x0f)
{
switch(temp)
{
case0x07:
key=4;i;break;//“4“
case0x0b:
key=5;i;break;//“5“
case0x0d:
key=6;i;break;//“6“
case0x0e:
key=11;break;//“-“
}
}
temp=P0;
temp=temp&0x0f;
while(temp!
=0x0f)
{
temp=P0;
temp=temp&0x0f;
}
}
//----------扫描第3行-------------------
P0=0xff;
P0_6=0;
temp=P0;
temp=temp&0x0f;
if(temp!
=0x0f)
{
delay();
temp=P0;
temp=temp&0x0f;
if(temp!
=0x0f)
{
switch(temp)
{
case0x07:
key=7;i;break;//“7“
case0x0b:
key=8;i;break;//“8“
case0x0d:
key=9;i;break;//“9“
case0x0e:
key=12;break;//“*“
}
P1=display[key];
}
temp=P0;
temp=temp&0x0f;
while(temp!
=0x0f)
{
temp=P0;
temp=temp&0x0f;
}
}
//----------扫描第4行-------------------
P0=0xff;
P0_7=0;
temp=P0;
temp=temp&0x0f;
if(temp!
=0x0f)
{
delay();
temp=P0;
temp=temp&0x0f;
if(temp!
=0x0f)
{
switch(temp)
{
case0x07:
key=15;break;//复位
case0x0b:
key=0;i;break;//“0“
case0x0d:
key=14;break;//“=“
case0x0e:
key=13;break;//“/“
}
}
temp=P0;
temp=temp&0x0f;
while(temp!
=0x0f)
{
temp=P0;
temp=temp&0x0f;
}
}
}
//********************存数*********************************************
//存储输入的数字
voidcun(void)
{
ucharh;
if(i!
=1)
for(h=7;h>0;h--)
weima[h]=weima[h-1];
shu[i-1]=key;
//************
if(i==1)
sh=key;
else
sh=sh*10key;
//**************
key=20;
}
//********************运算**********************************************
//存储键入的运算符号,存储输入的值
voidsuan(void)
{
key1=sh;
sh=1;
//*****************************
if(x!
=0)
{
uinta;
a=pow(10,i-x-1);
key1=key1/a;
}
elsekey1*=10;
//******************************
k=key;
for(i=0;i<4;i)
shu[i]=0;
weima[0]=0xf7;
weima[1]=0xf7;
weima[2]=0xfb;
weima[3]=0xfd;
weima[4]=0xfe;
weima[5]=0xff;
weima[6]=0xff;
weima[7]=0xff;
i=0;
key=20;
x=0;
}
//********************计算结果******************************************
voidresu(void)
{
ucharm=0;
re;
key2=sh;
//********************************
if(x!
=0)
{
uinta;
y;
a=pow(10,i-x-1);
key2=key2/a;
}
elsekey2*=10;
//*************有小数点*********************
if(y!
=0)
{
if(k==10)result=key1key2;
if(k==11)result=key1-key2;
if(k==12)result=(key1*key2)/10;
if(k==13)result=10*key1/key2;
if(result>9999)
{
x=0;
result/=10;
}
elsex=3;
}
//*************没有小数点*********************
else
{
if(k==10)result=(key1key2)/10;
if(k==11)result=(key1-key2)/10;
if(k==12)result=(key1*key2)/100;
if(k==13)result=key1/key2;
x=0;
}
//************负值情况*****************
if(result<0)
{
result=0-result;
m=1;
}
shu[0]=result/1000;//千位
shu[1]=result/100;//百位
shu[2]=result0/10;//十位
shu[3]=result;//个位
i=4;
//**************正数显示***************
if(m!
=1)
{
if((x==0)&&(shu[0]==0))
{
shu[0]=10;
if(shu[1]==0)
{
shu[1]=10;
if(shu[2]==0)
shu[2]=10;
}
}
elseif(shu[0]==0)
{
shu[0]=10;
if(shu[1]==0)
shu[1]=10;
}
}
//***********负值显示****************
else
{
if(x==0)
{
if((shu[0]==0)&&(shu[1]==0)&&(shu[2]==0))
{
shu[0]=10;
shu[1]=10;
shu[2]=12;
}
elseif((shu[0]==0)&&(shu[1]==0))
{
shu[0]=10;
shu[1]=12;
}
elseif(shu[0]==0)
shu[0]=11;
}
else
{
if((shu[0]==0)&&(shu[1]==0))
{
shu[0]=10;
shu[1]=12;
}
elseif(shu[0]==0)
shu[0]=11;
}
}
//******************************************
key=20;
weima[4]=0xf7;
weima[5]=0xfb;
weima[6]=0xfd;
weima[7]=0xfe;
}
//***********************主函数*****************************************
voidmain()
{
while
(1)
{
scan();
anjian();
//-------计算结果-----
if(key==14)
resu();
//------小数点------
elseif(key==15)
xiaoshu();
//------运算符--------
elseif((key<14)&&(key>9))
suan();
//-------输入数字----------
elseif((key<10)&&(key>-1))
{
if(i<5)cun();
elsei=4;
}
}
}
//**********************************************************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简易 计算器 精确 一位 小数点