3213|5

22

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

求助:有关按键检测。 [复制链接]

void P1_IODect()
{
        unsigned int Push_Key        =        0;
        Push_Key        =        P1IFG&(~P1DIR);
        __delay_cycles(10000);
        if((P1IN&Push_Key)==0)
        {
                switch(Push_Key)
                {
                case        BIT3:P13_Onclick();break;
                default:                                                        break;
                }
        }
}
实在搞不懂Push_Key        =        P1IFG&(~P1DIR);和(P1IN&Push_Key)==0)是什么意思?
这个程序是P1.3接了个按键,然后按键按下进入中断,中断判断是哪个按键然后进行置反处理,P1.0,P1.6两个LED灯相互闪,我就是问下前面的两句是什么意思?我的想法是是不是判断中断的标志位发生时是要和P1DIR的输入相反的时候要一起的?其实我也不知道我在说什么,真的不懂,求大神解答。

最新回复

       Push_Key        =        P1IFG&(~P1DIR); ——首先,这段程序出现在外部中断服务里面,外部中断是由上升沿或者下降沿触发的。只有输入管脚才能触发外部中断,否则是不安全的设计。 PDIR值为1的位是表示输出管脚,~PDIR则表示输入管脚。 将P1IFG与其进行按位与运算,得到的是触发中断的按键位,也就是按下了哪个按键。 将按键按下这一动作存入Push_Key变量。         __delay_cycles(10000); 延时10000个机器周期之后,你不能保证该按键依旧被按下        if((P1IN&Push_Key)==0) 所以需要再次检测该按键对应的输入信号是否为低(估计管脚接上拉电阻,按键连GND,这么一来按键按下为低电平,按键松开为高电平。)其实这也就是所谓的软件延时消抖了。         {                 switch(Push_Key) 再判断是哪个按键被按下                 {                 case        BIT3:P13_Onclick();break;                 default:                                                        break; 进行相应的处理                 }         }   详情 回复 发表于 2015-11-3 09:43
 
点赞 关注

回复
举报

36

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
我的理解是,你判断按键中断时,首先要确保你的IO口设置为输入。
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

板凳
 
       Push_Key        =        P1IFG&(~P1DIR);
——首先,这段程序出现在外部中断服务里面,外部中断是由上升沿或者下降沿触发的。只有输入管脚才能触发外部中断,否则是不安全的设计。
PDIR值为1的位是表示输出管脚,~PDIR则表示输入管脚。
将P1IFG与其进行按位与运算,得到的是触发中断的按键位,也就是按下了哪个按键。
将按键按下这一动作存入Push_Key变量。
        __delay_cycles(10000);
延时10000个机器周期之后,你不能保证该按键依旧被按下
       if((P1IN&Push_Key)==0)
所以需要再次检测该按键对应的输入信号是否为低(估计管脚接上拉电阻,按键连GND,这么一来按键按下为低电平,按键松开为高电平。)其实这也就是所谓的软件延时消抖了。
        {
                switch(Push_Key)
再判断是哪个按键被按下
                {
                case        BIT3:P13_Onclick();break;
                default:                                                        break;

进行相应的处理
                }
        }


 
 
 

回复

22

帖子

0

TA的资源

一粒金砂(中级)

4
 
AnnyHsu 发表于 2015-11-3 00:13
我的理解是,你判断按键中断时,首先要确保你的IO口设置为输入。

这个之前就已经GPIO_init里面已经设置好了。
 
 
 

回复

22

帖子

0

TA的资源

一粒金砂(中级)

5
 
qiushenghua 发表于 2015-11-3 09:43
Push_Key        =        P1IFG&(~P1DIR);
——首先,这段程序出现在外部中断服务里面,外部中断 ...

回复规格规范,解答十分详细。不愧是版主啊!茅塞顿开。
 
 
 

回复

22

帖子

0

TA的资源

一粒金砂(中级)

6
 
果然论坛出大神啊。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表