用51单片机实现的计算器

去年刚学1个月左右写的,还很稚嫩,初学者理解下思路水水就行了
 
 
#include<reg52.h>
typedef unsigned int u16;  
typedef unsigned char u8;
#define  led  P1
#define  juzhen  P0
sbit u1=P2^3;
sbit u2=P2^4;
sbit u3=P2^5;
sbit beer=P2^6;
u16 code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
     0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

long int we=0,qian=0,hou=0,ge=16,shi=16,bai=16,qian1=16,wan=16,shiwan=16,baiwan=16,qianwan=16,jia=0,jian=0,
    cheng=0,chu=0,qingling=0,dengyu=0;    
void delay(u16 i)
 {
  while(i--)
  {
   
  } 
  }      
void baibai()
 {
  we=0,qian=0,hou=0,ge=16,shi=16,bai=16,qian1=16,wan=16,shiwan=16,baiwan=16,qianwan=16,jia=0,jian=0,
    cheng=0,chu=0,qingling=0,dengyu=0;    
 }
  void sing()
{      unsigned char a,b,c;
    for(c=18;c>0;c--) 
  {
        for(b=50;b>0;b--) 
     {
            for(a=33;a>0;a--)
       {
               beer=~beer;
              delay(200);
      } 
     }
  }
}
void  display ()
 { 
   int i;
   if(qingling==1)
  baibai();
   for(i=0;i<8;i++)
    { 
      led=0x00;
     switch(i)
    {
   case 0:u1=0;u2=0;u3=0;led=duan[qianwan];delay(100);break;
   case 1:u1=1;u2=0;u3=0;led=duan[baiwan];delay(100);break;
   case 2:u1=0;u2=1;u3=0;led=duan[shiwan];delay(100);break;
   case 3:u1=1;u2=1;u3=0;led=duan[wan];delay(100);break;
   case 4:u1=0;u2=0;u3=1;led=duan[qian1];delay(100);break;
   case 5:u1=1;u2=0;u3=1;led=duan[bai];delay(100);break;
   case 6:u1=0;u2=1;u3=1;led=duan[shi];delay(100);break;
   case 7:u1=1;u2=1;u3=1;led=duan[ge];delay(100);break;    
  }
   
   }
 }
 void input ()
 {
   long int gaibian=20;
   juzhen=0x0f;
   if(juzhen!=0x0f)
   delay(1000);
   if(juzhen!=0x0f)
   {
   switch(juzhen)
   {
    case 0x07:gaibian=0;break;
   case 0x0b:gaibian=1;break;
   case 0x0d:gaibian=2;break;
   case 0x0e:gaibian=3;break;  
   }
   }
     juzhen=0xf0;
   if(juzhen!=0xf0)
   delay(1000);
   if(juzhen!=0xf0)
   {
   switch(juzhen)
   {
    case 0x70:gaibian=gaibian+0;break;
   case 0xb0:gaibian=gaibian+4;break;
   case 0xd0:gaibian=gaibian+8;break;
   case 0xe0:gaibian=gaibian+12;break;  
   } 
   }
   juzhen=0xf0;
   while(1)
   {
     if (juzhen==0xf0)
    {
      break;
    }
  
   }
  
      
    if(gaibian!=20)
  {
   switch(gaibian)
   {
   case 10:qingling=1;break;
   case 11:dengyu=1;break;
   case 12:jia=1;break;
   case 13:jian=1;break;
   case 14:cheng=1;break;
   case 15:chu=1;break;
   default :we=we+1;break;  
   }  
  }
   if(gaibian<10)
   {
   switch(we)
   {
   case 0:ge=16;shi=16;bai=16;qian1=16;wan=16;shiwan=16;baiwan=16;qianwan=16;break;
   case 1:ge=gaibian;shi=16;bai=16;qian1=16;wan=16;shiwan=16;baiwan=16;qianwan=16;qian=qian+gaibian*1;break;
   case 2:shi=gaibian;bai=16;qian1=16;wan=16;shiwan=16;baiwan=16;qianwan=16;qian=qian+gaibian*10;break;
   case 3:bai=gaibian;qian1=16;wan=16;shiwan=16;baiwan=16;qianwan=16;qian=qian+gaibian*100;break;
   case 4:qian1=gaibian;wan=16;shiwan=16;baiwan=16;qianwan=16;qian=qian+gaibian*1000;break;
   case 5:wan=gaibian;shiwan=16;baiwan=16;qianwan=16;qian=qian+gaibian*10000;break;
   case 6:shiwan=gaibian;baiwan=16;qianwan=16;qian=qian+gaibian*100000;break;
   case 7:baiwan=gaibian;qianwan=16;qian=qian+gaibian*1000000;break;
   case 8:qianwan=gaibian;qian=qian+gaibian*10000000;break;  
   }
  }
 }
 void main()
 {
 
   long int pp;
  beer=0;
  while(1)
  {
   display();
 
  if(jia==0&&jian==0&&cheng==0&&chu==0)
  {
   input();
     
   
  }
  else
  {
    hou=qian;
    qian=0;
   we=0,ge=16,shi=16,bai=16,qian1=16,wan=16,shiwan=16,baiwan=16,qianwan=16,qian=0;
       while(dengyu==0)
   {   
   display();
   input();               
   }
   if(jia==1)
   {
           hou=hou+qian;
   }
   if(jian==1)
   {
   
        hou=hou-qian;
   
   }
   if(cheng==1)
   {
   
      hou=hou*qian ;
   
   }
   if(chu==1)
   {     
    if(qian==0)
      {
     hou=0;break;
       }
       hou=hou/qian;      
   } 
    we=0,ge=16,shi=16,bai=16,qian1=16,wan=16,shiwan=16,baiwan=16,qianwan=16;
     pp=hou ;
    while(pp!=0)
    {
      pp=pp/10;
      we=we+1;
    }
    if(we>8)
    {
     sing();
     we=0;
    }
    
    switch(we)
    {
    
      case 0:ge=0;shi=16;bai=16;qian1=16;wan=16;shiwan=16;baiwan=16;qianwan=16;break;
     case 1:ge=hou;shi=16;bai=16;qian1=16;wan=16;shiwan=16;baiwan=16;qianwan=16;break;
      case 2:ge=hou%10;shi=hou/10;bai=16;qian1=16;wan=16;shiwan=16;baiwan=16;qianwan=16;break;
     case 3:ge=hou%10;shi=hou/10%10;bai=hou/100;qian1=16;wan=16;shiwan=16;baiwan=16;qianwan=16;break;
     case 4:ge=hou%10;shi=hou%100/10;bai=hou/100%10;qian1=hou/1000;wan=16;shiwan=16;baiwan=16;qianwan=16;break;
     case 5:ge=hou%10;shi=hou/1000%10;bai=hou/100%10;qian1=hou/1000%10;wan=hou/10000;shiwan=16;baiwan=16;qianwan=16;break;
     case 6:ge=hou%10;shi=hou/10000%10;bai=hou/100%10;qian1=16;wan=hou/1000%10;shiwan=hou/100000;baiwan=16;qianwan=16;break;
     case 7:ge=hou%10;shi=hou/100000%10;bai=hou/100%10;qian1=16;wan=hou/1000%10;shiwan=hou/100000%10;baiwan=hou/1000000;qianwan=16;break;
     case 8:ge=hou%10;shi=hou/1000000%10;bai=hou/100%10;qian1=16;wan=hou/1000%10;shiwan=hou/100000%10;baiwan=hou/1000000%10;qianwan=hou/10000000;break;
    }
   while(1)
   {
    input();
     display();
   }  
  } 
  }
 }
posted @ 2019-12-25 20:28  通信小九  阅读(1744)  评论(0编辑  收藏  举报