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

📄 源程序.c

📁 利用51系列单片机来设计四则运算计算器
💻 C
字号:
#include <math.h>
#include <stdio.h>
#include <AT89X52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar keyscan(void);
void delay(uint time);
void display(void);
float getnum(void);
float getnum_c(void);
float add(float a,float b);
float sub(float a,float b);
float mul(float a,float b);
float div(float a,float b);
void init(void);

uchar key_num[8];
uchar set_count;//置数的次数 按下+,-,*,/前为置a的数,按下后为置b的数
uchar bit_i;//置数的位数
float num_a,num_b,num_c;//参与运算的数
uchar sig_a,sig_b,sig_c;//数的符号
uchar cal_sig;//运算符号
uchar dot;
//-----------------------------------------------------------------
main()
{
 uchar key_value,num=0;
 unsigned long num_l,temp;
 sig_a=0;
 num_a=0;
 cal_sig=0;
 init();//初始化
 while(1)
      {
       key_value=keyscan();
       switch(key_value)
	         {
			  case 1:if(key_num[bit_i]==9)key_num[bit_i]=0;
                     else key_num[bit_i]++;
                     break;        //加 1
			  case 2:if(key_num[bit_i]==0)key_num[bit_i]=9;
                     else key_num[bit_i]--;
                     break;        //减 1
			  case 3:if(bit_i<5){bit_i++;key_num[bit_i]=0;}break;        //>>右移一位
			  case 4:if(bit_i<5){bit_i++;key_num[bit_i]=0;}break;        //<<左移一位
			  case 5:num_a=getnum();
			         if((bit_i==5&&key_num[1]>=6&&key_num[2]>=5&&key_num[3]>=5&&key_num[4]>=3&&key_num[5]>=7)||(bit_i==5&&key_num[1]>=7))
			            {key_num[1]=14;
			             key_num[2]=19;
			             key_num[3]=19;
		   	             key_num[4]=0;
			             key_num[5]=19;}
			         else init();
			              set_count=1;
			              cal_sig=1;
			              key_num[7]=10;
			              break;        //加 + 运算
			  case 6:num_a=getnum();
			         if((bit_i==5&&key_num[1]>=6&&key_num[2]>=5&&key_num[3]>=5&&key_num[4]>=3&&key_num[5]>=7)||(bit_i==5&&key_num[1]>=7))
			             {key_num[1]=14;
			              key_num[2]=19;
			              key_num[3]=19;
			              key_num[4]=0;
			              key_num[5]=19;}
			         else init();
			              set_count=1;
			              cal_sig=2;
			              key_num[7]=11;
			              break;        //减 - 运算
			  case 7:num_a=getnum();
			         if((bit_i==5&&key_num[1]>=6&&key_num[2]>=5&&key_num[3]>=5&&key_num[4]>=3&&key_num[5]>=7)||(bit_i==5&&key_num[1]>=7))
			            {key_num[1]=14;
			             key_num[2]=19;
			             key_num[3]=19;
			             key_num[4]=0;
			             key_num[5]=19;}
			         else init();
			              set_count=1;
			              cal_sig=3;
			              key_num[7]=12;
			              break;        //乘 x 运算
			  case 8:num_a=getnum();
			         if((bit_i==5&&key_num[1]>=6&&key_num[2]>=5&&key_num[3]>=5&&key_num[4]>=3&&key_num[5]>=7)||(bit_i==5&&key_num[1]>=7))
			            {key_num[1]=14;
			             key_num[2]=19;
			             key_num[3]=19;
			             key_num[4]=0;
			             key_num[5]=19;}
			         else init();
			              set_count=1;
			              cal_sig=4;
			              key_num[7]=13;
			              break;        //除 / 运算
			  case 9:if(set_count==0)
			           if(sig_a==0)
			             {sig_a=1;
			             key_num[0]=18;}
			             else {sig_a=0;
			                   key_num[0]=17;}// 设置数a的符号
					       if(set_count==1)
					          if(sig_b==0)
					            {sig_b=1;
					             key_num[0]=18;}
					             else {sig_b=0;
					                   key_num[0]=17;}// 设置数b的符号
					                   break;        //+/- 符号位
			  case 10:dot=bit_i;break;       //。小数点
			  case 11:break;                        //
			  case 12:if(bit_i>1)
			            {key_num[bit_i]=17;
			             bit_i--;
			             if(dot>bit_i)
			                dot=bit_i;
			            }
			          if(bit_i==1)dot=0;
					  break;      //backspace 退格
			  case 13:break;                  //= 等于
			  case 14:num_b=getnum();
			          if((bit_i==5&&key_num[1]>=6&&key_num[2]>=5&&key_num[3]>=5&&key_num[4]>=3&&key_num[5]>=7)||(bit_i==5&&key_num[1]>=7))
			             {key_num[1]=14;
			              key_num[2]=19;
			              key_num[3]=19;
			              key_num[4]=0;
			              key_num[5]=19;}
					  else{num_c=getnum_c();
					       if(sig_c==0)
					          key_num[0]=17;
					       else key_num[0]=18;
					            set_count=0;      //num_c=num_a;
                                if(num_b==0&&cal_sig==4||num_c>999999)
                                  {key_num[1]=14;
                                   key_num[2]=19;
                                   key_num[3]=19;
                                   key_num[4]=0;
                                   key_num[5]=19;}
                                else 
					                if(num_c>=0&&num_c<=99999)
					                  {if(num_c>=0)
						                 {temp=num_c/10000;
						                  if(temp!=0)key_num[1]=temp;
							              else key_num[1]=17;
							                   num_l=num_c;
							                   num_l=num_l%10000;
							                   temp=num_l/1000;
							                   if(temp!=0)key_num[2]=temp;
							                   else 
							                      {if(key_num[1]==17)key_num[2]=17;
							                   	   else key_num[2]=0;}//else
							                   temp=num_l%1000;
							                   num_l=temp;
						 	                   temp=temp/100;
							                   if(temp!=0)key_num[3]=temp;
							                   else 
							                      {if(key_num[1]==17&&key_num[2]==17)key_num[3]=17;
								                   else key_num[3]=0;}//else 
                                               temp=num_l%100;
                                               num_l=temp;
							                   temp=temp/10;
							                   if(temp!=0)key_num[4]=temp;
							                   else 
							                      {if(key_num[1]==17&&key_num[2]==17&&key_num[3]==17)
							                          key_num[4]=17;
								                   else key_num[4]=0;}//else
							                   temp=num_l%10;
                                               key_num[5]=temp;
						                  }//if
						               }//if			   					    
					 	        if(num_c>99999)
						          {temp=num_c/100000;
						           if(temp!=0)key_num[1]=temp;
						           else key_num[1]=17;
							            num_l=num_c;
							            num_l=num_l%100000;
							            temp=num_l/10000;
							       if(temp!=0)key_num[2]=temp;
							       else 
							          {if(key_num[1]==17)key_num[2]=17;
								      else key_num[2]=0;}//else
							          temp=num_l%10000;
							          num_l=temp;
							          temp=temp/1000;
							          if(temp!=0)key_num[3]=temp;
							          else 
							             {if(key_num[1]==17&&key_num[2]==17)key_num[3]=17;
								          else key_num[3]=0;}//else 
                                          temp=num_l%1000;
                                          num_l=temp;
							              temp=temp/100;
							              if(temp!=0)key_num[4]=temp;
							              else 
							                 {if(key_num[1]==17&&key_num[2]==17&&key_num[3]==17)key_num[4]=17;
								              else key_num[4]=0;}//else
							                  temp=num_l%100;
                                              num_l=temp;
							                  temp=temp/10;
							                  if(temp!=0)key_num[5]=temp;
							                  else 
							                     {if(key_num[1]==17&&key_num[2]==17&&key_num[3]==17&&key_num[4]==17)
                                                     key_num[5]=17;
								                  else key_num[5]=0;}//else
							                      temp=num_l%10;
                                                  key_num[6]=temp;
						                         }//if	
					                         }//else
					                      break;            //= 等于
			  case 15:break;                        //
			  case 16:init(); 
			          sig_a=0;
			          num_a=0;
			          cal_sig=0;
			          break;     //C 清零
			  default:break;
			  }//switch
		display();
       }//while
 }//main


⌨️ 快捷键说明

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