189
社区成员
发帖
与我相关
我的任务
分享#include <msp430.h>
void delay_ms(int ms)
{
for(;ms>0;ms--)
{
__delay_cycles(1000);
}
}
/**
* main.c
*/
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
P1DIR&=~BIT1;
P1REN|=BIT1;
P1OUT|=BIT1;
P1IE|=BIT1;
P1IES|=BIT1;
P1DIR|=BIT0;
P1OUT|=BIT0;
P1IFG&=~BIT1;
while(1)
{
}
return 0;
}
#pragma vector = PORT1_VECTOR
__interrupt void Port_1(void)
{
if(P1IFG&BIT1)
{
delay_ms(20);
while(!(P1IN&BIT1));
P1OUT^=BIT0;
P1IFG=0;
}
}
这段代码首先关闭了看门狗定时器,然后配置了P1.1引脚为输入,并启用了内部上拉/下拉电阻。然后,它允许P1.1引脚产生中断,并将中断触发边缘设置为下降沿。接下来,它配置了P1.0引脚为输出,并设置该引脚为高电平。最后,它清除了P1.1的中断标志。
在中断服务例程(ISR)中,如果P1.1的中断标志被设置,那么代码首先延时20毫秒(用于去抖),然后等待P1.1引脚为高电平。然后,它切换P1.0引脚的状态,并清除P1.1的中断标志。
整体来看,这个代码应该是在设置一个按钮中断,当按下按钮(连接到P1.1)时,会切换LED的状态(连接到P1.0)。
至于代码是否有问题,取决于具体的硬件连接和你的需求。但是,通常在处理按钮中断时,你可能需要考虑消除抖动。这个代码中有一个简单的延时去抖,但这可能不是最佳的去抖方案。在更复杂的应用中,你可能需要使用更复杂的去抖策略,比如软件去抖