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;                //清除中断标志位(必须)

}

还要抓紧学呜呜呜。加油

posted @ 2021-07-21 19:56  撒几办  阅读(478)  评论(0)    收藏  举报