×
单片机 > 单片机程序设计 > 详情

基于51单片机的计算器 C语言程序

发布时间:2020-05-26 发布时间:
|
 前些日子再博客上转载了一篇计算器的C程序,由于这些日子一直忙于考试,也抽不出时间来重写一下基于C51的计算器,昨晚考完信号处理,回来就着手写,一直弄到凌晨3点多,现面把代码帖出来和大家一起共免,由于时间仓促,代码部分可能还有不足,并且程序只是再我的实验板上调试,如有不足请多多执教,程序时C和汇编混合编程,汇编部分值用到延时的处理,其他代码都用C写的,希望哪为高人能够写出功能更为强大的计算器程序一起分享,对于我的程序,哪位博友增添了更多功能的话,希望发到回复里,以共同进步!
 
程序代码如下:

#include
#define uchar unsigned char
#define uint  unsigned int
bit  NumSem;//前后操作数的互斥信号量
bit  equ;//等号判断
bit  clr;//清零标志
bit  add;//加标志
bit  dec;//减标志
bit  mul;//乘标志
bit  div;//除标志
bit  op;//算术符号标志
uchar  KeyNum;//键值
uint  result;//计算结果
uint  PreNum,LatNum;//计算的两个操作数前操作数,后操作数
uchar  KeyPos;
uchar  DisLed[]={0xC0,0xF9,0xA4,0xB0,0x99,//LED数码七段表
                 0x92,0x82,0xF8,0x80,0x90};
uchar  NumBufe[]={0,0,0,0};
//sbit P10=P1^0;
//sbit P11=P1^1;
//sbit P12=P1^2;
//sbit P13=P1^3;
void  T0Intal(void);//定时器0初始化程序
void DisPlay(void);//显示程序
void ResultNum(void);//计算器运算结果
void Clear(void);//清零程序
void Delay_510(void);//延时510us程序用汇编编写
void ChangeNum(uchar *p,uchar nCount);//NumBufe[]移位程序
void main(void)
{
   T0Intal();
   while(1)
   {
     if(NumSem)
     {
        PreNum=NumBufe[3]*1000+NumBufe[2]*100+NumBufe[1]*10+NumBufe[0];
  NumBufe[4]=0;
     NumSem=0;
     }
  if(op)
  {
    if(PreNum!=0)
    {
       if(NumBufe[4]==0)
    {
     NumSem=1;
    }
          if(equ)
    {
       if(NumBufe[4]!=0)
    {
       LatNum=NumBufe[3]*1000+NumBufe[2]*100+NumBufe[1]*10+NumBufe[0];
    //DisLed[]=0;
    KeyPos=0;
    }
      ResultNum();//计算器结果计算
            //DisPlay();//显示计算结果
    }
   
    }
    else Clear();
 
  }
    if(clr)
 {
   Clear();
    }
 DisPlay();//显示计算结果
   }

}
void  T0Intal(void)
{
   TMOD=0x01;
   TH0=(65536-20000)/256;
   TL0=(65536-20000)%256;
   EA=1;
   ET0=1;
   TR0=1;
}
void DisPlay(void)
{
   //uchar one,two,three,four;
   //one=result/1000;
   P2=DisLed[NumBufe[3]];
   P0=0xFE;
   Delay_510();
   //two=(result-one*1000)/100;
   P2=DisLed[NumBufe[2]];
   P0=0xFD;
   Delay_510();
   //three=(result-one*1000-two*100)/10;
   P2=DisLed[NumBufe[1]];
   P0=0xFB;
   Delay_510();
   //four=(result-one*1000-two*100)%10;
   P2=DisLed[NumBufe[0]];
   P0=0xF7;
   Delay_510();

}
void ResultNum(void)
{
   if(op)
   {
     if(add)
  {
   result=PreNum+LatNum;
  }
     if(dec)
  {
   result=PreNum-LatNum;
  }
  if(mul)
  {
   result=PreNum*LatNum;
  }
  if(div)
  {
   result=PreNum/LatNum;
  }
   }
   //return result;
   //unsigned char
   //uchar one,two,three;
   //one=result/1000;
   NumBufe[3]=result/1000;
   NumBufe[2]=(result-NumBufe[3]*1000)/100;
   //NumBufe[2]=two;
   NumBufe[1]=(result-NumBufe[3]*1000-NumBufe[2]*100)/10;
   //NumBufe[1]=three;
   NumBufe[0]=(result-NumBufe[3]*1000-NumBufe[2]*100)%10;
}
void Clear(void)
{
 // if(Clear)
  //{
     NumBufe[0]=0;
  NumBufe[1]=0;
  NumBufe[2]=0;
  NumBufe[3]=0;
     PreNum=0;
  LatNum=0;
  result=0;
  NumSem=0;
  KeyPos=0;
  clr=0;
  equ=0;
     add=0;
  dec=0;
  mul=0;
  div=0;
  op=0;
 // }
}[page]
void  ChangeNum(uchar *p,uchar nCount)
{
  if(nCount<4)
  {
    uchar ncount;
   ncount=nCount;
   while(ncount>0)
    {
      *(p+nCount)=*(p+nCount-1);
   ncount--;
     }
  }
}
void Delay_510(void)//延时510微秒
{
#pragma asm
 MOV R0,#7DH
 MOV R1,#02H
 TSR1:
 DJNZ R0,TSR1
 MOV R0,#7DH
 DJNZ R1,TSR1
#pragma endasm
}
 
void Time0_Isr_Int(void)  interrupt 1 //定时器0中断服务子程序
{
   TH0=(65536-20000)/256;
   TL0=(65536-20000)%256;
   P1=0xF0;
   if((P1&0xF0)!=0xF0)
   {
      Delay_510();
   if((P1&0xF0)!=0xF0)
   {
      P1=0xFE;
   if((P1&0xF0)==0xE0)//数字键0
   {
      KeyNum=0;
   ChangeNum(NumBufe,KeyPos);
   KeyPos++;
    }
   if((P1&0xF0)==0xD0)
   {
    KeyNum=1;
   ChangeNum(NumBufe,KeyPos);
   KeyPos++;
   }
      if((P1&0xF0)==0xB0)
   {
     KeyNum=2;
     ChangeNum(NumBufe,KeyPos);
     KeyPos++;
  }
   if((P1&0xF0)==0x70)
   {
    KeyNum=3;
    ChangeNum(NumBufe,KeyPos);
   KeyPos++;
   }
   P1=0xFD;
   if((P1&0xF0)==0xE0)
   {
    KeyNum=4;
   ChangeNum(NumBufe,KeyPos);
   KeyPos++;
   }
   if((P1&0xF0)==0xD0)
   {
      KeyNum=5;
      ChangeNum(NumBufe,KeyPos);
   KeyPos++;
   }
      if((P1&0xF0)==0xB0)
   {
    KeyNum=6;
    ChangeNum(NumBufe,KeyPos);
   KeyPos++;
   }
   if((P1&0xF0)==0x70)
   {
    KeyNum=7;
    ChangeNum(NumBufe,KeyPos);
   KeyPos++;
   }
   P1=0xFB;
   if((P1&0xF0)==0xE0)
   {
    KeyNum=8;
    ChangeNum(NumBufe,KeyPos);
   KeyPos++;
   }
   if((P1&0xF0)==0xD0)
   {
    KeyNum=9;
    ChangeNum(NumBufe,KeyPos);
   KeyPos++;
   }
      if((P1&0xF0)==0xB0)//加法
   {
    op=1;
    add=1;
   }
   if((P1&0xF0)==0x70)
   {
    op=1;
    dec=1;
   }
   P1=0xF7;
   if((P1&0xF0)==0xE0)
   {
    op=1;
    mul=1;
   }
   if((P1&0xF0)==0xD0)
   {
    op=1;
    div=1;
   }
      if((P1&0xF0)==0xB0)//等号
   {
    equ=1;
   }
   if((P1&0xF0)==0x70)//清零
   {
    clr=1;
   }
   }
   }
}


关键字:51单片机  计算器  C语言程序 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机中高阻态的实质及意义