#include <reg51.h>
#include <stdlib.h>
#define uchar unsigned char
void dlms (void);
uchar kbscan (void);
void display (long);
void keycheck (void);
uchar key_tab[] = {0xd7, 0xeb, 0xdb, 0xbb, 0xed, 0xdd, 0xbd, 0xee, 0xde, 0xbe, 0x7d, 0x7b, 0xe7, 0x7e, 0xb7, 0x77};
// 0 1 2 3 4 5 6 7 8 9 * - on/c / = + E
uchar cod_tab[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
uchar key,count=1,ch,i,flag=0,flag2,top;
char button; //按键的值
long show=0,result;
char str[20]; //存储原算术表达式
long stack[6];
char exp[20]; //存储转换成的后缀表达式,t作为下标
void transform(); //将中缀表达式转换成后缀表达式
long compute(); //计算后缀表达式结果
void err(); //错误显示
void swap (); //负数处理 可以实现例如-8*-9# 8*9#的转化
void switch1(); //0-9
//
void switch2(); //+*/
void switch3(); //-
void goon(); //按=号后可以继续运算
//主函数
void main (void)
{
str[0]='0';
while (1)
{
key = kbscan ();
keycheck ();
if(key==0xb7)
{
i = count;
swap();
transform();
result = compute();
if(result>=0)flag2=0;
show=result;
goon ();
}
display(show);
}
}
void keycheck (void)
{
if (key != 0)
{
switch (key)
{
case 0xd7:switch1 ();break; //0
case 0xeb:switch1 ();break; //1
case 0xdb:switch1 ();break; //2
case 0xbb:switch1 ();break; //3
case 0xed:switch1 ();break; //4
case 0xdd:switch1 ();break; //5
case 0xbd:switch1 ();break; //6
case 0xee:switch1 ();break; //7
case 0xde:switch1 ();break; //8
case 0xbe:switch1 ();break; //9
case 0x77:switch2 ();break; //+
case 0x7d:switch2 ();break; //*
case 0x7e:switch2 ();break; ///
case 0x7b:switch3 ();break; //-
case 0xb7: // = 算出结果函数
str[count] = '#';
str[0]='1';
break;
case 0xe7: // on/c
count = 1;
show = 0;
result=0;
flag=0;
flag2=0;
str[0]='0';
break;
default:
break;
}
}
}
void dlms (void) //延迟函数
{
uchar i;
for (i = 200; i > 0; i --);
}
uchar kbscan (void) //键盘扫描函数
{
uchar sccode, recode;
P1 = 0xf0;
if ((P1 & 0xf0) != 0xf0) {
dlms ();
if ((P1 & 0xf0) != 0xf0) {
sccode = 0xfe;
while ((sccode & 0x10) != 0) {
P1 = sccode;
if ((P1 & 0xf0) != 0xf0) {
recode = P1 & 0xf0;
sccode = sccode & 0x0f;
while ((P1 & 0xf0) != 0xf0);
return (sccode + recode);
} else sccode = (sccode << 1) | 0x01;
}
}
}
return (0);
}
void err()
{
P3=0x01; P2=0xf9; //显示1
dlms(); P2=0xff; P3=P3<<1;
P2=0xc0; dlms(); //显示0
P2=0xff; P3=P3<<1;
P2=0xc0; dlms(); //显示0
P2=0xff; P3=P3<<1;
P2=0xc0; dlms(); //显示0
P2=0xff; P3=P3<<1;
P2=0xc0; dlms(); //显示0
P2=0xff; P3=P3<<1;
P2=0x86; dlms(); //显示E
P2=0xff; P3=P3<<1;
}
void display (long temp) //显示函数
{
if (temp < 0)
{
temp *= -1;
flag2 = 1;
}
P3 = 0x01;
if(temp > 99999 || temp < -99999)
{
err();
}
else
{
if(flag2 == 0)
{
if(temp == 0)P2 = cod_tab[0];
else if(temp != 0)
{
while(temp != 0)
{
P2 = cod_tab[temp%10];
dlms();
P2=0xff;
temp = temp/10;
P3=P3<<1;
}
}
}
else if(flag2 == 1)
{
if(temp == 0)P2 = 0x3f;
else
{
while(temp != 0)
{
P2 = cod_tab[temp%10];
dlms();
P2=0xff;
temp = temp/10;
P3=P3<<1;
}
P2=0x3f;
dlms();
P2=0xff;
}
}
}
}
void transform() //中缀表达式转换成后缀表达式函数exp[10]
{
uchar t=1,i=0; //i为str下标,t为exp下标
ch=str[1];
top=0; //栈顶指针初始为0
i=2;
while(ch!='#')
{
switch(ch)
{
case '+': //判定为加法
case '-': //判定为减法
while(top!=0)
{
exp[t]=stack[top];
top--;
t++;
}
top++;
stack[top]=ch;
break;
case '*': //判定为乘法
case '/': //判定为除法
while(stack[top]=='*' || stack[top]=='/')
{
exp[t]=stack[top];
top--;
t++;
}
top++;
stack[top]=ch;
break;
default: //判定为0~9
while(ch>='0' && ch<='9')
{
exp[t]=ch;
t++;
ch=str[i];
i++;
}
exp[t]='#';
i--;
t++;
}//switch
ch=str[i];
i++;
}
while(top!=0)
{
exp[t]=stack[top];
t++;
top--;
}
exp[t]='#';//结束符
}
long compute()
{
char temp1,j=1;
top=0;
temp1=exp[1];
j++;
while(temp1!= '#')
{
switch(temp1)
{
case '+':
stack[top-1]=stack[top-1]+stack[top];
top--;
break;
case '-':
stack[top-1]=stack[top-1]-stack[top];
top--;
break;
case '*':
stack[top-1]=stack[top-1]*stack[top];
top--;
break;
case '/':
if(stack[top]!=0)
{
stack[top-1]=stack[top-1]/stack[top];
top--;
break;
}
else //除数为0,显示错误
{
flag=1;
break;
}
default:
result=0;
while(temp1>='0' && temp1<='9')
{
result=10*result+temp1-'0';
temp1=exp[j];
j++;
}
top++;
stack[top]=result;
}//switch
temp1=exp[j];
j++;
}
return stack[top];
}
void swap() //负数处理 可以实现例如-8*-9# 8*9#的转化
{
char l,k,j;
for(j=1;j<=i;j++)
{
if(str[j]=='-')
if(j==1)
{
for(l=i+1;l>0;l--)
{
if(l==1)str[l]='0';
else
str[l]=str[l-1];
}
j++;
i++;
}
else
{
if(str[j-1]=='*'||str[j-1]=='/')
for(k=j-2;k>0;k--)
{
if(str[k]=='+')
{
if(str[k-1]!='*'||str[k-1]!='/')
{
str[k]='-';
for(l=j;l<i;l++)
{
str[l]=str[l+1];
}
i--;
goto jump;
}
}
else if(str[k]=='-')
{
if(str[k-1]!='*'||str[k-1]!='/')
{
str[k]='+';
for(l=j;l<i;l++)
{
str[l]=str[l+1];
}
i--;
goto jump;
}
}
else if(k==1)
{
for(l=i+1;l>0;l--)
{
if(l==1)str[l]='0';
else if(l==2)str[l]='-';
else
{
if(l<j+2)
str[l]=str[l-2];
else if(l>=j+2)
str[l]=str[l-1];
}
}
j++;
i++;
goto jump;
}
}
}
jump: ;
}
if(str[1]=='0'&&str[2]=='+')
{
i=0;
while(str[i+2]!='#')
{
i++;
str[i]=str[i+2];
}
}
}
void switch1 () //0-9
{
if(str[0]=='1'){count=1;str[0]=0;show=0;flag2=0;};
switch (key)
{
case 0xd7:button = 0;break;
case 0xeb:button = 1;break;
case 0xdb:button = 2;break;
case 0xbb:button = 3;break;
case 0xed:button = 4;break;
case 0xdd:button = 5;break;
case 0xbd:button = 6;break;
case 0xee:button = 7;break;
case 0xde:button = 8;break;
case 0xbe:button = 9;break;
}
if (show / 10000 > 0)
{
if (str[count-1] == '+' || str[count-1] == '-' || str[count-1] == '*' || str[count-1] == '/')
{
if(str[count-2] == '+' || str[count-2] == '-' || str[count-2] == '*' || str[count-2] == '/' || count == 2)
{
if( count == 2)
flag2 = 1;
show = button;
str[count] = button + '0';
count ++;
}
else
{
flag2 = 0;
show = button;
str[count] = button + '0';
count ++;
}
}
}
else
{
if (str[count-1] == '+' || str[count-1] == '-' || str[count-1] == '*' || str[count-1] == '/')
{
if(str[count-2] == '+' || str[count-2] == '-' || str[count-2] == '*' || str[count-2] == '/' || count == 2)
{
if( count == 2)
flag2 = 1;
show = button;
}
else
{
flag2 = 0;
show = button;
}
}
else
show = show * 10 + button;
str[count] = button + '0';
count ++;
}
}
评论5