msp430学习-按键(中断)
这几天看了一下169的按键和中断应用。
一直很纠结PxDIR。下面就用例子记录
比如用流水灯来作为中断:
#include <msp430f169.h> /** * main.c */ void delay_ms(int ms) //延时函数 { for(;ms>0;ms--) __delay_cycles(1000); } void main() { WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer int i=0,j=0; P6DIR = 0xff; //将引脚端口设为输出模式(必须的) P6OUT = 0xff; //将六个LED灯全置低电平 P1DIR &= ~BIT0; //将引脚设为输入模式 P1OUT = BIT0; //P1.0的按键S1打开 P1DIR &= ~BIT1; //将引脚设为输入模式 P1OUT |= BIT1; //P1.1的按键S2打开 P1IE |= BIT0; //P1.0按键S1允许中断 P1IES |= BIT0; //P1.0下降沿使相应中断标志置位 P1IE |= BIT1; //P1.1按键S2允许中断 P1IES |= BIT1; //P1.1下降沿使相应中断标志置位 _EINT(); //开启全局中断 } //中断子函数 #pragma vector=PORT1_VECTOR //设置中断向量(必有) __interrupt void PORT1_key() { _DINT(); //先关闭全局中断,防止重复中断 int i=0,j=0; if(P1IFG & BIT0) //判断是否是按键S1按下 { while(1) { for(i=0;i<8;i++) { P6OUT &= ~((0x01)<<i); //一个一个连着亮,从左到右点亮到第八个 delay_ms(100); } P6OUT = 0xff; for(j=0;j<8;j++) { P6OUT &= ~((0x80)>>j); //一个一个点亮,从右到左点亮到第一个 delay_ms(100); } P6OUT = 0xff; } } else if(P1IFG & BIT1) //判断是否是按键S2按下 { while(1) { for(i=0;i<8;i++) { P6OUT &= ~((0x01)<<i); //LED灯的从做到右的流动(一个一个) delay_ms(100); P6OUT = 0xff; } for(j=0;j<8;j++) { P6OUT &= ~((0x80)>>j); //LED灯从右到左流动(一个一个) delay_ms(100); P6OUT = 0xff; } } } P1IFG = 0x00; //清除中断标志位(必须)
}
还要抓紧学呜呜呜。加油

浙公网安备 33010602011771号