HL单片机简单计算器程序xysWord格式.docx
《HL单片机简单计算器程序xysWord格式.docx》由会员分享,可在线阅读,更多相关《HL单片机简单计算器程序xysWord格式.docx(13页珍藏版)》请在冰豆网上搜索。
0x7f,0x6f,0x77,0x7c,//C,D,E,F,无显示,"
_"
"
."
0x39,0x5e,0x79,0x71,0x00,0x08,0x80};
//***********************【延迟函数】************************//
voiddelay(uintz)
{
uintx,y;
for(x=100;
x>
0;
x--)
for(y=z;
y>
y--);
}
//***********************【中断函数】************************//
voidjishu()interrupt1
aa=0;
//***********************【显示函数】************************//
display1(d)//【个位显示】
P0=table[d];
//将第num个显示编码送P0
dula=1;
//一个下降沿将数据锁存
dula=0;
P0=0xdf;
//位选通全部的数码管
wela=1;
wela=0;
display2(e)
P0=table[e];
//【十位显示】
P0=0xef;
display3(f)
P0=table[f];
//【百位显示】
P0=0xf7;
display(g)//【千位显示】
P0=table[g];
P0=0xfb;
display4(shu)//【数显示】//*********************************千百十个四位显示▼▼
xiaoshu=zh*10;
xshu=xiaoshu%10;
if(xshu>
=1)//******************************判断是否存在小数点▼
{
if(shu/100>
=1)//(判断有没有百位)
{
bai=shu/100;
shi=shu%100/10;
ge=shu%100%10;
while
(1)
{
display(bai);
delay
(2);
display3(shi);
display2(ge);
display2(18);
display1(xshu);
}
}//if(shu/100
elseif(shu/10>
=1)//(判断有没有十位)
shi=shu/10;
ge=shu%10;
}//elseif(shu/10
elseif(shu/1>
=1)
ge=shu/1;
}//elseif(shu/1
else
{while
(1){display2(18);
delay
(2);
display1(xshu);
}}
}//if(xshu//******************************判断是否存在小数点▲
else//第一个if对应的else
if(shu/1000>
=1)//(判断有没有千位)
qian=shu/1000;
bai=shu%1000/100;
shi=shu%1000%100/10;
ge=shu%1000%100%10;
display(qian);
display3(bai);
display2(shi);
display1(ge);
}//if(qian
elseif(shu/100>
}
elsedisplay1(shu);
}//else
}//【数显示】//****************************千百十个四位显示▲▲
display5(shi,ge)//【定时】十个位显示,用于防止死循环的动态显示
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536-100000)/256;
//0.5s计数
TL0=(65536-100000)%256;
while(aa)
display2(shi);
delay(5);
display1(ge);
TR0=1;
//启动定时器TR0
}
display1(17);
delay(300);
display1(16);
//*********************【蜂鸣器鸣灭函数】**********************//
voidwhbeep()
while(temp!
=0xf0)//这段程序是检测按键是否被释放
{
temp=P3;
//如果没有释放就一直等待并且
temp=temp&
0xf0;
beep=0;
//蜂鸣器一直响
beep=1;
//释放后关闭蜂鸣器
//************************【主函数】*************************//
//**************【主要通过键盘检测等技术来实现】*************//
voidmain()
{
i=0;
j=0;
display4(0);
while
(1)
P3=0xfe;
//●★●给P3.0送低电平,其余为高电平,即11111110,以便检测第一列的四个键盘
temp=P3;
//把P3口数据读回来
temp=temp&
//把P3口与11110000相与
=0xf0)//当有键按下刚一定不相等,于是进入//下一步检测
//软件延时去抖动
switch(temp)//因为我们刚才是将第一行置的低,在这里再判断是第几列
case0xe0:
num=1;
i++;
break;
//如果temp=0xee则为第一行和第一列的交叉点,由此我们知道是矩阵键盘上的第一个键被按下,我们给num=1
case0xd0:
num=2;
case0xb0:
num=3;
case0x70:
num=4;
whbeep();
//控制蜂鸣器的响
delay(8);
//延时
while(temp!
=0xf0);
//软件松手检测
if(j==0)
if(i==1){a2=num;
a2a1=a2;
display1(a2a1);
P1=0xfe;
}//如果j=0,i=1,表示第一次输入,赋值给a2-》显示-》开第一个灯
else{a1=num;
a2a1=10*a2+a1;
aa=4;
display5(a2,a1);
TR0=0;
}//如果j=0,i=1,表示第二次次输入,赋值给a1-》关计数器-》显示-》开第一个灯
else{
if(i==1){b2=num;
b2b1=b2;
display1(b2b1);
P1=0xf8;
}////如果j>
=1,i=1,表示第一次输入,赋值给a2-》显示-》开第一个灯
else{b1=num;
b2b1=10*b2+b1;
display5(b2,b1);
}//如果j>
=1,i=2,表示第二次次输入,赋值给a1-》关计数器-》显示-》开第一个灯
}//while(temp!
=0xf0)
P3=0xfd;
//●★●给P3.1送低电平,其余为高电平,即11111101,以便检测第二列的四个键盘
switch(temp)
num=5;
//i自加作用为标记第一第二次输入,过程为i=1、2、0、1、2。
。
num=6;
//**********其实程序中的总流程为,输入a2(输入a1?
),输入运算符号(用j=1234标记),输入b2(在输入b1),运算,输出*****//
num=7;
num=8;
}//P1=0xfe;
}//
}
P3=0xfb;
//●★●给P3.2送低电平,其余为高电平,即11111011,以便检测第三列的四个键盘
num=9;
num=0;
num=11;
num=12;
if(num<
=9)//由于9、0为数字输入故用if判断区分开来
{
if(j==0)
{
if(i==1){a2=num;
else{a1=num;
}
else{
if(i==1){b2=num;
else{b1=num;
elseif(num==12){P1=0xf0;
display4(zh);
}//***********【显示计算结果】***********//
P3=0xf7;
//●★●给P3.3送低电平,其余为高电平,即11110111,以便检测第四列的四个键盘
num=13;
num=14;
num=15;
num=16;
if(num==13){j=1;
P1=0xfc;
}//用j标记输入的运算类型
elseif(num==14){j=2;
elseif(num==15){j=3;
else{j=4;
if(num>
=13)display1(num);
//运算符显示d,c,e,无显示
if(j>
0)
switch(j)//当输入b2开始时就计算运算结果,以方便随时输出结果
case0:
zh=0;
break;
case1:
zh=a2a1+b2b1;
case2:
zh=a2a1-b2b1;
case3:
zh=a2a1*b2b1;
case4:
zh=a2a1/b2b1;
}//if(i==3)
}//while
(1)
}//void