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

📄 calculate1.1.c

📁 实现数码管输入显示器输出功能(加减乘除运算)
💻 C
字号:
#include "2410addr.h"
#include "7279.h"
Main(void)
{
  unsigned char number=0;
  unsigned char temp1=0;
  unsigned char temp2=0;
  unsigned char temp3=0;
  unsigned char temp4=0;
  unsigned char temp5=0;
  unsigned char sign,mark=0;
  int i,k,k1=1,k2;
  Init7279();
  while(1)  //无限循环  
  {  
    while(1)
    {
      while(1)  //轮询等待键盘输入
      {
        if(key==1)
        {
          number=read7279(CMD_READ);
          break;  //当有键输入时跳出循环
        }
      }
      switch(number)
      {
	 case 0x03: number= 0; break;
	 case 0x0b: number= 1; break;
	 case 0x13: number= 2; break;
	 case 0x1b: number= 3; break;
	 case 0x04: number= 4; break;
	 case 0x0c: number= 5; break;
	 case 0x14: number= 6; break;
	 case 0x1c: number= 7; break;
	 case 0x05: number= 8; break;
	 case 0x0d: number= 9; break;
	 case 0x15: number= 10; break;
	 case 0x1d: number= 11; break;
	 case 0x06: number= 12; break;
	 case 0x0e: number= 13; break;
	 case 0x16: number= 14; break;
	 case 0x1e: number= 15; break;
	 default: number= 0xff; break;
      }
      if(number==10) //键A作加号
      {
         sign=0;  //标记加号
         mark=1;  //表示曾经按过运算符号键+ - * /
         temp2=temp4;  //将第一次输入数据如 被加数 被减数等保存到temp2
         continue;  //重新开始循环等待输入加数,减数等
      }
      if(number==11)
      {  
         sign=1;
         mark=1;
         temp2=temp4;
         continue;
      }
      if(number==12)
      {
         sign=2;
         mark=1;
         temp2=temp4;
         continue;
      }
      if(number==13)
      {
         sign=3;
         mark=1;
         temp2=temp4;
         continue;
      }
      if(number<10)  //当有输入数据时
      {  
         if(mark=1)  //如果此前输入过运算符
         {  
            temp1=0;
            temp4=0;
            write7279(UNDECODE,0x00);
            write7279(RTL_UNCYL,1);  //将先前LED显示的被加数,被减数等清零
            k2=k1;  //将被加数,被减数等的位数存入k2
            k1=1;
            mark=0;  //恢复没有输入过运算符的状态
         }
         if(temp4!=0)  //如果输入的数据超过一位
         {  
            write7279(RTL_UNCYL,1);  //将先前输入的一位数向高位移动
            k1++;  //记录输入数据的位数
         }
         temp1=number;  //将当前输入的一位数据暂存入temp1
         temp4=temp4*10+temp1;  //将到目前为止输入的几位数据暂存入temp4
         break;
      }
      else break;
    }
    if(number==14) //键E作等号
    {
       mark=1;
       switch(sign)
       {
          case 0:
              {  
                 temp1=temp2+temp4;  //结果保存到temp1
                 temp5=temp1;
                 k=((k2>=k1)?(k2+1),(k1+1));  //根据加数和被加数的位数判断结果可能的位数
                 while(k>1)  //只要结果的位数超过一位就进入循环
                 {
                    for(i=9;i>=0;i--)  //判断结果的最高位数据 
                    {
                      if(temp1>=e((k-1)*ln10)*i)  //e((k-1)*ln10)即10的k-1次方
                      {  
                        temp3=i;  //记录结果最高位数字
                        write7279(DECODE0+(k-1),temp3);  //显示最高位
                        temp1=temp1-e((k-1)*ln10)*i;                        
                        k--;  
                        break;  //跳出FOR循环,重新进入WHILE循环准备判断次高位
                      }
                    }
                 }                                              
              }
              break;
          case 1:
              {  
                 temp1=temp2-temp4;
                 temp5=temp1;
                 k=k2;
                 while(k>1)
                 {
                    for(i=9;i>=0;i--)
                    {
                      if(temp1>=e((k-1)*ln10)*i)
                      {  
                        temp3=i;
                        write7279(DECODE0+(k-1),temp3);
                        temp1=temp1-e((k-1)*ln10)*i;                        
                        k--;
                        break;
                      }
                    }
                 }                                              
              }
              break;
          case 2:
              {  
                 temp1=temp2*temp4;
                 temp5=temp1;
                 k=k1+k2;
                 while(k>1)
                 {
                    for(i=9;i>=0;i--)
                    {
                      if(temp1>=e((k-1)*ln10)*i)
                      {  
                        temp3=i;
                        write7279(DECODE0+(k-1),temp3);
                        temp1=temp1-e((k-1)*ln10)*i;                        
                        k--;
                        break;
                      }
                    }
                 }                                              
              }
              break;
          case 3:
              {  
                 temp1=temp2/temp4;
                 temp5=temp1;
                 k=k2-k1;
                 while(k>1)
                 {
                    for(i=9;i>=0;i--)
                    {
                      if(temp1>=e((k-1)*ln10)*i)
                      {  
                        temp3=i;
                        write7279(DECODE0+(k-1),temp3);
                        temp1=temp1-e((k-1)*ln10)*i;                        
                        k--;
                        break;
                      }
                    }
                 }                                              
              }
              break;
          default:break;
       }
       temp4=temp5;  //为下面继续输入数据或运算符保存此时的计算结果
       k1=k;
       temp2=0;
       sign=0;
       k=0;  //按过等号后,相关数据清零
    }
    if(number==15) //键F清零
    {   
       write7279(UNDECODE,0x00);
       write7279(RTL_UNCYL,1);
       temp1=temp2=temp3=temp4=0;
       k1=1;
    }
    write7279(DECODE0,temp1);
  }
}

⌨️ 快捷键说明

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