📄 calculator.c
字号:
/**************************************************************************
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 + -