要求,制作一个计算结果在0~99范围内的正整数简易计算机,可以进行加减乘操作,并可连续进行,出现异常状况任一LED闪烁三次后可重新输入
问题,个位和十位不能分别读取数字,例如按下2就会显示22,循环最后我有给keyvalue复位0啊
代码如下
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit we=P2^7;
sbit du=P2^6;
sbit LED=P1^3;
int KeyValue;
int num1,num2,ge=0,shi=0,t,s0=0,i;
char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x00};
char list[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//0~9是数字0~9,10~15是字母a~f,16~25是在数字0~9的基础上加小数点
/Pst[]数组0~7为打开对应的数码管
void delay(int z) //延时函数
{
int m,n;
for(m=z;m>0;m--)
{
for(n=120;n>0;n--)
;
}
}
void KeyScan() //按键扫描
{
P3 = 0xf0;
if(P3!=0xf0)
{
delay(5);
if( P3 != 0xf0)
{
switch(P3)
{
case 0xe0: KeyValue = 0; break;
case 0xd0: KeyValue = 1; break;
case 0xb0: KeyValue = 2; break;
case 0x70: KeyValue = 3; break;
}
P3 = 0x0f;
switch(P3)
{
case 0x0e: KeyValue = KeyValue; break;
case 0x0d: KeyValue += 4; break;
case 0x0b: KeyValue += 8; break;
case 0x07: KeyValue += 12; break;
}
while(P3 != 0x0f);
}
}
P3 = 0xff;
if(P3 != 0xff)
{
delay(5);
if( P3 != 0xff)
{
switch(P3)
{
case 0xfe: KeyValue = 16; break;
case 0xfd: KeyValue = 17; break;
case 0xfb: KeyValue = 18; break;
case 0xf7: KeyValue = 19; break;
}
while(P3 != 0xff);
}
}
}
void main()
{
while(1)
{
KeyScan();
if(KeyValue!=0&&P3==0xff)
{
if(KeyValue>=1&&KeyValue<=9) //数字输入
{
s0=KeyValue;
shi=ge;
ge=KeyValue;
shi=KeyValue;
s0=shi*10+ge;
}
else if(KeyValue>=16) //加减乘除
{
P1=0xff;
num1=s0;
s0=0;
shi=0;
ge=0;
switch(KeyValue)
{
case 16: t=1;break;
case 17: t=2;break;
case 18: t=3;break;
case 19: t=4;break;
}
}
else if(KeyValue==11) //计算结果
{
num2=s0;
switch(t)
{
case 1:s0=num1+num2;break;
case 2:s0=num1-num2;break;
case 3:s0=num1*num2;break;
case 4:if(num2==0)
{
P1=0x00;
}
else
s0=num1/num2;
break;
}
if(s0>=100||s0<0) //异常状况提示
{
s0=0;
for(i=0;i<3;i++)
{
LED=0;
delay(200);
LED=1;
delay(200);
}
}
}
else if(KeyValue==10)
{
s0=0; // 清零
}
}
KeyValue=0;
shi=s0/10;
ge=s0%10;
P0=0xff; // 数码管显示
we=1;
P0=list[0];
we=0;
du=1;
P0=table[shi];
du=0;
delay(5);
P0=0xff;
we=1;
P0=list[1];
we=0;
du=1;
P0=table[ge];
du=0;
delay(5);
}
}