单片机全局变量初始化问题
usrbin吧
全部回复
仅看楼主
level 9
kmsmg2004 楼主
#include <reg51.h>#
include 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;elseStat = 2;}else if (key == 14) // "="{OP2 = buff;buff = 0;if (coul())Stat = -1;elseStat = 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;elser = 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;elsebuf[7-i]=SEG_Tab[b];

2012年07月28日 15点07分 1
level 9
kmsmg2004 楼主
}}
/***********************************************************purpose: 系统初始化/**********************************************************/void system_Ini(){TMOD|= 0x11;TH1=0x0f5; //12.000MTL1=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.000TL1 = 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;elsekey=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;elsekey=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;
}}

2012年07月28日 15点07分 2
level 9
kmsmg2004 楼主
糟糕。。。。没排版。。。
2012年07月28日 15点07分 3
level 9
kmsmg2004 楼主
或者简单描述一下问题吧。。。。在全局变量里面有LastKey,LastKey3没有作初始化,在函数里面直接就调用也没做初始化就直接进行逻辑运算。。。那逻辑运算的结果是否可预测、、、、这是在单片机例程里面的程序
2012年07月28日 15点07分 4
level 9
kmsmg2004 楼主
2012年07月28日 15点07分 5
level 9
kmsmg2004 楼主
其中LastKey变量没做出初始化,那个if应该如何判断?
LastKey变量只在上面那个CheckKeyDown函数中被引用过。
2012年07月28日 15点07分 6
level 13
太高深了,不懂。。另外楼主能订造电 咳咳 磁 炸 咳咳 弹么[口水]
2012年07月29日 02点07分 7
找思考君要去吧~。。。奶牛大牛也行,他可是用emp的高手。。。。。
2012年07月29日 16点07分
level 11
[拜]在玩C51?
[钱]不过看不懂在干啥

2012年08月04日 17点08分 8
嗯,在玩c51......
2012年08月05日 03点08分
就是个计算器。。。功能就和普通的16键(0-9+-*/c=)计算器一样。。。。要不把框图发给你。。。。蛮简单的
2012年08月05日 03点08分
回复 @御坂01729 :我也是新手啊。。。连遥控一下小车的水平都没有。。。
2012年08月06日 12点08分
回复 @kmsmg2004 :[汗]计算器水平可高多了。。PS:共勉!
2012年08月06日 18点08分
1