HL单片机简单计算器程序xys.docx
- 文档编号:3656308
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:13
- 大小:68.30KB
HL单片机简单计算器程序xys.docx
《HL单片机简单计算器程序xys.docx》由会员分享,可在线阅读,更多相关《HL单片机简单计算器程序xys.docx(13页珍藏版)》请在冰豆网上搜索。
HL单片机简单计算器程序xys
//***********H-L51单片机【简单计算器】程序************//
/*知识运用到:
LED灯,蜂鸣器,LED显示器动静态显示,矩阵键盘输入,定时器*/
//*****************************************************************************************************************************************************
#include
#defineuintunsignedint//5678带一位小数点输出,最大显示:
99*99=9801】
#defineucharunsignedchar//90=
sbitdula=P2^6;//控制数码管段选的锁存器锁存端//+-*/
sbitwela=P2^7;//控制数码管位选的锁存器锁存端
sbitbeep=P2^3;//蜂鸣器接口
ucharnum=0,temp,shu,xshu,ge,shi,bai,qian,d,e,f,g;
longi,j,xiaoshu,aa;//i用于表示输入次数,j表示输入运算符(可用于区分a、b),aa用于定时器
floatzh,a1,a2,b1,b2,a2a1,b2b1,c;//a2a1、b2b1运算等于zh,由于有运算结果小数点输出,故需定义为浮点型
ucharcodetable[]={//编码表table[]={0,1,2,3}
0x3f,0x06,0x5b,0x4f,//4,5,6,7,
0x66,0x6d,0x7d,0x07,//8,9,A,B,
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>0;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];//【十位显示】
dula=1;
dula=0;
P0=0xef;
wela=1;
wela=0;
}
display3(f)
{
P0=table[f];//【百位显示】
dula=1;
dula=0;
P0=0xf7;
wela=1;
wela=0;
}
display(g)//【千位显示】
{
P0=table[g];
dula=1;
dula=0;
P0=0xfb;
wela=1;
wela=0;
}
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);
delay
(2);
display2(ge);
delay
(2);
display2(18);
delay
(2);
display1(xshu);
delay
(2);
}
}//if(shu/100
elseif(shu/10>=1)//(判断有没有十位)
{
shi=shu/10;
ge=shu%10;
while
(1)
{
display3(shi);
delay
(2);
display2(ge);
delay
(2);
display2(18);
delay
(2);
display1(xshu);
delay
(2);
}
}//elseif(shu/10
elseif(shu/1>=1)
{
ge=shu/1;
while
(1)
{
display2(ge);
delay
(2);
display2(18);
delay
(2);
display1(xshu);
delay
(2);
}
}//elseif(shu/1
else
{while
(1){display2(18);delay
(2);display1(xshu);delay
(2);}}
}//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;
while
(1)
{
display(qian);
delay
(2);
display3(bai);
delay
(2);
display2(shi);
delay
(2);
display1(ge);
delay
(2);
}
}//if(qian
elseif(shu/100>=1)//(判断有没有百位)
{
bai=shu/100;
shi=shu%100/10;
ge=shu%100%10;
while
(1)
{
display3(bai);
delay
(2);
display2(shi);
delay
(2);
display1(ge);
delay
(2);
}
}
elseif(shu/10>=1)//(判断有没有十位)
{
shi=shu/10;
ge=shu%10;
while
(1)
{
display2(shi);
delay
(2);
display1(ge);
delay
(2);
}
}
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);
delay(5);
TR0=1;//启动定时器TR0
}
display1(17);
delay(300);
display1(16);
delay(300);
display1(17);
}
//*********************【蜂鸣器鸣灭函数】**********************//
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&0xf0;//把P3口与11110000相与
while(temp!
=0xf0)//当有键按下刚一定不相等,于是进入//下一步检测
{
delay(5);//软件延时去抖动
temp=P3;
temp=temp&0xf0;
switch(temp)//因为我们刚才是将第一行置的低,在这里再判断是第几列
{
case0xe0:
num=1;i++;break;//如果temp=0xee则为第一行和第一列的交叉点,由此我们知道是矩阵键盘上的第一个键被按下,我们给num=1
case0xd0:
num=2;i++;break;
case0xb0:
num=3;i++;break;
case0x70:
num=4;i++;break;
}
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;P1=0xfe;}//如果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;aa=4;display5(b2,b1);TR0=0;P1=0xf8;}//如果j>=1,i=2,表示第二次次输入,赋值给a1-》关计数器-》显示-》开第一个灯
}
}//while(temp!
=0xf0)
P3=0xfd;//●★●给P3.1送低电平,其余为高电平,即11111101,以便检测第二列的四个键盘
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
switch(temp)
{
case0xe0:
num=5;i++;break;//i自加作用为标记第一第二次输入,过程为i=1、2、0、1、2。
。
。
case0xd0:
num=6;i++;break;//**********其实程序中的总流程为,输入a2(输入a1?
),输入运算符号(用j=1234标记),输入b2(在输入b1),运算,输出*****//
case0xb0:
num=7;i++;break;
case0x70:
num=8;i++;break;
}
whbeep();
delay(8);
while(temp!
=0xf0);
if(j==0)
{
if(i==1){a2=num;a2a1=a2;display1(a2a1);P1=0xfe;}//P1=0xfe;
else{a1=num;a2a1=10*a2+a1;aa=4;display5(a2,a1);TR0=0;P1=0xfe;}//
}
else{
if(i==1){b2=num;b2b1=b2;display1(b2b1);P1=0xf8;}
else{b1=num;b2b1=10*b2+b1;aa=4;display5(b2,b1);TR0=0;P1=0xf8;}
}
}//while(temp!
=0xf0)
P3=0xfb;//●★●给P3.2送低电平,其余为高电平,即11111011,以便检测第三列的四个键盘
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
switch(temp)
{
case0xe0:
num=9;i++;break;
case0xd0:
num=0;i++;break;
case0xb0:
num=11;break;
case0x70:
num=12;break;
}
whbeep();
delay(8);
while(temp!
=0xf0);
if(num<=9)//由于9、0为数字输入故用if判断区分开来
{
if(j==0)
{
if(i==1){a2=num;a2a1=a2;display1(a2a1);P1=0xfe;}//P1=0xfe;
else{a1=num;a2a1=10*a2+a1;aa=4;display5(a2,a1);TR0=0;P1=0xfe;}//
}
else{
if(i==1){b2=num;b2b1=b2;display1(b2b1);P1=0xf8;}
else{b1=num;b2b1=10*b2+b1;aa=4;display5(b2,b1);TR0=0;P1=0xf8;}
}
}
elseif(num==12){P1=0xf0;display4(zh);j=0;}//***********【显示计算结果】***********//
}
P3=0xf7;//●★●给P3.3送低电平,其余为高电平,即11110111,以便检测第四列的四个键盘
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
switch(temp)
{
case0xe0:
num=13;i=0;break;
case0xd0:
num=14;i=0;break;
case0xb0:
num=15;i=0;break;
case0x70:
num=16;i=0;break;
}
whbeep();
delay(8);
while(temp!
=0xf0);
if(num==13){j=1;P1=0xfc;}//用j标记输入的运算类型
elseif(num==14){j=2;P1=0xfc;}
elseif(num==15){j=3;P1=0xfc;}
else{j=4;P1=0xfc;}
if(num>=13)display1(num);//运算符显示d,c,e,无显示
}//while(temp!
=0xf0)
if(j>0)
{
switch(j)//当输入b2开始时就计算运算结果,以方便随时输出结果
{
case0:
zh=0;break;
case1:
zh=a2a1+b2b1;break;
case2:
zh=a2a1-b2b1;break;
case3:
zh=a2a1*b2b1;break;
case4:
zh=a2a1/b2b1;break;
}
}//if(i==3)
}//while
(1)
}//void
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- HL 单片机 简单 计算器 程序 xys