⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jisuanqi.c

📁 包含源程序以及电路图的单片机计算器.rar
💻 C
字号:
#include <reg51.h>
#define uint  long
#define uchar  long

uchar zixing[10]={0x3f,0x06,0x5b,0x4f,0x66,
				  0x6d,0x7d,0x07,0x7f,0x6f};
  				  											
  uint op=0;//用来存储+、-、*、/操作符 
  uint preop=20;
  uint first=0;//第一次键入的数值
  uint second=0;//第二次键入的数值
  uint result=0;//最终运算结果
  uchar key=16;
  uchar biaoji=0;
uchar kbscan(void);	 //声明键盘扫描程序
void display(uint temp);   //声明显示程序
void yunsuan(void);		//声明运算程序
void dlms(void);	//声明延时程序

					 
////////主程序////////////
void main(void)
{
  uchar i,j=0;
  P0=0x00;	 //LED灯全灭
  P1=0X00;
  P2=0X00;
//   P3=0xf0;
	while(1)
	{	key=kbscan();
	    dlms();
	if(key>=10&&key<=13)	  //如果KEY在10到13之间,证明键盘按下的是操作符键
	{
	  op=key;
	  yunsuan();
	  key=16;
	}
	if(key>=0&&key<=9)		//如果KEY在0到9之间,证明键盘按下的是数值
	   {
			if(op==0)
			{
			if(second<100000)
			{  
			second=second*10+key;
			} 
			 display(second);
				key=16;
			}
			dlms();
	   }
	
	if(key==14)			   //如果KEY位14时,证明键盘按下的是C/ON键
	{
	  display(0);
	  P2=0x20;
 	P1=0x3f;
	  first=0;			  //清0,回复初始状态
	  second=0;
	  op=0;
	  result=0;
	  preop=20;
	  key=16;
	}
	if(key==15)			  //如果KEY位为15时,证明键盘按下的是=键
	{
	op=key;
	 yunsuan();
//	  display(result);//显示结果
	  dlms();
//	  first=0;			  //清0,回复初始状态
	  second=0;
	  op=0;
	  preop=55;
	  key=16;
	}
for(i=0;i<2000;i++){};
   }
}

//////////四则运算////////
void yunsuan(void)
{
  if(op!=0)//&&second!=0
  switch(preop)
  {
  case 10:
          result=first+second;
		  first=result;
		  display(result);
		  preop=op;
		  op=0;
		  second=0;
		  break;
  case 11:
          result=first-second;
		  first=result;
		  display(result);
		  preop=op;
		  op=0;
		  second=0;
		  break;
  case 12:
         result=first*second;
		 first=result;
		 display(result);
		 preop=op;
		 op=0;
		 second=0;
		 break;
  case 13:
         result=first/second;
		 first=result;
		 display(result);
		 preop=op;
		 op=0;
		 second=0;
		 break;
  case 20:
  	preop=op;
          first=second;
		  second=0;
		  op=0;
		  break;
	default:
		preop=op;
		second=0;
		op=0;
		break;
  }
}

/////////延时程序/////////
void dlms(void)		
{
  uchar i;
  for(i=0;i<250;i++){}
}

///////键盘扫描程序////////
uchar kbscan(void)
{
  uchar sccode,recode,a,n;
  P3=0xf0;
  if((P3&0xf0)!=0xf0)			 
  {
     dlms();
	 if((P3&0xf0)!=0xf0)
	 {
	   sccode=0xfe;
	   while((sccode&0x10)!=0)
	   {
	      P3=sccode;
		  if((P3&0xf0)!=0xf0)
		  {
		     recode=P3&0xf0;
			 sccode=sccode&0x0f;
			 a=sccode+recode;
			 if(a==0xde)n=0;	   //键码对应的数值
			 if(a==0xed)n=1;
			 if(a==0xdd)n=2;
			 if(a==0xbd)n=3;
			 if(a==0xeb)n=4;
			 if(a==0xdb)n=5;
			 if(a==0xbb)n=6;
			 if(a==0xe7)n=7;
			 if(a==0xd7)n=8;
			 if(a==0xb7)n=9;

			 if(a==0x7e)n=10;    //键码对应的操作符
			 if(a==0x7d)n=11;
			 if(a==0x7b)n=12;
			 if(a==0x77)n=13;
             if(a==0xee)n=14;	
			 if(a==0xbe)n=15;
return(n);
		  }
		  else
		  sccode=(sccode<<1)|0x01;
	   }
	 }
  }
  return(16);
}

///////显示程序////////
void display(uint temp)
{
  uint buf1,buf2,r,k,i;
  k=temp;
    r=0x20;
	P2=0x20;
	buf1=k/100000;
	if(buf1>=10||k<-99999)		 //最高位大于10,显示错误
	{
	 P2=0x01;
	 r=0x01;
	P1=0x79;
	r=(r<<1);
	P2=r;
	P1=0X3f;
	r=(r<<1);
	P2=r;
	P1=0X3f;
	r=(r<<1);
	P2=r;
	P1=0X3f;
	r=(r<<1);
	P2=r;
	P1=0x06;
	}
	else if(k<0&&k>=-99999)
	{
	P1=0x00;
	P2=0xff;
	  P2=0x01;
	  P1=0x40;
	  P2=0x20;
	  k=-k;
	  while(k>0)
	  	{
	  buf2=k%10;
	  P1=zixing[buf2];
	  for(i=0;i<200;i++){};
	  k=k/10;
	  r=(r>>1);
	  P2=r;
	  P1=0x00;
	  	}
	}
	else
	{
		P1=0x00;
		P2=0xff;
		P2=0x20;
		while(k>0)		//由个位开始显示数值
		{
			buf2=k%10;
			P1=zixing[buf2];
			for(i=0;i<200;i++){};
			k=k/10;
			r=(r>>1);
			P2=r;
			P1=0x00;
		}	
    }
   
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -