#include "reg51.h"
#include "lcd1602.h"
#define uchar unsigned char
#define uint unsigned int
sbit test=P2^0;
sbit beep=P2^4;
uchar mode=0;//模式
uchar num1[]=" ";
uchar num2[]=" ";
uchar num3[]=" ";//结果
unsigned long x=0,y=0,z=0;//计算变量
uchar fuhao=0;//符号
void clear()//显示清零
{
uchar i;
for(i=0;i<8;i++)
{
num1[i]=' ';
num2[i]=' ';
}
write_string(1,0," ");
write_string(2,0," ");
}
uchar key()//按键检测
{
uchar i,j;
i=0;j=0;
P3=0x0f;//行检测
if(P1!=0xff)
{
switch(P1)
{
case 0xfe:i=1;break;
case 0xfd:i=5;break;
case 0xfb:i=9;break;
case 0xf7:i=13;break;
case 0xef:i=17;break;
case 0xdf:i=21;break;
case 0xbf:i=25;break;
case 0x7f:i=29;
}
P3=0xff;
P1=0;
switch(P3)
{
case 0xef:j=0;break;
case 0xdf:j=1;break;
case 0xbf:j=2;break;
case 0x7f:j=3;
}
while(P3!=0xff);
P1=0xff;
}
return i+j;
}
//主函数
void main()
{
uchar i,j,k;
init_1602();
write_string(1,3,"input:");
while(1)
{
//输入第一个数
i=key();
if(i==18) //清空
{
mode=0;
clear();
write_string(1,3,"input:");
fuhao=0;
i=0;
}
if(mode==0)
{
if((i>0)&&(i<11))
{
for(j=0;j<7;j++)
{
num1[j]=num1[j+1];
}
num1[7]=i+0x2f;
write_string(1,3,num1);
}
if((i>12)&&(i<17))//输入符号
{
mode=1;
switch(i)
{
case 13:write_string(2,0,"+ ");fuhao=1;break;//+
case 14:write_string(2,0,"- ");fuhao=2;break;//-
case 15:write_string(2,0,"x ");fuhao=3;break;//*
case 16:write_string(2,0,"/ ");fuhao=4;// /
}
i=0;
}
if(i>16) //错误
{
beep=0;
for(k=0;k<100;k++)
delay_uint(1000);
}
else
beep=1;
}
//=====================================
//输入第二个数
if(mode==1)
{
if((i>0)&&(i<11))//输入数字
{
for(j=0;j<7;j++)
{
num2[j]=num2[j+1];
}
num2[7]=i+0x2f;
write_string(2,3,num2);
}
if(i==17)//计算
{
mode=2;
x=0;y=0;z=0;
for(j=0;j<8;j++)//提取x
{
x=x*10;
if(num1[j]!=' ')
{
x=x+num1[j]-0x30;
}
}
for(j=0;j<8;j++)//提取y
{
y=y*10;
if(num2[j]!=' ')
{
y=y+num2[j]-0x30;
}
}
//计算结果
num3[0]=' ';
switch(fuhao)
{
case 1:z=x+y;break;//+
case 2:
if(x>y)
z=x-y;
else
{
num3[0]='-';
z=y-x;
}
break;//-
case 3:z=x*y;break;//*
case 4:// /
z=x/y;
}
//显示
num3[8]=z%10+0x30;z=z/10;
num3[7]=z%10+0x30;z=z/10;
num3[6]=z%10+0x30;z=z/10;
num3[5]=z%10+0x30;z=z/10;
num3[4]=z%10+0x30;z=z/10;
num3[3]=z%10+0x30;z=z/10;
num3[2]=z%10+0x30;z=z/10;
num3[1]=z%10+0x30;
clear();
delay_uint(50000);
write_string(1,0," = ");
write_string(2,1,num3);
fuhao=0;
}
if((i>17)||((i>10)&&(i<17)))//错误
{
beep=0;
for(k=0;k<100;k++)
delay_uint(1000);
}
else
beep=1;
}
}
}
#include "lcd1602.h"
#define uchar unsigned char
#define uint unsigned int
sbit test=P2^0;
sbit beep=P2^4;
uchar mode=0;//模式
uchar num1[]=" ";
uchar num2[]=" ";
uchar num3[]=" ";//结果
unsigned long x=0,y=0,z=0;//计算变量
uchar fuhao=0;//符号
void clear()//显示清零
{
uchar i;
for(i=0;i<8;i++)
{
num1[i]=' ';
num2[i]=' ';
}
write_string(1,0," ");
write_string(2,0," ");
}
uchar key()//按键检测
{
uchar i,j;
i=0;j=0;
P3=0x0f;//行检测
if(P1!=0xff)
{
switch(P1)
{
case 0xfe:i=1;break;
case 0xfd:i=5;break;
case 0xfb:i=9;break;
case 0xf7:i=13;break;
case 0xef:i=17;break;
case 0xdf:i=21;break;
case 0xbf:i=25;break;
case 0x7f:i=29;
}
P3=0xff;
P1=0;
switch(P3)
{
case 0xef:j=0;break;
case 0xdf:j=1;break;
case 0xbf:j=2;break;
case 0x7f:j=3;
}
while(P3!=0xff);
P1=0xff;
}
return i+j;
}
//主函数
void main()
{
uchar i,j,k;
init_1602();
write_string(1,3,"input:");
while(1)
{
//输入第一个数
i=key();
if(i==18) //清空
{
mode=0;
clear();
write_string(1,3,"input:");
fuhao=0;
i=0;
}
if(mode==0)
{
if((i>0)&&(i<11))
{
for(j=0;j<7;j++)
{
num1[j]=num1[j+1];
}
num1[7]=i+0x2f;
write_string(1,3,num1);
}
if((i>12)&&(i<17))//输入符号
{
mode=1;
switch(i)
{
case 13:write_string(2,0,"+ ");fuhao=1;break;//+
case 14:write_string(2,0,"- ");fuhao=2;break;//-
case 15:write_string(2,0,"x ");fuhao=3;break;//*
case 16:write_string(2,0,"/ ");fuhao=4;// /
}
i=0;
}
if(i>16) //错误
{
beep=0;
for(k=0;k<100;k++)
delay_uint(1000);
}
else
beep=1;
}
//=====================================
//输入第二个数
if(mode==1)
{
if((i>0)&&(i<11))//输入数字
{
for(j=0;j<7;j++)
{
num2[j]=num2[j+1];
}
num2[7]=i+0x2f;
write_string(2,3,num2);
}
if(i==17)//计算
{
mode=2;
x=0;y=0;z=0;
for(j=0;j<8;j++)//提取x
{
x=x*10;
if(num1[j]!=' ')
{
x=x+num1[j]-0x30;
}
}
for(j=0;j<8;j++)//提取y
{
y=y*10;
if(num2[j]!=' ')
{
y=y+num2[j]-0x30;
}
}
//计算结果
num3[0]=' ';
switch(fuhao)
{
case 1:z=x+y;break;//+
case 2:
if(x>y)
z=x-y;
else
{
num3[0]='-';
z=y-x;
}
break;//-
case 3:z=x*y;break;//*
case 4:// /
z=x/y;
}
//显示
num3[8]=z%10+0x30;z=z/10;
num3[7]=z%10+0x30;z=z/10;
num3[6]=z%10+0x30;z=z/10;
num3[5]=z%10+0x30;z=z/10;
num3[4]=z%10+0x30;z=z/10;
num3[3]=z%10+0x30;z=z/10;
num3[2]=z%10+0x30;z=z/10;
num3[1]=z%10+0x30;
clear();
delay_uint(50000);
write_string(1,0," = ");
write_string(2,1,num3);
fuhao=0;
}
if((i>17)||((i>10)&&(i<17)))//错误
{
beep=0;
for(k=0;k<100;k++)
delay_uint(1000);
}
else
beep=1;
}
}
}