usrbin吧 关注:310贴子:45,934
  • 16回复贴,共1

单片机全局变量初始化问题

只看楼主收藏回复

#include <reg51.h>#include <intrins.h>void system_Ini(void);void printW(unsigned int );bit CheckKeyDown(void );unsigned char lastKey, lastKey3,K3; //键顺序吗
void delay(unsigned char x); //x*0.14MS、void keyscan(void);bit DATA_IN();bit coul();void Display();
unsigned char idata buf[8];unsigned char code SEG_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制unsigned char pos=0;unsigned char temp;
//JP15和JP16用短路帽连接// P1与JP12 用排线连接
int OP1 = 0;int OP2 = 0;int OP = 0;int buff = 0;int key = 0;int Stat = 0;
main(){ system_Ini(); printW(0); for (;;) { if (CheckKeyDown()) { switch (Stat) { case 0: if (key >= 0 && key <= 9) { DATA_IN(); Stat = 1; }
break; case 1: if (key >= 0 && key <= 9) { if (DATA_IN()) Stat = -1;
} else if (key >= 10 && key <= 13) //+ -* / { OP1 = buff; OP = key; Stat = 2; } else if (key == 14) // "=" { OP1 = buff; buff = 0; Stat = 6; } else if (key == 15) // "C" { buff = 0; Stat = 0; }
break;
case 2: if (key >= 0 && key <= 9) { buff = 0; DATA_IN(); Stat = 3;
} else if (key >= 10 && key <= 13) //+ -* / {
OP = key;
} else if (key == 14) // "=" {
Stat = 6; } else if (key == 15) // "C" { buff = 0; Stat = 0; }
break;
case 3: if (key >= 0 && key <= 9) { if (DATA_IN()) Stat = -1;
} else if (key >= 10 && key <= 13) //+ -* / { OP2 = buff; buff = 0; if (coul()) Stat = -1; else Stat = 2; } else if (key == 14) // "=" { OP2 = buff; buff = 0; if (coul()) Stat = -1; else Stat = 6; } else if (key == 15) // "C" { buff = 0; Stat = 0; }
break; case 6: if (key >= 0 && key <= 9) { buff = 0; DATA_IN(); Stat = 1;
} else if (key >= 10 && key <= 13) //+ -* / { OP = key; buff = 0; Stat = 2; } else if (key == 14) // "=" {
} else if (key == 15) // "C" { buff = 0; Stat = 0; } break; case -1: default: if (key == 15) // "C" { buff = 0; Stat = 0; } break; } Display();
}
}
}
bit coul(){ bit r = 0 ; switch (OP) { case 10: //"+" OP1 = OP1 + OP2; break; case 11://"-" OP1 = OP1 - OP2; break;
case 12: //"*" OP1 = OP1 *OP2; break;
case 13: // "/" if (OP2 != 0) OP1 = OP1 / OP2; else r = 1; break;
default: r = 1; break;
} if (OP1>9999)r=1 ; return r;}
bit DATA_IN(){ bit Over = 1; buff = buff * 10 + key; if (buff < 9999) Over = 0; return Over;
}
//把一正整数据变为字形并存入缓存区void printW(unsigned int a){ char i=0; char b; for(i=0;i<8;i++) { b=a%10; a=a/10; if (a==0 && b==0 && i>0) buf[7-i]=0; else buf[7-i]=SEG_Tab[b];



IP属地:广东1楼2012-07-28 23:01回复
    }}
    /***********************************************************purpose: 系统初始化/**********************************************************/void system_Ini(){ TMOD|= 0x11; TH1=0x0f5; //12.000M TL1=0x060; IE = 0x8A; TR1 = 1;}/*************************************************************//* *//* 延时子程序 *//* *//*************************************************************/
    void delay(unsigned char x){ unsigned char j; while((x--)!=0) { for(j=0;j<125;j++) { ;} }}
    /*************************************[ t1 (4ms)中断] 中断
    *************************************/void T1zd(void) interrupt 3 using 1 //3定时器1的中断号 1定时器0的中断号 0外部中断1 2外部中断2 4串口中断{ TH1 = 0x0f0; //12.000 TL1 = 0x060; pos=pos & 0x7; P1=buf[pos]; P2=pos*4; pos++;
    }
    //P0 连接 矩阵键盘bit CheckKeyDown(void ){ K3=~P3;//独立键盘 keyscan();//矩阵键盘 if (key!=lastKey & lastKey==255) { lastKey=key; return 1; }
    else lastKey=key;
    if (K3!=lastKey3) { lastKey3=K3;
    if (K3==1) key=12; else if (K3==2) key=13; else if (K3==4) key=14; else if (K3==8) key=15; else if (K3==16) key=16; else if (K3==32) key=17; else if (K3==64) key=18; else if (K3==128) key=19;
    else {
    K13=key; return 0;
    } return 1;
    } return 0;
    }
    /*************************************************************//* *//* 矩阵键盘扫描子程序 (4*3 的矩阵) P1.4 P1.5 P1.6 P1.7为行 *//* P1.1 P1.2 P1.3为列 *//* key==矩阵键盘引脚所接数据 *//*************************************************************/void keyscan(void){ unsigned char temp = 0; P0=0x0F0; //高四位输入 行为高电平 列为低电平 delay(3); temp=P0; //读P1口 temp=temp&0x0F0; //屏蔽低四位 temp=~((temp>>4)|0xF0); if(temp==1) // p1.4 被拉低 key=0; else if(temp==2) // p1.5 被拉低 key=1; else if(temp==4) // p1.6 被拉低 key=2; else if(temp==8) // p1.7 被拉低 key=3; else key=255;// if (key!=255) { P0=0x0F; //低四位输入 列为高电平 行为低电平 delay(3); temp=P0; //读P0口 temp=temp&0x0F; temp=~(temp|0x0F0); if(temp==2) // p1.1 被拉低 key=key+0; else if(temp==4) // p1.2 被拉低 key=key+4; else if(temp==8) // p1.3 被拉低 key=key+8; else key=255; }
    }
    void Display(){ int i; switch (Stat) { case 0: case 1: case 3: printW(buff); break; case 2: case 6: printW(OP1);
    break; default: for(i=0;i<8;i++) buf[7-i]=0;
    buf[7]=0x79; // Display "E" break;
    }}
    


    IP属地:广东2楼2012-07-28 23:01
    回复
      糟糕。。。。没排版。。。


      IP属地:广东3楼2012-07-28 23:01
      回复
        或者简单描述一下问题吧。。。。在全局变量里面有LastKey,LastKey3没有作初始化,在函数里面直接就调用也没做初始化就直接进行逻辑运算。。。那逻辑运算的结果是否可预测、、、、这是在单片机例程里面的程序


        IP属地:广东4楼2012-07-28 23:04
        回复



          IP属地:广东5楼2012-07-28 23:07
          回复
            其中LastKey变量没做出初始化,那个if应该如何判断?
            LastKey变量只在上面那个CheckKeyDown函数中被引用过。


            IP属地:广东6楼2012-07-28 23:09
            回复
              太高深了,不懂。。另外楼主能订造电 咳咳 磁 炸 咳咳 弹么


              IP属地:广东7楼2012-07-29 10:17
              收起回复
                在玩C51?
                不过看不懂在干啥
                


                IP属地:日本8楼2012-08-05 01:12
                收起回复