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

📄 calready.c

📁 LCD1602.rar
💻 C
字号:
//*************************************************************************************************
//*************************************************************************************************
//**<程序名>:计算器案件初始处理及运算。													 	 **
//**<功能>:在计算器模式下,对按键进行响应,如清零,计算结果等。	 							 **
//**<错误代码>:-EOR-1:被除数等于0;															 **
//**			-EOR-2:被减数小于减数;															 **
//**			-EOR-9:超出可显示的最大值。														 **
//*************************************************************************************************
//*************************************************************************************************


//*************************************************************************************************
//*																								  *
//*			 ******************************头文件及宏定义**************************				  *
//*																								  *
//*************************************************************************************************


//*************************************************************************************************
//*																								  *
//*			  ********************************全局变量******************************			  *
//*																								  *
//*************************************************************************************************
extern unsigned long ul_Number;
extern unsigned long ul_NumberOne;
extern unsigned long ul_NumberTwo;
extern unsigned char uc_Operator;
extern unsigned long ul_Result;
extern unsigned char uc_NumPointer;
extern bit b_LCDClean;
extern unsigned char uc_ReportSymbol;

bit b_Zero=0;		//状态一0输入检测,若有0输入则置一。


//*************************************************************************************************
//*																								  *
//*		 	 	*******************************计算结果******************************			  *
//*																								  *
//*************************************************************************************************
void vGetResult()
{
	switch(uc_Operator)
		{
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<除法运算 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		case 14:
				if(ul_NumberTwo!=0)
					ul_Result=ul_NumberOne/ul_NumberTwo;
				else
					{
						ul_Result=0;
						uc_ReportSymbol=1;					 //当被除数等于0时显示错误代码EOR-1
						b_LCDClean=1;
					}
				break;

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<乘法运算>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		case 24:
				if((ul_NumberOne*ul_NumberTwo)>999999)
					{
						ul_Result=0;
						uc_ReportSymbol=9;
						b_LCDClean=1;						  //当结果超出显示范围时显示错误代码EOR-9
					}
				else
					ul_Result=ul_NumberOne*ul_NumberTwo;
				break;

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<减法运算>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>						
		case 34:
				if(ul_NumberOne>ul_NumberTwo)
					ul_Result=ul_NumberOne-ul_NumberTwo;
				else 
					{
						ul_Result=0;
						uc_ReportSymbol=2;					//当被减数小于减数时显示错误代码EOR-2
						b_LCDClean=1;
					}
				break;

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<加法运算>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>				
		case 44:
				if((ul_NumberOne+ul_NumberTwo)>999999)
					{
						ul_Result=0;
						uc_ReportSymbol=9;
						b_LCDClean=1;					//当结果超出显示范围时显示错误代码EOR-9
					}
				else ul_Result=ul_NumberOne+ul_NumberTwo;
				break;

		default:break;
	}
	ul_Number=ul_Result;
	ul_NumberOne=0;						 				//恢复计算前初始状态。
	ul_NumberTwo=0;
	uc_NumPointer=1;
	b_Zero=0;	
}


//*************************************************************************************************
//*																								  *
//*		 	 *******************************状态一预处理******************************			  *
//*																								  *
//*************************************************************************************************

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<将1位数字压入第一个数字中>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void vPushOne(unsigned char ucPushNum)
{
	if(ul_NumberOne<100000)							   	//如果数字小于6位则压入数字,否则不执行。
		{
		ul_NumberOne=ul_NumberOne*10+ucPushNum;
		ul_Number=ul_NumberOne;
		}
}

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<状态一按键处理函数>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void vCalReadyOne(unsigned char ucKeyCode)
{
	switch(ucKeyCode)
		{												//如果由数字输入,则压入数字一。
			case 11: vPushOne(7);break;					//'7'
			case 12: vPushOne(8);break;					//'8'
			case 13: vPushOne(9);break;					//'9'
			case 21: vPushOne(4);break;					//'4'
			case 22: vPushOne(5);break;					//'5'
			case 23: vPushOne(6);break;					//'6'
			case 31: vPushOne(1);break;					//'1'
			case 32: vPushOne(2);break;					//'2'
			case 33: vPushOne(3);break;					//'3'
			case 42: vPushOne(0);b_Zero=1;break;		//'0',当压入数字为0时,置0检测标志。

			default:
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<此处的b_Zero判断主要是为了实现连续运算功能>>>>>>>>>>>>>>>>>>>>>>>>>>>>
					if(b_Zero==0&&ul_NumberOne==0)		//如果是运算符,则首先判断是否有0输入。
						{								//如果没有0输入,然而数字1是0,
						ul_NumberOne=ul_Result;			//说明是继续上一次运算,将上一次运算结束
						switch(ucKeyCode)				//赋给第一个数,进行连续运算。
							{
							case 14: uc_Operator=14;uc_NumPointer=2;break;		//'/'
							case 24: uc_Operator=24;uc_NumPointer=2;break;		//*
							case 34: uc_Operator=34;uc_NumPointer=2;break;		//'-'
							case 44: uc_Operator=44;uc_NumPointer=2;break;		//'+'
							default: break;
							}
						}
					else
						switch(ucKeyCode)				//如果有0输入,则说明是全新计算,正常进行。	
							{
							case 14: uc_Operator=14;uc_NumPointer=2;break;		//'/'
							case 24: uc_Operator=24;uc_NumPointer=2;break;		//*
							case 34: uc_Operator=34;uc_NumPointer=2;break;		//'-'
							case 44: uc_Operator=44;uc_NumPointer=2;break;		//'+'
							default: break;
							}
					break;
		}												
}

//*************************************************************************************************
//*																								  *
//*		 	 *******************************状态二预处理******************************			  *
//*																								  *
//*************************************************************************************************

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<将1位数字压入第二个数字中>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void vPushTwo(unsigned char ucPushNum)
{
	if(ul_NumberTwo<100000)				//如果数字小于6位则压入数字,否则不执行。
		{
		ul_NumberTwo=ul_NumberTwo*10+ucPushNum;
		ul_Number=ul_NumberTwo;
		}
}


//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<状态二按键处理函数>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void vCalReadyTwo(unsigned char ucKeyCode)
{
	switch(ucKeyCode)					 //状态二下如果有数字输入则将数字压入数字二,转到状态三。
		{
			case 11: vPushTwo(7);uc_NumPointer=3;break;			//'7'
			case 12: vPushTwo(8);uc_NumPointer=3;break;			//'8'
			case 13: vPushTwo(9);uc_NumPointer=3;break;			//'9'
			case 21: vPushTwo(4);uc_NumPointer=3;break;			//'4'
			case 22: vPushTwo(5);uc_NumPointer=3;break;			//'5'
			case 23: vPushTwo(6);uc_NumPointer=3;break;			//'6'
			case 31: vPushTwo(1);uc_NumPointer=3;break;			//'1'
			case 32: vPushTwo(2);uc_NumPointer=3;break;			//'2'
			case 33: vPushTwo(3);uc_NumPointer=3;break;			//'3'
			case 42: vPushTwo(0);uc_NumPointer=3;break;			//'0'

									   //如果有运算符输入则将运算符键码存储在uc_Operator中。
			case 14: uc_Operator=14;break;						 //'/'
			case 24: uc_Operator=24;break;						 //*
			case 34: uc_Operator=34;break;						 //'-'
			case 44: uc_Operator=44;break;						 //'+'
			default: break;
		}	
}

//*************************************************************************************************
//*																								  *
//*		 	 *******************************状态三预处理******************************			  *
//*																								  *
//*************************************************************************************************

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<状态三继续运算函数>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void vCalContinue(unsigned char ucKeyCode)
{
	vGetResult();
	ul_NumberOne=ul_Result;
	uc_Operator=ucKeyCode;
	uc_NumPointer=2;
}

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<状态三按键处理函数>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void vCalReadyThree(unsigned char ucKeyCode)
{
	switch(ucKeyCode)
		{								   //状态三下如果有数字输入,则压入数字二。
			case 11: vPushTwo(7);break;						//'7'
			case 12: vPushTwo(8);break;						//'8'
			case 13: vPushTwo(9);break;						//'9'
			case 21: vPushTwo(4);break;						//'4'
			case 22: vPushTwo(5);break;						//'5'
			case 23: vPushTwo(6);break;						//'6'
			case 31: vPushTwo(1);break;						//'1'
			case 32: vPushTwo(2);break;						//'2'
			case 33: vPushTwo(3);break;						//'3'
			case 42: vPushTwo(0);break;						//'0'

										  //如果有“=”号输入则计算结果。
			case 43: vGetResult();break;					//'='
										  //如果有运算符输入则执行继续运算。
			case 14: vCalContinue(14);break;				//'/'
			case 24: vCalContinue(24);break;				//*
			case 34: vCalContinue(34);break;				//'-'
			case 44: vCalContinue(44);break;				//'+'

			default: break;
		}	
}

⌨️ 快捷键说明

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