KEIL编译正确单片机运行错误? 求高手啊

uchar a1,b1。dflag是总数不能大于四,当a1为0后,用dflag-(b1%0x10);当a1不为0,则判断b1+dflag是否大于4,如果大于四,则不动作,小于四则dflag=dflag+(b%0x10)并将a1左移4位。(因为a1为2个单数的组合)
if(a1/0x10==bflag)
{
if(((a1<<4)/0x10)==0)
{
dflag=dflag-(b1%0x10);
b1=0;
a1=0;
}
else
{
if((dflag+(b1%0x10))<=0x04)
{
a1=a1<<4;
dflag=dflag+(b1%0x10);
yiweiflag=1;
}
}
}
a1的范围是1至5整数,由其他单片机发送
b1的范围是0至4整数,由其他单片机发送

经不断复查。最后发现if((dflag+(b1%0x10))<=0x04)
有问题,把0x04改到大于0x10就能运行了。
但是问题在于我在keil里0x04是完美运行的啊。。。好奇怪啊(我保证其他单片机发送的数据也正确,求证过了)

朋友,你要达到的目的如果只是以上那段要求的话,第一句 if(a1/0x10==bflag)就多了,在这我需要提示的是,你在第一句用的是a1的高4位与bflag做的比较!!!
其他单看你语法,都是对的,所以不能指出什么问题,我想是你的逻辑上出现的问题,我只能提供书写简化的建议如下(以下指令与楼主程序达到目的是一样的)
if(a1/16==bflag) //判断a1的高4位等于bflag
{
if(a1%16==0) //a1的低4位等于0
{
dflag=dflag-(b1%16);
b1=0;
a1=0;
}
else
{
if((dflag+(b1%16))<=4)
{
a1=a1<<4; //这里a1变掉了,所以要特别注意,不能用同一个a1进行循环
dflag=dflag+(b1%16);
yiweiflag=1;
}
}
}
另外,程序注释的部分,麻烦你特别看下,是不是你需要达到的目的,如果不是的话,你可能就需要改动你自己的程序了
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-08-03
ia1/0x10==bflag;
if(!a1==0)//不等于0时候
{ if(( b1+dflag)<4)

dflag=dflag+(b%0x10)
a1=a1<<4;
dflag=dflag+(b1%0x10);
yiweiflag=1;
}

dflag =dflag-(b1%0x10);
这个应该是你描述的意思吧追问

不是啊。if((dflag+(b1%0x10))<=0x04)
这句我在keil里运行很好啊,但是单片机就不行,烧进去就错误

追答

你说的错误是指结果 不对呢?还是压根不能运行啊?

第2个回答  2011-08-03
更新一下,编译器版本试一下追问

跟编译器没关系吧。。

追答

我做的程序在uv3编译的就不能正常工作,改为uv4后就没问题了。

第3个回答  2011-08-03
dsdfsa追问

dsdfsa妹啊

追答

型号选错了吧