打印

求助:请各位帮忙解说一下下面C程序问题出在哪?

[复制链接]
1372|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gmgmgm|  楼主 | 2009-7-20 00:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
电路用P3口直接对地接8个按键,P3端口设置为开漏形式,外部接上拉电阻,
下面是一个等待按键松开的程序,可是它就是不会等待,不知怎么回事;下面的while死循环根本就好像没起作用;用其它端口接了个LED指示灯观察其效果。
void key_off(void)//等待按键松开
{
    uchar key_temp;
    while (1)
    {
        delay_ms(50);//延时

        P3=0xff;//P3端口置高电平

        key_temp=P3;//读入P3端口状态

        if(key_temp==0xff)//按键全松开时退出循环
            {
                key_flag=0;//清除按键是否一直按住标志

                return;//退出死循环
            }
        }    
}


还试过下面的程序,一样不会有所谓的循环等待现象作用

while(P3==0xff)
{
key_flag=0;
}


相关帖子

沙发
jindiaozhanji| | 2009-7-20 10:41 | 只看该作者

建议,因为我也不太懂,呵呵

P3=0xff;//P3端口置高电平
delay_ms(2);延时,让电平稳定
key_temp=P3;//读入P3端口状态



还有我觉得应该把return改成break会好一点,我记得前者是退出循环然后再次判断循环条件,后者则不再判断循环条件。


由于本人水平有限,希望能得到各位大虾砖头,哈哈

使用特权

评论回复
板凳
gmgmgm|  楼主 | 2009-7-20 11:29 | 只看该作者

感谢楼上的大哥

非常感谢楼上的大哥,就是差了一句:
delay_ms(2);延时,让电平稳定
加一句进去就OK了

使用特权

评论回复
地板
修电视的| | 2009-7-20 13:41 | 只看该作者

P3 是不是定义成了 volatile 类型?

如果P3是普通变量,则编译器会议对其进行优化,因为
P3=0xff;//P3端口置高电平
key_temp=P3;//读入P3端口状态
if(key_temp==0xff)//按键全松开时退出循环
在以上过程中,编译器会视P3为一般变量,给它赋值后再读出肯定会不变,所以优化会成了:
if(1)
当然会直接跳出,更没了读过P3;
而:
while(P3==0xff)
{
key_flag=0;
}
这里P3为多少??会不会进循环?


使用特权

评论回复
5
340589344| | 2009-7-22 14:53 | 只看该作者

松手检测

void key_off(void)
{
    uchar key_temp;
    P3=0xff;//P3端口置高电平
    key_temp=P3;//读入P3端口状态
    if(key_temp!=0xff)
            {
                delay(5);
                if(key_temp!=0xff)
                {
                while(key_temp!=0xff);//松手检测,没有松手就死循环
                key_flag=0;//清除按键是否一直按住标志
                }
             }    
}
我一般是这样写的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

135

主题

766

帖子

2

粉丝