HL单片机简单计算器程序xys.docx

上传人:b****5 文档编号:3656308 上传时间:2022-11-24 格式:DOCX 页数:13 大小:68.30KB
下载 相关 举报
HL单片机简单计算器程序xys.docx_第1页
第1页 / 共13页
HL单片机简单计算器程序xys.docx_第2页
第2页 / 共13页
HL单片机简单计算器程序xys.docx_第3页
第3页 / 共13页
HL单片机简单计算器程序xys.docx_第4页
第4页 / 共13页
HL单片机简单计算器程序xys.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

HL单片机简单计算器程序xys.docx

《HL单片机简单计算器程序xys.docx》由会员分享,可在线阅读,更多相关《HL单片机简单计算器程序xys.docx(13页珍藏版)》请在冰豆网上搜索。

HL单片机简单计算器程序xys.docx

HL单片机简单计算器程序xys

//***********H-L51单片机【简单计算器】程序************//

/*知识运用到:

LED灯,蜂鸣器,LED显示器动静态显示,矩阵键盘输入,定时器*/

 

//*****************************************************************************************************************************************************

#include//【计算器】键盘模式1234【功能;加减乘除基本运算,两位输入四位可

#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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 小升初

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1