专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

51单片机100内的加减乘除计算器C语言程序

作者:佚名   来源:本站原创   点击数:  更新时间:2013年11月06日   【字体:
#include <reg52.h>                   //包含文件   
#define uchar unsigned char   
#define uint  unsigned int   

char b[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,   
          0xa1,0x86,0x8e,0x8c,0xc1,0xce,0x91,0x89,0xc7,0xff};    // 共阴极字符码   

//延时函数,用于实现程序中的短暂延时,表示延时cnt个毫秒   
void delay(unsigned int cnt)   
{   
    unsigned char i;   
    while(cnt--)   
    {   
        for(i=220;i>0;i--)   
        ;   
    }   
}   

//键盘扫描程序   
uchar keyboardscan(void)   
{   
      uchar sccode,recode;   
      P1=0xf0;    //P1口附初值   
      if((P1&0xf0)!=0xf0)//如果P1口电平不等于0xf0,表示有按键按下   
      {   
          delay(20);    //延时20毫秒后再判断,看是否还有按键按下,次步为软件防抖   
          if((P1&0xf0)!=0xf0)//继续判断是否有按键按下   
         {   
              sccode=0xfe;  //进行逐行判断   
              while((sccode&0x10)!=0)   
             {   
                  P1=sccode;   
                  if((P1&0xf0)!=0xf0)   
                  {   
                      recode=(P1&0xf0|0x0f);   
                      switch((~sccode)+(~recode))   
                      {   // 下面是键盘的编码识别   
                          case 0x11:    return(1);    break;   
                          case 0x21:  return(2);    break;   
                          case 0x41:    return(3);     break;   
                          case 0x81:    return(11);  break;//返回对应的键值0~15   
                          case 0x12:    return(4);    break;   
                          case 0x22:  return(5);    break;   
                          case 0x42:  return(6);    break;   
                          case 0x82:    return(12);   break;   
                          case 0x14:    return(7);    break;   
                          case 0x24:  return(8);    break;   
                          case 0x44:  return(9);   break;   
                          case 0x84:    return(13);  break;   
                          case 0x18:    return(10);   break;   
                          case 0x28:    return(15);   break;   
                          case 0x48:  return(16);   break;   
                          case 0x88:    return(14);  break;   
                          default:break;   
             }   
            }   
            else   
                sccode = (sccode<<1)|0x01;   
          }   
        }   
      }   
     return(0xff); //如果没有按键按下,则返回0xff   
}   
void output(uchar number)   
{   
P0=b[number/10];   
P2=b[number%10];   
}   
int yunsuan(uchar a,uchar b,uchar c)   
{   
    switch(c)   
    {   
        case 1:return(a/b);break;   
        case 2:return(a*b);break;   
        case 3:return(a-b);break;   
        case 4:return(a+b);break;   
    }   
}   
void main(void)                 //主函数   
{   
    unsigned char n1,n2,key,index,a;   
    n1=n2=index=0;   
    P0=P2=b[0];   
    while(1)   
    {   
        key = keyboardscan();//键盘扫描,看是否有按键按下   
        if(key != 0xff)//如果有按键按下,则key不再是0xff了,显示该按键键值   
        {   
            if(key<10)   
            {   
                if(!index) n1=key%10;   
                else n2=key%10;   
                output(key%10);   
            }   
            else if(key==15)   
            {   
                n1=n2=index=0;   
                output(0);   
            }   
            else if(key==16)   
            {   
                if(!index) output(n1);   
                else   
                {   
                    a=yunsuan(n1,n2,index);   
                    a=a%100;   
                    output(a);   
                    n1=a;   
                    n2=index=0;   
                }   
            }   
            else   
            {         
                if(index==0||n2==0) index=key-10;   
                else   
                {   
                    a=yunsuan(n1,n2,index);   
                    a=a%100;   
                    output(a);   
                    n1=a;   
                    n2=0;   
                    index=key-10;   
                }   
            }   
        }   
    }   
}   
关闭窗口

相关文章