基于51单片机的简易计算器C程序_无边落木_百度空间

/***********************************************
**摘 要: 简单计算器的实现
**作者:shirl
**实现说明:
1:变量flag_fuhao为键入+、-、*、/运算符标志
(即当前一个键值为+、-、*、/运算符时,flag_fuhao为1,
其他键值则flag_fuhao置零,其用在显示时)
2:变量flag_shu数输入情况,flag_shu为0时,输入的符号无效;
flag_shu为2时,变量fuhao更新为新键值
**完成日期:2010年4月18日
*********************************************/
#include <reg52.H>
#define uchar unsigned char
#define uint unsigned int
#define duan P0//数码管显示段选定义
#define wei P2//数码管显示位选定义
#define key P3//键盘接口定义
sbit OFF   = P1^0;//关机键定义
unsigned long int shu1,shu2;//进行运算的两个变量数
uchar num;////键盘扫描返回值
char flag1,flag_shu,flag_fuhao,fuhao,newkey,update;
//flag1开机标志 newkey新按键标志,fuhao运算符,update表示等于号
//之后紧接着输入的是数的话则清零shu1
char key_shu;//按键值
unsigned char code Wela[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
//六位数码管的位选
unsigned char code Duan[]={0x3f,0x06,0x5b,
//          0    1    2
0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
// 3   4    5     6   7    8     9 无显示   共阴极数码管

uchar keyscan();//键盘扫描函数
void display(unsigned long int );//数码管显示函数
void delay(uint i)//延时函数
{
while(i--);
}

/***********************************************
      主函数
************************************************/
void main()
{
flag1=0;//标志关机
while(1)
{
  
   if(keyscan()==15)//开机检测
    {
    flag1=1;//标志开机
    shu1=shu2=fuhao=flag_shu=newkey=0;//初始化变量
    while(flag1)
     {
      if(!flag_fuhao)display(shu1);
      else display(shu2);

      key_shu=keyscan();
      if(newkey==1)//有新键值
      {
       if(key_shu==15)//按下ON/C键,清零
       { flag_fuhao=0;update=0;
        shu1=shu2=fuhao=flag_shu=newkey=0;
       }
       else if(key_shu==14&&flag_shu==1&&fuhao)//按下"="
       {
        switch(fuhao)
        {
        case 10:shu1=shu2+shu1;break;
        case 11:shu1=shu2-shu1;break;
        case 12:shu1=shu2*shu1;break;
        case 13:shu1=shu2/shu1;break;
        }
        fuhao=0;flag_fuhao=0;update=1;
       }
       else if((key_shu>=0)&&(key_shu<=9))//按下数字键
       { flag_fuhao=0;
        if(update)shu1=0;
        if(shu1<100000)
        {shu1=key_shu+shu1*10;flag_shu=1;}
        update=0;
       }
       else if((key_shu>=10)&&(key_shu<=13))//按下运算符
        {
         flag_fuhao=1;update=0;
         if(flag_shu==1)
          {
           if(fuhao==0)
            {
             shu2=shu1;shu1=0;
             fuhao=key_shu;flag_shu=2;
            }
           else
            {
             switch(fuhao)
             {
             case 10:shu2=shu2+shu1;break;
             case 11:shu2=shu2-shu1;break;
             case 12:shu2=shu2*shu1;break;
             case 13:shu2=shu2/shu1;break;
             }
             shu1=0;fuhao=key_shu;
            }
          }
         else if(flag_shu==2)
          fuhao=key_shu;
        }

      newkey=0;
      }
      
     }
    }
}
}

///////////////键盘扫描/////////////////
uchar keyscan()
{


//////   1
key=0xfe;
if(key!=0xfe)
{
   delay(500);
   if(key!=0xfe)
   {
    switch(key)
    {
     case 0xee:num=7 ;break;
     case 0xde:num=8 ;break;
     case 0xbe:num=9 ;break;
     case 0x7e:num=13;break; //"/"
    }
    newkey=1;
    delay(500);
    while(key!=0xfe)
     {
      if(flag1)
       if(!shu1&&num>=0&&num<=9)
        display(num);
       else
        display(shu1);
     }
    return num;  
   }
}
//////   1


////// 2

key=0xfd;
if(key!=0xfd)
{
   delay(500);
   if(key!=0xfd)
   {
    switch(key)
    {
     case 0xed:num=4 ;break;
     case 0xdd:num=5 ;break;
     case 0xbd:num=6 ;break;
     case 0x7d:num=12;break; //*
    }
    newkey=1;
    delay(500);
    while(key!=0xfd)
     {
      if(flag1)
       if(!shu1&&num>=0&&num<=9)
        display(num);
       else
        display(shu1);
     }
    return num ;  
   }
}
////// 2


////// 3


key=0xfb;
if(key!=0xfb)
{
   delay(500);
   if(key!=0xfb)
   {
    switch(key)
    {
     case 0xeb:num=1 ;break;
     case 0xdb:num=2;break;
     case 0xbb:num=3;break;
     case 0x7b:num=11;break; //-
    }
    newkey=1;
    delay(500);
    while(key!=0xfb)
     {
      if(flag1)
       if(!shu1&&num>=0&&num<=9)
        display(num);
       else
        display(shu1);
     }
    return num ;  
   }
}
////// 3


////// 4
key=0xf7;
if(key!=0xf7)
{
   delay(500);
   if(key!=0xf7)
   {
    switch(key)
    {
     case 0xe7:num=15;break;// ON/C
     case 0xd7:num=0;break;
     case 0xb7:num=14;break;// =
     case 0x77:num=10;break;// +
    }
    newkey=1;
    delay(500);
    while(key!=0xf7)
     {
      if(flag1)
       if(!shu1&&num>=0&&num<=9)
        display(num);
       else
        display(shu1);
     }
    return num ;  
   }
}
////// 4
if(!OFF)
   {
   delay(500);
   if(!OFF)
    {flag1=0;}
   }
return 100;

}

//////////////////显示函数////////////////
void display(unsigned long int dis_shu)
{
uchar dis_flag,dis_aa;
uchar dis_data[6]={0,0,0,0,0,0};

if(dis_shu>99999) dis_flag=6;
else if(dis_shu>9999) dis_flag=5;
else if(dis_shu>999) dis_flag=4;
else if(dis_shu>99) dis_flag=3;
else if(dis_shu>9) dis_flag=2;
else dis_flag=1;


for(dis_aa=0;dis_aa<dis_flag;dis_aa++)
   {  
    dis_data[dis_aa]=dis_shu%10;
    dis_shu=dis_shu/10;
   }
//数码管段选


for(dis_aa=0;dis_aa<dis_flag;dis_aa++)
   {  
    duan=Duan[dis_data[dis_aa]];
    wei=Wela[dis_aa];
    delay(100);
    wei=0xff;
   }
//数码管位选

}



郑重声明:资讯 【基于51单片机的简易计算器C程序_无边落木_百度空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——