洛柠. 2022-11-24 15:01 采纳率: 33.3%
浏览 1
已结题

简易计算器输入过程错误,只能输入22.33这种,看看哪里出的问题

要求,制作一个计算结果在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~910~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);

    }
}

  • 写回答

1条回答 默认 最新

  • 洛柠. 2022-11-24 16:33
    关注

    问题已解决

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月24日
  • 已采纳回答 11月24日
  • 修改了问题 11月24日
  • 创建了问题 11月24日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装