📄 calready.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 + -