基于AT89C51单片机C语言编写的计算器.docx

上传人:b****6 文档编号:4732642 上传时间:2022-12-08 格式:DOCX 页数:10 大小:17.24KB
下载 相关 举报
基于AT89C51单片机C语言编写的计算器.docx_第1页
第1页 / 共10页
基于AT89C51单片机C语言编写的计算器.docx_第2页
第2页 / 共10页
基于AT89C51单片机C语言编写的计算器.docx_第3页
第3页 / 共10页
基于AT89C51单片机C语言编写的计算器.docx_第4页
第4页 / 共10页
基于AT89C51单片机C语言编写的计算器.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

基于AT89C51单片机C语言编写的计算器.docx

《基于AT89C51单片机C语言编写的计算器.docx》由会员分享,可在线阅读,更多相关《基于AT89C51单片机C语言编写的计算器.docx(10页珍藏版)》请在冰豆网上搜索。

基于AT89C51单片机C语言编写的计算器.docx

基于AT89C51单片机C语言编写的计算器

#include

#defineuintunsignedint

#defineucharunsignedchar

sbitdula=P2^6;

sbitwela=P2^7;

sbitkey1=P3^4;

ucharcodetable[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71,0};

ucharnum,temp,num1;

voiddelay(uintz)

{

uintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

ucharkeyscan();

voiddisplay(ucharaa);

voidmain()

{

num=17;

dula=1;

P0=0;

dula=0;

wela=1;

P0=0xc0;

wela=0;

while

(1)

{

display(keyscan());

}

}

voiddisplay(ucharaa)

{

dula=1;

P0=table[aa-1];

dula=0;

}

ucharkeyscan()

{

P3=0xfe;

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0)

{

delay(5);

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0)

{

temp=P3;

switch(temp)

{

case0xee:

num=1;

break;

case0xde:

num=2;

break;

case0xbe:

num=3;

break;

case0x7e:

num=4;

break;

}

while(temp!

=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

}

}

P3=0xfd;

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0)

{

delay(5);

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0)

{

temp=P3;

switch(temp)

{

case0xed:

num=5;

break;

case0xdd:

num=6;

break;

case0xbd:

num=7;

break;

case0x7d:

num=8;

break;

}

while(temp!

=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

}

}

 

P3=0xfb;

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0)

{

delay(5);

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0)

{

temp=P3;

switch(temp)

{

case0xeb:

num=9;

break;

case0xdb:

num=10;

break;

case0xbb:

num=11;

break;

case0x7b:

num=12;

break;

}

while(temp!

=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

}

}

 

P3=0xf7;

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0)

{

delay(5);

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0)

{

temp=P3;

switch(temp)

{

case0xe7:

num=13;

break;

case0xd7:

num=14;

break;

case0xb7:

num=15;

break;

case0x77:

num=16;

break;

}

while(temp!

=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

}

}

returnnum;

}

 

/***************89C51单片机【计算器】C语言程序******************/

/**************** P2位选P0段选时钟12MHZ *********************/

#include /*包含的头文件*/

#defineucharunsignedchar   /*宏定义*/

#defineuintunsignedint

ucharLed[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,

      0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; /*数码管段选*/

longfloatNumber[]={0,0,0,0};     /*数码管显示位控制寄存器*/   

ucharA[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

longintD[]={0,0,0,0,0,0,0,0};   //数码管显示内容寄存器 

ucharcodeC[]={0x0,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};  /*数码管位选*/

        /*列扫描控制LED1位2位3位4位5位6位7位8位*/

uchark=16;    /* 按键对外控制 */

ucharb;  /* 按键【+】【-】【*】【/】对外的控制 */

longfloatOut_put;  /*定义变量【Out_put】作为结果 */

uchare=0;  /* 数字的位存储递进的控制  */ 

ucharg=0;  /* 运算方式的控制变量 */

ucharL=0;  /* 运算方式的控制变量 */

ucharg1=0;  /* 运算方式的控制变量 */

ucharg2=0;  /* 运算方式的控制变量 */

ucharg3=0;  /* 运算方式的控制变量 */

ucharg4=0; /* 运算方式的控制变量 */

charj=-1;  /* 与Number[]数组连用 */

ucharm=0;  /* 按键【=】的控制变量  */

ucharn=0;  /* 按键【.】的控制变量  */

ucharx=0;  /* 小数点个数的记录变量  */

ucharxo=0;  /* 控制开始计数小数点的变量 */

longintresult;

           

voidDelay(uinto)   /*延时函数delay()的定义*/

{

 uinti,j;

 for(i=0;i

 {

  for(j=0;j<121;j++) {;}

 }

}

voidshow(longfloatOut_put)

{ ucharr;

 uchark;

 longintq,p;

 uchars=0;

 uchari;

 longinttemp;

 

 temp=Out_put;

 if( (Out_put-temp)!

=0)  {result=Out_put*10000;r=4;}

 else {result=Out_put; r=0;}

 p=result;  

 if(m==1)

 {

  if(result<0)

  { result=-result; p=result;q=result; for(i=1;i<=8;i++){q=q/10; if(q==0){k=i;i=9;}}P0=0x40;P2=C[8-k];Delay

(1); } //负号的显示

  P0=0x80; P2=C[r]; Delay

(1);P0=0x00;

  result=p;

  P0=Led[result%10];P2=C[8];result=result/10;Delay

(1);

  if((result%10==0)&&(result%100==0)&&(result%1000==0)&&(result%10000==0)&&(result%100000==0)&&(result%1000000==0)) {P0=0x00;}

  else{P0=Led[result%10];P2=C[7];result=result/10;Delay

(1);}

  if((result%10==0)&&(result%100==0)&&(result%1000==0)&&(result%10000==0)&&(result%100000==0)) {P0=0x00;}

  else{P0=Led[result%10];P2=C[6];result=result/10;Delay

(1);}

  if((result%10==0)&&(result%100==0)&&(result%1000==0)&&(result%10000==0)) {P0=0x00;}

  else{P0=Led[result%10];P2=C[5];result=result/10;Delay

(1);}

  if((result%10==0)&&(result%100==0)&&(result%1000==0)) {P0=0x00;}

  else{P0=Led[result%10];P2=C[4];result=result/10;Delay

(1);}

  if((result%10==0)&&(result%100==0)) {P0=0x00;}

  else{P0=Led[result%10];P2=C[3];result=result/10;Delay

(1);}

  if((result%10==0)) {P0=0x00;}

  else{P0=Led[result%10];P2=C[2];result=result/10;Delay

(1);}

  if(result==0) {P0=0x00;}

  else{P0=Led[result%10];P2=C[1];result=result/10;Delay

(1);}

  

 }

}

voidIn_put()  //输入函数输入小数 加小数点 

   uchari;

 if(k>=0&&k<=9)

 switch(e)

 {

  case8:

 D[7]=D[6];A[7]=A[6];      //用来存放数值

  case7:

 D[6]=D[5];A[6]=A[5];

  case6:

 D[5]=D[4];A[5]=A[4];

  case5:

 D[4]=D[3];A[4]=A[3];

  case4:

 D[3]=D[2];A[3]=A[2];

  case3:

 D[2]=D[1];A[2]=A[1];

  case2:

 D[1]=D[0];A[1]=A[0];

  case1:

 if(n==0) {D[0]=k; A[0]=Led[k]; if(xo==1) x++;}

    if(n==1) { A[0]=Led[k]|0x80;xo=1;n=0;} 

 }

 if(k>=11&&k<=15&&b==1)

 {  switch(k)

  {

   case11:

g1++;g++;if(g2==1)L=1;if(g3==1)L=2;if(g4==1)L=3;break; // +

   case12:

g2++;g++;if(g1==1)L=4;if(g3==1)L=5;if(g4==1)L=6;break; // -

   case13:

g3++;g++;if(g1==1)L=7;if(g2==1)L=8;if(g4==1)L=9;break; // *

   case14:

g4++;g++;if(g1==1)L=10;if(g2==1)L=11;if(g3==1)L=12;break; // / 

  }

  

  j++;

  Number[j]=10000000*D[7]+1000000*D[6]+100000*D[5]+10000*D[4]+1000*D[3]+100*D[2]+10*D[1]+D[0];

  for(i=1;i<=x;i++){Number[j]=(float)Number[j]/10;}

  x=0;

  for(i=0;i<=7;i++) //数据存储器清零

   D[i]=0;

  for(i=0;i<=8;i++) //数据显示清零

   {A[i]=0x00;} 

  b=0;e=0;xo=0;

 }

}

voidKey_scan()  //键盘扫描函数 Key_scan()

{

 unsignedcharX,Y,Z;

 P3=0xff;

 P3=0x0f;   //先对P2置数行扫描

 if(P3!

=0x0f)  //判断是否有键按下

 {

  Delay(20);  //延时10ms,软件去干扰

  if(P3!

=0x0f)  //确认按键按下;

  {

   X=P3;   //保存行扫描时有键按下时状态

   P3=0xf0;  //列扫描

   Y=P3;   //保存列扫描时有键按下时状态

   Z=X|Y;   //取出键值

   while(P3!

=0xf0); //按键防止抖动

   switch(Z)  //判断键值(那一个键按下)

   {

    case0xe7:

k=0; e++;In_put();break;  //数字【0】

    case0xd7:

k=1;e++;In_put();break;  //数字【1】

    case0xdb:

k=2; e++;In_put();break;  //数字【2】

    case0xdd:

k=3; e++;In_put();break;  //数字【3】

    case0xb7:

k=4; e++;In_put();break;  //数字【4】

    case0xbb:

k=5; e++;In_put();break;  //数字【5】

    case0xbd:

k=6; e++;In_put();break;  //数字【6】

     case0x77:

k=7; e++;In_put();break;    //数字【7】

    case0x7b:

k=8; e++;In_put();break;  //数字【8】

    case0x7d:

k=9; e++;In_put();break;  //数字【9】

    case0xeb:

n=1;    In_put();break;   //小数点【.】

    case0x7e:

k=11;b=1;In_put();break;    //字符【B+】

    case0xbe:

k=12;b=1;In_put();break;    //字符【C-】

    case0xde:

k=13;b=1;In_put();break;    //字符【D*】

     case0xee:

k=14;b=1;In_put();break;    //字符【E/】

    case0xed:

k=15;m=1;b=1;In_put();break; //字符【F=】

   }

  }

 }

}

voidYun_suan()

{

  if(g1==1&&g==1) Out_put=Number[0]+Number[1];

  if(g2==1&&g==1)Out_put=Number[0]-Number[1];

   if(g3==1&&g==1) Out_put=Number[0]*Number[1];

  if(g4==1&&g==1)Out_put=Number[0]/Number[1];

  if(g1==2&&g==2)Out_put=Number[0]+Number[1]+Number[2];

  if(g2==2&&g==2)Out_put=Number[0]-Number[1]-Number[2];

  if(g3==2&&g==2) Out_put=Number[0]*Number[1]*Number[2];

  if(g4==2&&g==2)Out_put=Number[0]/Number[1]/Number[2];

  if(L==1) Out_put=Number[0]-Number[1]+Number[2];

  if(L==2) Out_put=Number[0]*Number[1]+Number[2];

  if(L==3) Out_put=Number[0]/Number[1]+Number[2];

  if(L==4) Out_put=Number[0]+Number[1]-Number[2];

  if(L==5) Out_put=Number[0]*Number[1]-Number[2];

  if(L==6) Out_put=Number[0]/Number[1]-Number[2];

  if(L==7) Out_put=Number[0]+Number[1]*Number[2];

  if(L==8) Out_put=Number[0]-Number[1]*Number[2];

  if(L==9) Out_put=Number[0]/Number[1]*Number[2];

  if(L==10)Out_put=Number[0]+Number[1]/Number[2];

  if(L==11)Out_put=Number[0]-Number[1]/Number[2];

  if(L==12)Out_put=Number[0]*Number[1]/Number[2]; 

}

voidXian_shi()

{

 if(m!

=1)

 {

  Key_scan();

       /*显示函数 与A[i]有关*/ 

    P0=A[0];P2=C[8];Delay

(1);

  P0=A[1];P2=C[7];Delay

(1);     

  P0=A[2];P2=C[6];Delay

(1);

  P0=A[3];P2=C[5];Delay

(1);

  P0=A[4];P2=C[4];Delay

(1);

  P0=A[5];P2=C[3];Delay

(1);

  P0=A[6];P2=C[2];Delay

(1);

  P0=A[7];P2=C[1];Delay

(1);

  

 }

}

voidmain()

 while

(1)

 {   

  Xian_shi();

  Yun_suan();

  show(Out_put); 

 }  

}

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

当前位置:首页 > 高中教育 > 理化生

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

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