qidongmiu0571 2017-05-13 13:05 采纳率: 0%
浏览 1308

C51单片机简单加法计算器的问题,身边没有调试器实在是找不出bug了,求大神帮忙

#include
#define uchar unsigned char
#define uint unsigned int

#define GPIO_DIG P0

#define GPIO_KEY P1

sbit first=P2^2;

sbit second=P2^3;
sbit third=P2^4;

uchar code table[]={
0x3f,0x06,0x05b,0x04f,0x66,
0x06d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay10ms(void); // 声明延时子程序//
void display(long); //声明显示子程序//
void equal(uchar); //声明计算子程序//
void keyscan(); //声明键盘子程序//

long Cal_Value,Value_a,Value_b; //全局定义//
uchar a,b,c,x,fuhao,err; //a为第一次显示数值的标记,b为第二次显示数值的标记,//
//c为运算符号显示形式选择位,x为功能选择标记,fuhao是运算后负号选择位,err错误标记//

void main()
{

while(1)
{
keyscan();

  if(x==0)
  display(Value_a);             //显示第一次输入//
  else if(x>0&&x<5)
  {
   if(c==1){display(x);}         //显示运算符号//
   else {display(Value_b);}     //显示第二次输入//
   }


else display(Cal_Value);   


}  

}

void keyscan() //按键子程序//
{

uchar KeyValue;
GPIO_KEY=0x0f;

if(GPIO_KEY!=0x0f)          //读取按键是否按下
{
    delay10ms();            //延时10ms进行消抖
    if(GPIO_KEY!=0x0f)     //再次检测键盘是否k按下
    {   
        GPIO_KEY=0X0F;      //测试列
        switch(GPIO_KEY)
        {
            case(0X07): KeyValue=0;break;
            case(0X0b): KeyValue=1;break;
            case(0X0d): KeyValue=2;break;
            case(0X0e): KeyValue=3;break;
        }
        GPIO_KEY=0XF0;      //测试行
        switch(GPIO_KEY)
        {
            case(0X70): KeyValue=KeyValue;break;
            case(0Xb0): KeyValue=KeyValue+4;break;
            case(0Xd0): KeyValue=KeyValue+8;break;
            case(0Xe0): KeyValue=KeyValue+12;break;
        }

        while(GPIO_KEY!=0xf0);   //检测按键松手检测

         if(KeyValue<10)     //按键总值计算//
        {
        if(a<6){Value_a=(Value_a)*10+KeyValue;b=6;if(Value_a!=0)a++;}       //必须先显示第一次输入的数据,只能显示5位数,最高一位显示运算符号//
        if(b<6){Value_b=(Value_b)*10+KeyValue;a=6;c=0;if(Value_b!=0)b++;}  //按下功能键后只能显示第二次输入的数据//

        }


         else
        {
         switch(KeyValue)      /*功能键选择*/
         {
           case (10):a=7;b=0;x=1;c=1;break;   //加x=1/ 
           case (11):a=7;b=0;x=2;c=1;break;   //减x=2/
           case (14):a=7;b=7;equal(x);x=5;c=0;break;   //等x=5/
           case (15):{a=0;b=0;x=0;c=0;fuhao=0;err=0;Value_a=0;Value_b=0;Cal_Value=0;}    //清零//
          }

        }

    }    //按键赋值程序

}   

}

void display(long disvalue) //显示子程序//
{
uchar ge,shi,bai,qian,wan;
uchar DisplayData[8],n;
//将显示值分开成位显示//
wan=disvalue%100000/10000;
qian=disvalue%10000/1000;
bai=disvalue%1000/100;
shi=disvalue%100/10;
ge=disvalue%10;

DisplayData[0]=table[ge];               //准备循环显示//
DisplayData[1]=table[shi];
DisplayData[2]=table[bai];
DisplayData[3]=table[qian];
DisplayData[4]=table[wan];

if(c==1) //最高位数码管显示加减乘除符号//
{
switch(disvalue)
{
case (1):first=1;second=1;third=1;GPIO_DIG=0x70;break; //显示1-代表+//
case (2):first=1;second=1;third=1;GPIO_DIG=0X40;break; //显示-代表-//
}
}
else
{
if(disvalue>32767) //计算数值溢出,显示ov//
{
for(n=0;n<2;n++)
{
switch(n)
{

case (0): first=1;second=1;third=1;GPIO_DIG=0x79;break;
}

        delay10ms();   //延时//
        GPIO_DIG=0;   //消影//

       }
     }


     else if(disvalue>999)      //显示4位//
       {
          for(n=0;n<4;n++)
            {
              switch(n)
               { 
                  case (0): first=0;second=0;third=0;break;
                  case (1): first=1;second=0;third=0;break;
                  case (2): first=0;second=1;third=0;break;
                  case (3): first=1;second=1;third=0;break;
                }
            GPIO_DIG=DisplayData[n];
            delay10ms();   //延时//
            GPIO_DIG=0;   //消影//

              }

          if(fuhao==1)         //当计算结果为负数,最高位显示负号//
           { 

            GPIO_DIG=0X40;
            first=1;second=1;third=1;   

            delay10ms();   //延时//
            GPIO_DIG=0;   //消影//
           }
        }

         else if(disvalue>99)      //显示3位//
         {
            for(n=0;n<3;n++)
             {
               switch(n)
                 { 
                   case (0): first=0;second=0;third=0;break;
                   case (1): first=1;second=0;third=0;break;
                   case (2): first=0;second=1;third=0;break;
                   }
               GPIO_DIG=DisplayData[n];
               delay10ms();   //延时//
               GPIO_DIG=0;   //消影//

              }

           if(fuhao==1)         //当计算结果为负数,最高位显示负号//
             { 

               GPIO_DIG=0X40;
               first=1;second=1;third=1;   

               delay10ms();   //延时//
               GPIO_DIG=0;   //消影//
              }         
           }

           else if(disvalue>9)      //显示2位//
            {
              for(n=0;n<2;n++)
                {
                  switch(n)
                    { 
                      case (0): first=0;second=0;third=0;break;
                      case (1): first=1;second=0;third=0;break;
                     }
                   GPIO_DIG=DisplayData[n];
                   delay10ms();   //延时//
                   GPIO_DIG=0;   //消影//      
                 }

             if(fuhao==1)         //当计算结果为负数,最高位显示负号//
               { 

                 GPIO_DIG=0X40;
                 first=1;second=1;third=1;   

                 delay10ms();   //延时//
                  GPIO_DIG=0;   //消影//
                 } 

             }

            else  //显示1位//
            {
              GPIO_DIG=DisplayData[0];
              first=0;second=0;third=0;

               if(fuhao==1)         //当计算结果为负数,最高位显示负号//
                { 
                  delay10ms();   //延时//
                  GPIO_DIG=0;   //消影//

                  GPIO_DIG=0X40;
                  first=1;second=1;third=1;   

                  delay10ms();   //延时//
                  GPIO_DIG=0;   //消影//
                 }

            }


} 

}

void equal(uchar x) //加减计算子程序//
{

switch(x)       //功能键选择//
        {   
            case 1:Cal_Value=Value_a+Value_b;break;                     //加 x=1//                             
            case 2:if(Value_a>=Value_b){Cal_Value=Value_a-Value_b;}    //减 x=2 //
                   else{Cal_Value=Value_b-Value_a;fuhao=1;}           //差为负数,fuhao符号标记1//
                   break;    

        }     

}

void delay10ms(void)
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}


  • 写回答

1条回答 默认 最新

  • devmiao 2017-05-13 15:55
    关注
    评论

报告相同问题?

悬赏问题

  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码