//-----------------Main.c--------------
#include <reg51.h>
#include <ctype.h>
#include "calc.h"
static data long lvalue;
static data long rvalue;
static data char currtoken;
static data char lasttoken;
static data char lastpress;
static xdata char outputbuffer[MAX_DISPLAY_CHAR];//输出缓冲
//主程序
void main()
{
//变量初始化
lvalue=0;
rvalue=0;
currtoken='=';
lasttoken='=';
//初始化LCD
initialise();
calc_opfunctions(OK);
calc_evaluate();
}
//获取按键值并进行计算处理
void calc_evaluate()
{
char data key;
int data i;
char xdata number[MAX_DISPLAY_CHAR];
char xdata *bufferptr;
//清除缓冲
for(i=0;i<=MAX_DISPLAY_CHAR;i++)
number[i]=' ';
bufferptr=number;
while(1)
{
key=calc_getkey();
if(calc_testkey(key))
{
if(bufferptr!=&number[MAX_DISPLAY_CHAR-2])
{
*bufferptr=key;
calc_display(number);
bufferptr++;
}
}
else
{
if(lasttoken=='0')
lvalue=calc_asciidec(number);
else
rvalue=calc_asciidec(number);
//清除数字蝗虫
bufferptr=number;
for(i=0;i<=MAX_DISPLAY_CHAR;i++)
number[i]=' ';
//处理操作符
currtoken=key;
if(currtoken=='C')
calc_opfunctions(currtoken);
else
calc_opfunctions(lasttoken);
//清除输出缓冲
for(i=0;i<=MAX_DISPLAY_CHAR;i++)
outputbuffer[i]=' ';
bufferptr=number;
if(currtoken!=0x3d)
lasttoken=currtoken;
}
lastpress=key;
}
}
// 根据运算符按键进行运算处理
void calc_opfunctions (char token)
{
char data result;
switch(token)
{
case '+':if(currtoken=='='||isdigit(lastpress))
{
lvalue+=rvalue;
result=calc_chkerror(lvalue);
}
else result=SLEEP;
break;
case '-':if(currtoken=='='||isdigit(lastpress))
{
lvalue-=rvalue;
result=calc_chkerror(lvalue);
}
else result=SLEEP;
break;
case '*':if(currtoken=='='||isdigit(lastpress))
{
lvalue*=rvalue;
result=calc_chkerror(lvalue);
}
else result=SLEEP;
break;
case '/':if(currtoken=='='||isdigit(lastpress))
{
lvalue/=rvalue;
result=calc_chkerror(lvalue);
}
else result=SLEEP;
break;
//取消
case 'C':lvalue=0;
rvalue=0;
currtoken='0';
lasttoken='0';
result=OK;
break;
default:result=SLEEP;
}
calc_output(result);
}
int calc_chkerror (long num)
{
if(num>=-99999999&&num<=99999999)
return OK;
else
return ERROR;
}
void calc_output (int status)
{
switch(status)
{
case OK:calc_display(calc_decascii(lvalue));
break;
case SLEEP: break;
case ERROR:calc_display("Exception");
break;
default:calc_display("Exception");
break;
}
}
//将ASCII字符串转换为浮点数
long calc_asciidec (char *buffer)
{
long data value;
long data digit;
value=0;
while(*buffer!=' ')
{
digit=*buffer-'0';
value=value*10+digit;
buffer++ ;
}
return value;
}
//将浮点数转换为ASCII字符串
char *calc_decascii(long num)
{
long data temp=num;
char xdata *arrayptr=&outputbuffer[MAX_DISPLAY_CHAR];
long data divisor=10;
long data result;
char data remainder,asciival;
int data i;
//如果计算结果为0。,则在缓冲中插入0并结束
if(!temp)
{
*arrayptr='0';
goto done;
}
if(temp<0) //处理负数
{
outputbuffer[0]='-';
temp-=2*temp;
}
for(i=0;i<sizeof(outputbuffer);i++)
{
remainder=temp%divisor;
result=temp/divisor;
if((!remainder)&&(!result))
*arrayptr=' ';
else
{
asciival=remainder+'0';
*arrayptr=asciival;
}
temp/=10;
//为"-"号保留位置
if(arrayptr!=&outputbuffer[1])
arrayptr--;
}
done:return outputbuffer;
}
//测试按键时数字还是操作符,如果是数字则返回1.是操作符时返回0
char calc_testkey (char key)
{
if(isdigit(key))
return 1;
else
return 0;
}
//调用input例程搜索按键,并返回按键的ASCII码值
char calc_getkey()
{
char data mykey;
do
{
mykey=input();
}
while(mykey==0);
return mykey;
}
//调用Output和Clearscreen例程向LCD输出ASCII
void calc_display (char buf[MAX_DISPLAY_CHAR])
{
int data i=0;
clearscreen();
for(i;i<=MAX_DISPLAY_CHAR;i++)
{
if(buf[i]!=' ')
output(buf[i]);
}
}
- 1
- 2
前往页