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

📄 caculater.c

📁 这是一用单片机实现的简单计算器
💻 C
字号:
#include "reg51.h"
sbit LED=P3^4;
sbit R1=P1^4;
sbit R2=P1^5;
sbit R3=P1^6;
sbit R4=P1^7;
unsigned char key;
unsigned char keydata;
unsigned char numberstats;
unsigned char operationstats;
unsigned int number,number1,number2;
unsigned char seg[11]={0x09,0x0EB,0x98,0x8A,0x6A,0x0E,0x0C,0x0CB,0x08,0x0A,0xff};//笔形码
unsigned char disp[4];//显示缓冲区

delay(int t)//延时子程序
{int i,j;
 for(i=0;i<t;i++)
    for (j=0;j<5;j++);    
}
ledflsh(int time)//LED闪动的快慢
{int i;
 for(i=0;i<3;i++)
 {LED=0;
  delay(time);
  LED=1;
 }
}
display(unsigned char c)//往串口写字符
{ SCON=0x00;//工作方式0
  SBUF=c;//往缓冲区写字符
  while(TI==0)
  {};//等待TI=1
  TI=0;//清除/TI=0  
}
showtest(int time)//数码管自检
{unsigned char i,j; 
 for(i=0;i<11;i++)//从0到9
 {delay(time);  
  for(j=0;j<4;j++)//四个都显示,写四下
  display(seg[i]);   
 }
 }
void dispshow(unsigned int cdisp) //将要显示的字符分解送到缓冲区
{   disp[0]=seg[cdisp%10];
    disp[1]=seg[cdisp/10%10];
    disp[2]=seg[cdisp/100%10];
    disp[3]=seg[cdisp/1000];
    if(disp[3]==0x09) disp[3]=0xff;//先判断千位,灭0处理
    if(disp[2]==0x09) disp[2]=0xff;//判断百位,灭0处理
    if(disp[1]==0x09) disp[1]=0xff;//判断十位,灭0处理       
    display(disp[0]);
    display(disp[1]);
    display(disp[2]);
    display(disp[3]);
}
getkey()
{   
    unsigned char keytemp;
    R1=0;R2=1;R3=1;R4=1;// 高4位扫描
    keytemp=~(P1)&0x0f;//低位4读取
    switch(keytemp)
    {case 1:delay(100);{if(keytemp==1) keydata=1;return 1;} break;//1键
     case 2:delay(100);{if(keytemp==2)keydata=2;return 1;}break;//2键
     case 4:delay(100);{if(keytemp==4)keydata=3;return 1;}break;//3键
     case 8:delay(100);{if(keytemp==8)keydata=4;return 1;}break;//4键
     default:         break;
    }
     R1=1;R2=0;R3=1;R4=1;// 高4位扫描
     keytemp=~(P1)&0x0f;//低4位读取
     switch(keytemp)
    {case 1:delay(200);{if(keytemp==1)keydata=5;return 1;}break;//5键
     case 2:delay(200);{if(keytemp==2)keydata=6;return 1;}break;//6键
     case 4:delay(200);{if(keytemp==4)keydata=7;return 1;}break;//7键
     case 8:delay(200);{if(keytemp==8)keydata=8;return 1;}break;//8键
     default:         break;
    }
     R1=1;R2=1;R3=0;R4=1;// 高4位扫描
    keytemp=~(P1)&0x0f;//低4位读取
     switch(keytemp)
    {case 1:delay(200);{if(keytemp==1)keydata=9;return 1;}break;//9键做减法用
     case 2:delay(200);{if(keytemp==2)keydata=10;return 1;}break;//10键做加法用
     case 4:delay(200);{if(keytemp==4)keydata=11;return 1;}break;//A键
     case 8:delay(200);{if(keytemp==8)keydata=12;return 1;}break;//B键
     default:         break;
    }
      R1=1;R2=1;R3=1;R4=0;// 高位扫描
    keytemp=~(P1)&0x0f;//低4位读取
     switch(keytemp)
    {case 1:delay(100);{if(keytemp==1)keydata=13;return 1;}break;//C键清0用
     case 2:delay(100);{if(keytemp==2)keydata=14;return 1;}break;//D键做等于用
     case 4:delay(100);{if(keytemp==4)keydata=15;return 1;}break;//E键做除法用
     case 8:delay(100);{if(keytemp==8)keydata=16;return 1;}break;//F键做乘法用
     default:         break;
    }
    R4=1;
   
}
 onnumberkey()
 {  unsigned int n=0; 
    switch(keydata)
   {case 1:n=1;break;
    case 2:n=2;break;
    case 3:n=3;break;
    case 4:n=4;break;
    case 5:n=5;break;
    case 6:n=6;break;
    case 7:n=7;break;
    case 8:n=8;break;
    case 9:n=9;break;
    case 10:n=0;break; 
   }
   if(numberstats==1)//操作数1
   {
    number=number*10+n;
    number1=number;
   
    dispshow(number);
    }
   else//操作数2
   {number=number*10+n;
    number2=number;
    dispshow(number);
   }
   
 }
cal()
{ switch(operationstats)
  {case 1:number=number1+number2;numberstats=1;break;
   case 2:number=number1-number2;numberstats=1;break;
   case 3:number=number1*number2;numberstats=1;break;
   case 4:number=number1/number2;numberstats=1;break;
  }
  dispshow(number);
}
onoperationkey()
{   switch(keydata)
   {case 11:operationstats=1;number=0;numberstats=2;break;//加操作
    case 12:operationstats=2;number=0;numberstats=2;break;//减操作;
    case 13:operationstats=3;number=0;numberstats=2;break;//乘操作*
    case 14:operationstats=4;number=0;numberstats=2;break;//除操作/
    case 15:cal(); break;//等于键计算
    case 16:number1=number=number2=0;dispshow(number);break;//清0
    }
}
main()
{   operationstats=1;//初始化参数
    number=0;   
    ledflsh(1000);//LED闪动的快慢,最后熄灭
    showtest(2500);//数码管自检,最后熄灭  
    for(;;)
    {  if(getkey()==1)
      {
      if((keydata==1)||(keydata==2)||(keydata==3)||(keydata==4)||(keydata==5)||(keydata==6)||(keydata==7)||(keydata==8)||(keydata==9)||(keydata==10))
           { delay(2600); onnumberkey();}  //如果是数字键,实行数字函数  
      else {delay(2600); onoperationkey();}//如果是操作键,操作函数
      }
    } 
}

⌨️ 快捷键说明

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