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

📄 calculator.c

📁 我做的畢業設計,用AT89S51 控制LCD1602作為顯示. DS1302時鐘芯片顯示時間,DS18B20測量溫度,還有4X4的鍵盤驅動.實現了一個計算功能.可以用PROTUES 仿真軟件仿真,當時
💻 C
📖 第 1 页 / 共 2 页
字号:
								 else
								  {
								    Display_Ram[0]=' ';Display_Ram[1]=' ';
								  }
							  }
							  else
							  {
                                Display_Ram[0]=' ';Display_Ram[1]=' ';Display_Ram[2]=' ';
							  }
						    }
						  else
						   {
						     Display_Ram[0]=' ';Display_Ram[1]=' ';Display_Ram[2]=' ';Display_Ram[3]=' ';
						   }
					   }
		           else{
				         Display_Ram[0]=' ';Display_Ram[1]=' ';Display_Ram[2]=' ';Display_Ram[3]=' ';Display_Ram[4]='0';

				       }
					  p_Display_Ram=Display_Ram;           //指向显示缓冲单元
					  LCD_disp_string(11,1,p_Display_Ram);
					 }
                  }// end if Flag_operand_B_NoEmpty
			   }//end  else   if lag_operator_FristTime
           }// end if Flag_operand_A_NoEmpty
         break;
default:  if(Bit_Number==0&&Key_temp==0)                 //如果是数字键按下,而且是第一次0按键按下 清零
            {
             //clear 
			 Clear_All_Flag_Init();
             /* operator=operator_Emputy;                  //运算符初始化
		      Flag_operand_B_NoEmpty=0;                  //操作数B 为空
		      Flag_operand_A_NoEmpty=0;                  //操作数A 为空
              Flag_operator_FristTime=0;                 //无运算符按下
		      Flag_Number_FristTime=0;                   //无操作数按下
		      operand_A[0]=0;operand_A[1]=0;operand_A[2]=0;operand_A[3]=0;operand_A[4]=0;
              operand_B[0]=0;operand_B[1]=0;operand_B[2]=0;operand_B[3]=0;operand_B[4]=0;
		      Bit_Number=0;   */                           //位计数清零
			 //display(); clear line 2
			 p_string_code=string_clear_line2;           //清屏 全部写入空格 
			 LCD_disp_string(0,1,p_string_code);
			 LCD_write_char(15,1,'0');                   // clear 清零

			} 
		  else{                                          //如果是数字键按下 
             if(Flag_Number_FristTime==0)                //如果是第一次的操作数
               {  
                if(Bit_Number<5)                         //如果按下的操作数位数小于等于 5
                  {  
                   //operand_A[Bit_Number++]=Key_temp;
                   switch(Bit_Number)                   //根据位数处理按键 
                      {
                        case 0: operand_A[0]=Key_temp;break;
                        case 1: operand_A[1]=operand_A[0];operand_A[0]=Key_temp;break;
                        case 2: operand_A[2]=operand_A[1];operand_A[1]=operand_A[0];operand_A[0]=Key_temp;break;
						case 3: operand_A[3]=operand_A[2];operand_A[2]=operand_A[1];operand_A[1]=operand_A[0];operand_A[0]=Key_temp;break;
						case 4: operand_A[4]=operand_A[3];operand_A[3]=operand_A[2];operand_A[2]=operand_A[1];operand_A[1]=operand_A[0];operand_A[0]=Key_temp;break;
                        default: Bit_Number=0;     
                      }
				   Bit_Number++;                        //位计数加1
                   Frist=operand_A[0]+operand_A[1]*10+operand_A[2]*100+operand_A[3]*1000+operand_A[4]*10000;
                                                        //运算
				   if(operand_A[4]>=6)
				    {
                     The_Number_Too_Large();
					}
				   else
				    {
				   Flag_operand_A_NoEmpty=1;            //操作数A 不为空   
                   Flag_operator_FristTime=1;           //没有运算符按下 
				   //display(); clear line 2
				   p_string_code=string_clear_line2;    //清空LCD
				   LCD_disp_string(0,1,p_string_code);
			       if(Frist>0)
                    { Display_Ram[4]=(Frist%10)+0x30;
					     if(Frist>=10)
						   {
						     Display_Ram[3]=(Frist%100)/10+0x30;
							 if(Frist>=100)
							  {
							    Display_Ram[2]=(Frist%1000)/100+0x30;
								if(Frist>=1000)
								  {
								    Display_Ram[1]=(Frist%10000)/1000+0x30;
									if(Frist>=10000)
									  {
                                         Display_Ram[0]=(Frist/10000)+0x30;
									  }
									else
									  {
									   Display_Ram[0]=' ';
									  }
								  }
								 else
								  {
								    Display_Ram[0]=' ';Display_Ram[1]=' ';
								  }
							  }
							  else
							  {
                                Display_Ram[0]=' ';Display_Ram[1]=' ';Display_Ram[2]=' ';
							  }
						    }
						  else
						   {
						     Display_Ram[0]=' ';Display_Ram[1]=' ';Display_Ram[2]=' ';Display_Ram[3]=' ';
						   }
					   }
		           else{
				         Display_Ram[0]=' ';Display_Ram[1]=' ';Display_Ram[2]=' ';Display_Ram[3]=' ';Display_Ram[4]='0';

				       }
			       p_Display_Ram=Display_Ram;               //指向显示缓冲单元
		           LCD_disp_string(11,1,p_Display_Ram);
                     }
                   }
               else                                        // 如果操作数A 的数大于5位,则出错处理                              
                  {
                  //Call clear all and flag
				  Clear_All_Flag_Init();
					/*	 Bit_Number=0;                     // 位计数清零  
						 Frist=0;Second=0;                 //运算数清零
						 operator=operator_Emputy;         //运算符初始化
				         Flag_operand_B_NoEmpty=0;         //操作数B 为空
				         Flag_operand_A_NoEmpty=0;         //操作数A  为空 
		                 Flag_operator_FristTime=0;        //没有运算符按下 
					
						 //display the errot
		                 operand_A[0]=0;                   //清零  
						 operand_A[1]=0;
						 operand_A[2]=0;
						 operand_A[3]=0;
						 operand_A[4]=0;*/
						 
						 p_string_code=string_error_tomanybit; //指向字符串“出错处理”
		                 LCD_disp_string_code(0,1,p_string_code);
                 	}
            
               }
            else                                          //如果操作数A 已经按下
              {
                 if(Bit_Number<5)                         //如果操作数B  的位数小于等于 5位
                 {
                   /*operand_B[Bit_Number++]=Key_temp;
                   Second=operand_B[0]+operand_B[1]*10+operand_B[2]*100;*/
                    switch(Bit_Number)                   
                      {
                        case 0: operand_B[0]=Key_temp;break;
                        case 1: operand_B[1]=operand_B[0];operand_B[0]=Key_temp;break;
                        case 2: operand_B[2]=operand_B[1];operand_B[1]=operand_B[0];operand_B[0]=Key_temp;break;
						case 3: operand_B[3]=operand_B[2];operand_B[2]=operand_B[1];operand_B[1]=operand_B[0];operand_B[0]=Key_temp;break;
						case 4: operand_B[4]=operand_B[3];operand_B[3]=operand_B[2];operand_B[2]=operand_B[1];operand_B[1]=operand_B[0];operand_B[0]=Key_temp;break;
                        default: Bit_Number=0;     
                      }
				   Bit_Number++;                          //位数加1
                   Second=operand_B[0]+operand_B[1]*10+operand_B[2]*100+operand_B[3]*1000+operand_B[4]*10000;
				                                          //运算
                   Flag_operator_FristTime=0;             //有运算符按下,可以接收第二次运算符
				   if(operand_B[4]>=6)
				    {
                     The_Number_Too_Large();
					}
				   else
				    {
			       if(Second>0)
                    { Display_Ram[4]=(Second%10)+0x30;
					     if(Second>=10)
						   {
						     Display_Ram[3]=(Second%100)/10+0x30;
							 if(Second>=100)
							  {
							    Display_Ram[2]=(Second%1000)/100+0x30;
								if(Second>=1000)
								  {
								    Display_Ram[1]=(Second%10000)/1000+0x30;
									if(Second>=10000)
									  {
                                         Display_Ram[0]=(Second/10000)+0x30;
									  }
									else
									  {
									   Display_Ram[0]=' ';
									  }
								  }
								 else
								  {
								    Display_Ram[0]=' ';Display_Ram[1]=' ';
								  }
							  }
							  else
							  {
                                Display_Ram[0]=' ';Display_Ram[1]=' ';Display_Ram[2]=' ';
							  }
						    }
						  else
						   {
						     Display_Ram[0]=' ';Display_Ram[1]=' ';Display_Ram[2]=' ';Display_Ram[3]=' ';
						   }
					   }
		           else{
				         Display_Ram[0]=' ';Display_Ram[1]=' ';Display_Ram[2]=' ';Display_Ram[3]=' ';Display_Ram[4]='0';

				       }
                   Flag_operand_B_NoEmpty=1;
	               p_Display_Ram=Display_Ram;
		           LCD_disp_string(11,1,p_Display_Ram);
				  }
                 }
               else                              //如果操作数B 的位数 大于5位
                 {
                  //Call clear all flag
				 Frist=0;Second=0;               //运算数据清零
				 Result=0;                       //结果清零
				 Clear_All_Flag_Init();
				/* operator=operator_Emputy;       //运算符初始化
		         Flag_operand_B_NoEmpty=0;       //操作数B  为空
		         Flag_operand_A_NoEmpty=0;       //操作数A  为空
                 Flag_operator_FristTime=0;      //无运算符按下  
				 Flag_Number_FristTime=0;        //无操作数按下
                 //display the errot
				 operand_B[0]=0;
				 operand_B[1]=0;
				 operand_B[2]=0;
				 operand_B[3]=0;
				 operand_B[4]=0;     */           //显示太多位出错啦!!!!!!!!!
				 p_string_code=string_error_tomanybit;
                 LCD_disp_string_code(0,1,p_string_code);

                 }
          }	//end  default	  
	   }//end if
     }//end switch
  }//end if  
}//end Calculator

void Clear_All_Flag_Init(void)
{

   operator=operator_Emputy;                //运算符初始化
   Flag_operand_B_NoEmpty=0;                //操作数B 为空
   Flag_operand_A_NoEmpty=0;                //操作数A 为空
   Flag_operator_FristTime=0;               //无运算符按下
   Flag_Number_FristTime=0;                 //无操作数
   operand_A[0]=0;operand_A[1]=0;operand_A[2]=0;operand_A[3]=0;operand_A[4]=0;
   operand_B[0]=0;operand_B[1]=0;operand_B[2]=0;operand_B[3]=0;operand_B[4]=0;
   Bit_Number=0;                            //位计算清零

}

void The_Number_Too_Large(void)
{
  Clear_All_Flag_Init();
  Frist=0;Second=0;Result=0;        //清零
  GotoXY(0,1);
  Print("Number too large");

}

⌨️ 快捷键说明

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