C语言调用一个函数无法跳出,死循环

这是主函数:main(){//Init_lcd1602();Init_timer();//Wlcd_string(0x80,word1);//Wlcd_string(0x... 这是主函数:
main()
{
// Init_lcd1602();
Init_timer();

// Wlcd_string(0x80,word1);
// Wlcd_string(0xc0,word2);
while(1)
{
// Wlcd_string(0xc0,word2);
keyscan(); 问题是调用keyscan()函数后还会继续跳回这一句,循环调用这个函数,不往下走,这是怎么回事?请大侠们给指导一下。
Wlcd_cmd(0xc0);
Wlcd_data(2 + '0');
}
}

这是被调用的子函数,单独源文件
void keyscan (void)
{
P2 = 0xf0;
if((P2&0xf0) != 0xf0)
{
switch (P2)
{
case 0xe0:
row = 1;
break;
case 0xd0:
row = 2;
break;
case 0xb0:
row = 3;
break;
case 0x70:
row = 4;
break;
default:
break;
}
}
for (i=1000;i>0;i--);

P2 = 0x0f;
if((P2&0x0f) != 0x0f)
{
switch (P2)
{
case 0x07:
tier = 1;
break;
case 0x0b:
tier = 2;
break;
case 0x0d:
tier = 3;
break;
case 0x0e:
tier = 4;
break;
default:
break;

}
}
Key_value = 4*(tier-1)+row;
}
可能是我没说太清楚,现在的问题不是while(1)死循环的问题,我就是要这个死循环。
问题是main函数里调用keyscan()函数后,不继续往下走,而是重新调用keyscan(),这个死循环不是我想要的,也想知道问题在哪?

不过我自己已经解决了。就是把Key_value = 4*(tier-1)+row;这句提到它上面那个大括号以内。原因大家可以探讨一下,我暂时还没想通。
展开
 我来答
ynanfang
2012-11-14 · 超过34用户采纳过TA的回答
知道答主
回答量:75
采纳率:0%
帮助的人:45.9万
展开全部
应该是已经走了。
但是你Keyscan后就调用另外两个函数。而两个函数也没有个执行的显示,所以看上去就象是一直在执行keyscan函数一样。
而且你的while(1)这个执行条件,一直就是真。所以,你这个程序,首先是无法跳出循环
第二,循环肯定是已经执行了另外两个方法,但是因为你的两个函数没有输出提示,所以你误以为没有执行。
建立你在两个函数里用两个输出语句,你就可以看到,你的这两个函数实际已经执行了。
追问
不是这样的,main函数里后两个函数会输出一个数字2,这个是为了调试用,我设置断点测试过了,确实是死在keyscan这句调用语句了。
追答
那可以跟踪一下Keyscan函数,看看执行到什么地方.或者你还是在个函数执行的每一句后面都输出点东西看看:
main()
{
// Init_lcd1602();
Init_timer();

// Wlcd_string(0x80,word1);
// Wlcd_string(0xc0,word2);
while(1)
{
out("准备执行keyscan");
keyscan(); 问题是调用keyscan()函数后还会继续跳回这一句,循环调用这个函数,不往下走,这是怎么回事?请大侠们给指导一下。
out("执行keyscan完成");
out("准备执行Wlcd_cmd");
Wlcd_cmd(0xc0);
out("执行WlCd_cmd完成");
Wlcd_data(2 + '0');
}
}
anglerbug_
2012-11-14 · TA获得超过6.9万个赞
知道大有可为答主
回答量:9104
采纳率:75%
帮助的人:3207万
展开全部
while(1)

你这个条件永远为真,所以是这个循环死循环了,你可以再里面设置一个标记flag 当flag为假的时候跳出while循环
追问
可能我没说太清楚,现在是死循环在keyscan()这个调用函数语句上。while(1)没问题。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
kenshibin
2012-11-14 · TA获得超过175个赞
知道小有建树答主
回答量:591
采纳率:80%
帮助的人:141万
展开全部
while(1)
{
// Wlcd_string(0xc0,word2);
keyscan();
Wlcd_cmd(0xc0);
Wlcd_data(2 + '0');
}
不是调用函数的问题。。。。while(1)条件永远为真 循环内部又没有跳出点 所以死循环了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
靓丽还清湛的标兵5177
2012-11-14 · TA获得超过1649个赞
知道小有建树答主
回答量:1032
采纳率:100%
帮助的人:952万
展开全部
两处 switch (P2) 这个写法不对, 不能正确的扫描到按键情况 换成下面的:
switch (P2&0x0f)
switch (P2&0xf0)
其它的你得自己检查函数 Wlcd_data(); 看它内部有没有把你的相关信息输出
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lgq0608
2012-11-14
知道答主
回答量:37
采纳率:0%
帮助的人:15.6万
展开全部
真不知道你写那个keysan()函数干嘛用的,也没看到你在哪里定义了变量tier,
P2 = 0xf0;
if((P2&0xf0) != 0xf0)
{
switch (P2)
{
case 0xe0:
row = 1;
break;
case 0xd0:
row = 2;
break;
case 0xb0:
row = 3;
break;
case 0x70:
row = 4;
break;
default:
break;
}
}

你觉得这些语句有用吗?
for (i=1000;i>0;i--);

这个语句纯粹是浪费时间。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式