Younin123 2021-11-07 21:36 采纳率: 0%
浏览 118

keil单片机简易计算机有bug;求指点

第一次输入时会卡两次,除颤试过了,没用,除了第一次意外都能正常输入
还有输入1时会闪一下然后变成0;

下面是程序

#include <REGX52.h>  
#define uint unsigned int //
#define uchar unsigned char 
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xFF};
uchar anjian[ ]={0x7f,0xbf,0xdf,0xef};//
sbit w1=P2^0;
sbit w2=P2^1;
sbit w3=P2^2;
sbit w4=P2^3;
int result=0;//
int higher=0;//×î¸ßλ
int play;//
> 
uchar c,now=0,k,temp;
int i;
int ok;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void  delay(unsigned int z)//延时函数
 {
     unsigned int x,y;
     for(x=z;x>0;x--)
     for(y=125;y>0;y--);
 }
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
uint jiance()//°按键检测程序
{
        int k,a,b,f=0,g=0; 
        for(a=0;a<4;a++)
        {
                P1=anjian[a];
                temp=P1&0x0f;
                if(temp!=0x0f)
                {
                        switch(temp)
                        {
                                case 0x07:b=0;delay(25);break;
                                case 0x0b:b=1;delay(25);break;
                                case 0x0d:b=2;delay(25);break;
                                case 0x0e:b=3;delay(25);break;
                        }
                        break;                        
                }
                
        }
                            f++;
                            if(f==g)
                            {
                                    ok=1;
                            }
                            else
                            {
                                    ok=0;
                            }
                            g=f;
                            c=b+(a*4);
                            switch(c)
                                    {
                                            case 0:    k=1; break;
                                            case 1: k=2; break;
                                            case 2: k=3; break;
                                            case 3: k=11; break;//+
                                            case 4: k=4; break;                    
                                            case 5: k=5; break;
                                            case 6: k=6; break;            
                                            case 7: k=12; break;//-
                                            case 8: k=7; break;
                                            case 9: k=8; break;
                                            case 10: k=9; break;
                                            case 11: k=13; break;//*
                                            case 12: k=16; break;//Í˸ñ
                                            case 13: k=0; break;
                                            case 14: k=15; break;//=
                                            case 15: k=13; break;// /
                                    }    
                                    return(k);
}
void display(int number)//¾数码管显示函数
{
        int L1,L2,L3,L4;
        int l1,l2,l3,l4;
        L4=(number%10);//¸öλ
        l4=L4;
    
        L3=((number-L4)%100)/10;//ʮλ
        if(number<10)
        {
                l3=10;
        }
        if(number>=10)
        {
                l3=L3;
        }

        L2=((number-L4-(L3*10))%1000)/100;//°Ùλ
        if(number<100)
        {
                l2=10;
        }
        
        if(number>=100)
        {
                l2=L2;
        }
        
        L1=((number-L4-(L3*10)-(L2*100))%10000)/1000;//ǧλ
        if(number<1000)
        {
                l1=10;
        }
        if(number>=1000)
        {
                l1=L1;
        }
        
        while(1)
        {
                P0=table[l1];
                w1=0;
                delay(1);
                w1=1;
                
                P0=table[l2];
                w2=0;
                delay(1);
                w2=1;
                
                P0=table[l3];
                w3=0;
                delay(1);
                w3=1;
                
                P0=table[l4];
                w4=0;
                delay(1);
                w4=1;
            
                jiance();
                
                if(ok==0)
                {
                     break;
                }
        }
}
void accum(int i)/累加
{
        result=result*10+i;
        play=result;//Ö±½ÓÏÔʾ
        delay(20);
}
void addition()//加减乘除
{        
        switch(now)
    {
        case 0: higher=result; result=0; break;//µÚÒ»´Î
        case 1: higher=higher+result; result=0; play=result; break;//¼Ó·¨
        case 2: higher=higher-result; result=0; play=result; break;//¼õ·¨
        case 3: higher=higher*result; result=0; play=result; break;//³Ë·¨
        case 4: higher=higher+result; result=0; play=result; break;//³ý·¨
    }
}
void back()//Í˸ñ
{
        result=result/10;
        play=result;
}
void is()//µÈÓÚ
{
        switch(now)
        {
            case 0: higher=result;result=0; break;//µÚÒ»´Î
            case 1: higher=higher+result; play=result; result=0; break;//¼Ó·¨
            case 2: higher=higher-result; play=result; result=0; break;//¼õ·¨
            case 3: higher=higher*result; play=result; result=0; break;//³Ë·¨
            case 4: higher=higher/result; play=result; result=0; break;//³ý·¨
        }
        now=0;
        display(higher);
        play=higher;
}
uint ererr()//±¨´í
{
        return(12);
}
void main()//¼ÆËãÖ÷º¯Êý
{
            int mo=1;
            while(1)
            {            
                        while(mo)
                        {
                                i=jiance();
                                if(ok==0)
                                {        
                                        delay(100);
                                        if(ok==0)
                                        {
                                                mo=0;
                                        }
                                }
                        }
                        mo=1;
                        switch(i)
                        {
                                case 0:accum(i); break;//累加
                                case 1:accum(i); break;//Ê®±¶ÀÛ¼Ó
                                case 2:accum(i); break;//Ê®±¶ÀÛ¼Ó
                                case 3:accum(i); break;//Ê®±¶ÀÛ¼Ó
                                case 4:accum(i); break;//Ê®±¶ÀÛ¼Ó
                                case 5:accum(i); break;//Ê®±¶ÀÛ¼Ó
                                case 6:accum(i); break;//Ê®±¶ÀÛ¼Ó
                                case 7:accum(i); break;//Ê®±¶ÀÛ¼Ó
                                case 8:accum(i); break;//Ê®±¶ÀÛ¼Ó
                                case 9:accum(i); break;//Ê®±¶ÀÛ¼Ó
                                case 11: addition(); now=1; break;//加
                                case 12: addition(); now=2; break;//减
                                case 13: addition(); now=3; break;/乘
                                case 14: addition(); now=4; break;//除
                                case 15: is(); break;//等于
                                case 16: back(); break;//退格                        
                                case 17: ererr(); break;//

                        }
                        display(play);    
        }
}

  • 写回答

1条回答 默认 最新

  • 踢足球的阿坤 2023-02-08 02:58
    关注

    出现bug的常见原因: 1、单片机控制代码中程序存在逻辑错误或者是设置控制参数不对导致功能失效或者判断失效; 2.编译器错误,或者是系统变量设置不当,单片机运行超时时间不够; 3.硬件原因,可以检查IO口电平变化,很可能线路有短路问题; 4.中断处理函数缺失或者内存地址冲突,也有可能乱码出现,导致执行结果不正确; 5.单片机芯片执行波形出现问题,在示波器上检查芯片的运行波形,观察有无异常,如有异常可更换产品。

    评论

报告相同问题?

问题事件

  • 创建了问题 11月7日

悬赏问题

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