Keil if(条件)不成立,还会执行内部代码,高手进来帮忙看一下

houfuzhu 2012-06-05 10:15:37
我是初学者,新手,学习中,遇到if(条件)不成立,还会执行内部代码,网上找一通,也没整明白
劳烦高手指点一下

#include <reg52.h>

unsigned char key;
void DelayS(unsigned int ms);
unsigned char KeyScan();

void main()
{

unsigned char a,b,c,d,e,f,g;
unsigned char Num[10],Wei[4];
unsigned char key1;

a=0xFE;
b=0xFD;
c=0xFB;
d=0xF7;
e=0xEF;
f=0xDF;
g=0xBF;


Num[0]=a&b&c&d&e&f;
Num[1]=b&c;
Num[2]=a&b&g&e&d;
Num[3]=a&b&c&d&g;
Num[4]=f&g&b&c;
Num[5]=a&f&g&c&d;
Num[6]=a&f&e&d&c&g;
Num[7]=f&a&b&c;
Num[8]=a&b&c&d&e&f&g;
Num[9]=f&a&b&c&d&g;
Wei[0]=0x0E;
Wei[1]=0x0D;
Wei[2]=0x0B;
Wei[3]=0x07;
P1=0x00;

/*
EA=1;
TMOD=0x01;
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
ET0=1;
TR0=1;
*/



key=0;

while(1)
{
//个位显示
P1=Wei[3];
P0=0xFF;
P0=Num[key%10];
DelayS(50);

//十位显示
P1=Wei[2];
P0=0xFF;
P0=Num[key/10];
DelayS(50);
key1=KeyScan();
if(key1!=16) key=key1;
}
}
/*
void Timer0() interrupt 1
{
unsigned char key1;
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;

key1=KeyScan();
if(key1!=16) key=key1;
}
*/
unsigned char KeyScan()
{
unsigned char KeyCode,Press1,Press2,cond;
unsigned int i;
unsigned char code KeyCodes[16] = {0xEE,0xDE,0xBE,0x7E,
0xED,0xDD,0xBD,0x7D,
0xEB,0xDB,0xBB,0x7B,
0xE7,0xD7,0xB7,0x77};

Press1=0x0F;
P2=0x0F;
if ((Press1^P2)==0x01) //为什么条件不成立也会执行内部的代码
{
DelayS(10);
if ((Press1^P2)==0x01)//为什么条件不成立也会执行内部的代码
{
Press1=P2;
P2=0xF0;
Press2=0xF0;
P2=0xF0;
Press2=P2;

for(i=0;i<16;i++)
{
if(((Press1 | Press2)^KeyCodes[i])==0x00)//为什么条件不成立也会执行内部的代码
{
return i;
}
}
}
}
else
{
return 16;
};
}

void DelayS(unsigned int ms)
{
unsigned int i,j;
for(i=ms;i<0;i--)
for(j=0;j<110;j++);

}
...全文
1717 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
qyhah 2012-06-17
  • 打赏
  • 举报
回复
把这句话拆开来 if ((Press1^P2)==0x01,单独先取P2值,在和Press1^, 跟踪一下取P2状态,既有可能是P2的状态不对导致if结果不对。
Binzo 2012-06-12
  • 打赏
  • 举报
回复
我不相信。
schlafenhamster 2012-06-12
  • 打赏
  • 举报
回复
产生list文件看汇编!
aydf1 2012-06-12
  • 打赏
  • 举报
回复
if(0)或if(1)
代替原来的判定条件,即可判断是不是判断条件的问题。
wuzijin2012 2012-06-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

P2=0x0F;楼主好笑啊,只给P2赋值,没给P2声明数据类型,自己代码错误,还怪KEIL;
[/Quote]
啊哦,P2是IO口,是我说错了
wuzijin2012 2012-06-12
  • 打赏
  • 举报
回复
P2=0x0F;楼主好笑啊,只给P2赋值,没给P2声明数据类型,自己代码错误,还怪KEIL;
schlafenhamster 2012-06-12
  • 打赏
  • 举报
回复
0008 65A0 XRL A,P2
读P2口的值!
000A 6401 XRL A,#01H
schlafenhamster 2012-06-12
  • 打赏
  • 举报
回复
0000 75000F R MOV Press1,#0FH
; SOURCE LINE # 93
0003 75A00F MOV P2,#0FH
; SOURCE LINE # 94
0006 E500 R MOV A,Press1
0008 65A0 XRL A,P2000A 6401 XRL A,#01H
000C 7038 JNZ ?C0005
; SOURCE LINE # 95
; SOURCE LINE # 96
000E 7F0A MOV R7,#0AH
0010 FE MOV R6,A
0011 120000 R LCALL _DelayS
knate 2012-06-12
  • 打赏
  • 举报
回复
9成是你对代码理解的有问题.

麻烦你先把 带注释的这两行要来干什么的,先解释一下.
然后你理解这两个
具体是什么功能
看看两者有什么不同.

KEIL bug倒有,但不会在这语言翻译出问题.
gaoj39 2012-06-11
  • 打赏
  • 举报
回复
观看中啊,多测试几次了
lr2131 2012-06-07
  • 打赏
  • 举报
回复
LZ注意看看在keil编译器的设置中设置的编译优化等级是怎么样的。建议在调试功能时不要开启优化,除非很清楚每个优化等级将在什么地方做出什么样的优化,或者说有其他的方式防止代码被编译优化,其实volatile就是其中一种方式。
lr2131 2012-06-07
  • 打赏
  • 举报
回复
LZ可以用调试器跟踪一下代码,看看是不是在条件不成立时也进去了。
或者加个标记量,在程序的最后让某个器件(LED,BEEP)给出响应,看看到底是不是真地如你自己所说。不然,问题不在这块,直接误导了自己和别人,问题可能就越查越远了。

如果确认确实是在条件不成立时也进去,并且检查了相应的硬件电路也没问题。那么在文件开头的全局变量前边加volatile试试:也即是将unsigned char key; 改为 volatile unsigned char key;
如果只在本文件内部使用的话static volatile unsigned char key;如果还需要在外部文件中使用的话:
.c文件中定义extern volatile unsigned char key = INIT_VALUE;对应的.h文件中声明
extern volatile unsigned char key;
LZ也可以先试着这样改改,看看有没有什么变化。



woshi_ziyu 2012-06-06
  • 打赏
  • 举报
回复
Press1^P2)==0x01)

试试

Press1^P2)==0x00)

和外部硬件电路相关
  • 打赏
  • 举报
回复
你确定进去了? 怎么确定的..

真确定进去的话,那肯定就是成立的,这样的话,思路放在怎么成立的,更靠谱些..
net_friends 2012-06-06
  • 打赏
  • 举报
回复
你怎么知道不成立
dsoyy 2012-06-06
  • 打赏
  • 举报
回复
if(0)或if(1)
代替原来的判定条件,即可判断是不是判断条件的问题。
aydf1 2012-06-06
  • 打赏
  • 举报
回复
你确定进去了? 怎么确定的..

真确定进去的话,那肯定就是成立的,这样的话,思路放在怎么成立的,更靠谱些

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧