demo1
实现功能:按一下按键,led2变换一下亮灭状态。
#include <msp430.h>
//这个宏仅针对8MHz
#define delay_us(us) __delay_cycles(8*(us))
#define delay_ms(ms) __delay_cycles(8000*(ms))
int main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
BCSCTL1 = CALBC1_8MHZ; //设置 DCO 频率为8MHz
DCOCTL = CALDCO_8MHZ;
P1DIR |= BIT6; //设置P1.0口为输出
P1REN |= BIT3;//启用P1.3内部上下拉电阻
P1OUT |= BIT3;//将电阻设置为上拉
P1DIR &= ~(BIT3); // P1.3设为输入
P1IES |= BIT3;// P1.3设为下降沿中断
P1IE |= BIT3 ;// 允许P1.3中断
P1IFG &= ~BIT3; //中断标志位清零
_EI NT(); //开总中断
return 0;
}
/*中断服务程序*/
#pragma vector = PORT1_VECTOR
__interrupt void PORT_1(void) {
delay_ms(1);//消抖
if((P1IN & BIT3) == 0){
P1OUT ^= BIT6;
}
P1IFG &= ~BIT3; //中断标志位清零
}
demo2
实现功能:快速按按键两次,led2变换一下亮灭状态。
#include <msp430.h>
//这个宏仅针对8MHz
#define delay_us(us) __delay_cycles(8*(us))
#define delay_ms(ms) __delay_cycles(8000*(ms))
int main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
BCSCTL1 = CALBC1_8MHZ; //设置 DCO 频率为8MHz
DCOCTL = CALDCO_8MHZ;
P1DIR |= BIT6; //设置P1.0口为输出
P1REN |= BIT3; //启用P1.3内部上下拉电阻
P1OUT |= BIT3; //将电阻设置为上拉
P1DIR &= ~(BIT3); // P1.3设为输入
P1IES |= BIT3; // P1.3设为下降沿中断
P1IE |= BIT3; // 允许P1.3中断
P1IFG &= ~BIT3; //中断标志位清零
_EINT(); //开总中断
return 0;
}
/*中断服务程序*/
#pragma vector = PORT1_VECTOR
__interrupt void PORT_1(void) {
delay_ms(1); //消抖
while ((P1IN & BIT3) == 0)
; //P1.3低
int times = 0;
while ((P1IN & BIT3)) { //P1.3高
times++;
delay_ms(1);
if (times > 120) {//说明只按了一次按键。此值自己多试几下
goto exit_interrupt;
}
}
P1OUT ^= BIT6;
exit_interrupt: P1IFG &= ~BIT3; //中断标志位清零
}