我设置P1.3按键中断,在调试的时候,发觉P1IN默认是0x0020,这个不是我的问题。
我的问题是,当按下按键,松开后判断(P1IN & BIT3)这语句为什么是真。我的理解是松开后P1IN=0x0020,与BIT3按位与应该为0。
我是在LaunchPad板子上采用CCS_V5.1调试的。
程序是想实现按键时间长一点来置换P1.0口,按键时间短就不动作。
如果屏蔽蓝色 P1IFG = 0; 这句,
我按下按键之后,程序虽然一直在红色循环里面,但是P1.0照样能置换。如果P1.0能置换,那么中断标志位也应该能清除啊,可是程序没有清除。
程序完全不按语法规则跑,我很无语。请问为什么啊!
#include<msp430g2553.h>
typedef unsigned int uint;
#define keyin (P1IN & BIT3)
uint num=0,i;
void delay() //延时函数
{
uint j;
for(j=0;j<5000;j++);
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1IES |= BIT3; // P1.3 high-to-low transition
P1IE |= BIT3;
P1DIR &= ~BIT3;
P1OUT |= ~BIT3;
P1IFG &= ~BIT3;
P1DIR |= BIT0;
P1OUT |= BIT0;
P1REN |= BIT3;
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/ interrupt
}
#pragma vector=PORT1_VECTOR //p1按键中断
__interrupt void P1_ISR(void)
{
if(P1IFG & BIT3)
{
if(keyin == BIT3) //如果是第一个按键被按下
{
if(keyin == BIT3)
{
while(P1IN & BIT3) //等待按键放开
{
num++;
delay();
}
if(num>20000)
{
num=0;
P1OUT ^= 0X01;
P1IFG = 0;
} } } }
P1IFG = 0; num=0;
return;
}
Bill Kent:
请问大家,有木有更好的检测按键时间长短的算法
Peter_Zheng:
回复 Bill Kent:
不用中断,用端口扫描的方式,来判断电平的变化进行按键时间长短的判断。
Hardy Hu:
去抖时间太长了,5000*20000再乘上循环所需时间,估计得100M个cycle,默认配置MCU才1Mhz的主频,也就是得按100S左右才有翻转的响应
Hardy Hu:
需要计算按键的时间还是去抖动?
1.计算按键时间:定时器+按键中断的方式,注意抖动的影响;
2.去抖动:进中断后简单延时在查询IO的电平即可判断
TI中文支持网



