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

📄 calculator.c

📁 我做的畢業設計,用AT89S51 控制LCD1602作為顯示. DS1302時鐘芯片顯示時間,DS18B20測量溫度,還有4X4的鍵盤驅動.實現了一個計算功能.可以用PROTUES 仿真軟件仿真,當時
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************
  
                 
  
   File Name:       calculator.c
   Author:          liao xu ming
   Created:         2007/3/23
   Modified:		2007/4/8    增加到 运算的最大数据为  65535 整形数据 int
   Revision: 		1.0
  
***************************************************************************/

#include"clock.h"
#include"calculator.h"
#include"lcd1602.h"
#include"keyboard.h"
#include"main.h"

#define   operator_Emputy      0xfe        //没有运算符按下的值
/***************************************************************************/

/**要在LCD上显示的字符******/
unsigned char code  string_calcultor[]="calcultor:";   
unsigned char code  string_error_tomanybit[]="error many bit      "; 
unsigned char code  string_Result[]="The Result:     ";  
unsigned char code  string_clear_line2[]="                ";      
/**************************************************************************/

unsigned  char operand_A[5]={0,0,0,0,0};   //操作数 A .B
unsigned  char operand_B[5]={0,0,0,0,0};

unsigned  int  Frist,Second,Result;        //Result=Frist  operator   Second ;

unsigned  char operator;                   //运算符

unsigned  char  Bit_Number;                //运算的位计数,判断是否大于5位数,最大运算数为5位数
//extern unsigned char State_ADJ;
extern bit Calculator_To_DS18B20;          //功能切换时的标示位————从计算器功能切换到温度计
 bit State_Switch_Flag;                    //功能切换时的标示位    
 bit Flag_operand_B_NoEmpty;               //操作数 B 不为空时置1
 bit Flag_operand_A_NoEmpty;               //操作数 A 不为空时置1
 bit Flag_operator_FristTime;              //运算符第一次按下时置1
 bit Flag_Number_FristTime;                //第一个操作数按下时 

/*****************************************************************************
计算器程序,主要完成以下功能
1 完成 小于 65535数的 加减乘除

******************************************************************************/
void Calculator(unsigned char Key_temp)   
{
unsigned  char idata Display_Ram[5];       //显示缓冲单元 一共5位
unsigned  char data *p_Display_Ram;        //指向显示缓冲单元的指针   
unsigned  char  code* p_string_code;       //指向显示字符串代码的指针
//unsigned  char Key_temp;
if(State_Switch_Flag==0)                   //功能切换时(从时钟切换到计算器时)要处理的一些初始化     
  {State_ADJ=0;                            //时钟
   Bell_Flag=0;                            //关打玲
   Bell=1;                                 //关打玲
   State_Switch_Flag=1;                    //功能切换成功后的标志位
   Calculator_To_DS18B20=1;                //计算器切换到温度计
   LCD_send_command(LCD_CLEAR_SCREEN);     //LCD 清屏
   p_string_code=string_calcultor;         //第一行显示字符” Caclcultor"  
   LCD_disp_string_code(0,0,p_string_code);//显示字符串
   LCD_send_command(LCD_DISPLAY_ON|LCD_CURSOR_OFF);//不显示光标
   LCD_write_char(15,1,'0');               // clear 清零

   /*****************************************************************
    clear all flag
   *****************************************************************/
   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;                            //位计算清零*/
   EA=0;                                    //关中断 
   } 

/************************/
//p_string_code=string_calcultor;
//LCD_disp_string_code(0,0,p_string_code);
/************************/
//Key_temp=Keyboard();
if((Key_temp!=KEY_NOTHING)&&(Key_temp!=KEY_FUNCTION))
{                                           //如果是没有按键按下,或者是功能键按下 退出程序不执行
switch(Key_temp)                            //根据按键选择相应的操作
{
case EQUAL:                                 //如果是等于号按下
     if(Flag_operand_B_NoEmpty==1)           
	   {
         switch(operator)                   //根据运算符选择相应的操作
          {
		    case  ADD: Result=Frist+Second;break;
                                            //加
			case  DEC: if(Frist>=Second)    //减 
						               {
									    Result=Frist-Second;
									   }
								   else
								       {
									    LCD_write_char(10,1,'-');
									    Result=Second-Frist;
									   }
						break;
			case  MUL: Result=Frist*Second;break;
                                            //乘
			case  DIV: Result=Frist/Second;break;
                                            //除 

            default:break;
		  }
		  //clear all flag
		  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;                     //位计算清零*/
		  Frist=Result;                     //结果
		  //display();  code 
		   if(Frist>=65535)
				    {
                     The_Number_Too_Large();
					}
			else
			 {
		   if(Frist>0)                      //分解 把运算结果分解,然后送LCD显示
                   { 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_string_code=string_Result;      //显示字符串 :The Result: "       
		  LCD_disp_string_code(0,1,p_string_code);
          p_Display_Ram=Display_Ram;        //指向显示缓冲单元
		  LCD_disp_string(11,1,p_Display_Ram);
                             
		  Frist=0;Second=0;Result=0;        //清零
        }
       }break;  //end case EQUAL
case ADD:                                   //如果是加减乘除键按下
case DEC:
case MUL:
case DIV: if(Flag_operand_A_NoEmpty==1)     //如果前面没有操作数,就不理会
            {                              
                                            //如果是第一次   运算符按下
			  if(Flag_operator_FristTime==1)
			   {
			    operator=Key_temp;          //保存按键值 
				Flag_operator_FristTime=0;  //有运算符按下了
				Flag_Number_FristTime=1;    //有操作数按下了
				Bit_Number=0;               //位计算清零
				Flag_operand_A_NoEmpty=1;   //操作数A 不为空   
				LCD_write_char(9,1,operator);
		       }
			  else                          //如果不是第一次按下运算符,则运算一次
 			   { if(Flag_operand_B_NoEmpty==1) //如果操作数B 不为空
			      { 
                     switch(operator)       //根据前一次的运算符进行计算
					  {                  
					    case  ADD: Result=Frist+Second;break;        //加
		            	case  DEC: if(Frist>=Second)                 //减
						               {
									    Result=Frist-Second;
									   }
								   else
								       {
								           Key_temp=' ';             //运算符清零
					                      /* 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; */
										   Clear_All_Flag_Init();
									    Frist=0;Second=0;Result=0;
						                 }
				                      break;
			            case  MUL: Result=Frist*Second;break;        //乘
			            case  DIV: Result=Frist/Second;break;        //除
						default:break;
					  }
                    
                     Bit_Number=0;                                   //位计数清零
                     Frist=Result;                                   //结果
                     Second=0;operand_B[0]=0;operand_B[1]=0;operand_B[2]=0;operand_B[3]=0;operand_B[4]=0;
                     operator=Key_temp;                              //显示按下的运算符
			         LCD_write_char(9,1,operator);
                     Flag_operand_B_NoEmpty=0;                       //操作数B 为空
                    //Flag_operand_A_NoEmpty=1;                      //操作数A 不为空   
					// Flag_Number_FristTime=1;                      //有操作数按下
					if(operand_B[4]>=6)
				    {
                     The_Number_Too_Large();
					}
					else
					 {
				     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]=' ';
									  }
								  }

⌨️ 快捷键说明

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