【MSP430】MSP430F5529火箭板 --> 按键中断控制LED实验

实验目的:
  测试评估板上的按键和LED

实验内容:
  1、按下s1一次红灯亮1s后熄灭
  2、快速按下s1两次绿灯亮1s后熄灭

bsp_led.h

#ifndef _BSP_LED_H
#define _BSP_LED_H
#include "msp430.h"

#define Set_Bit(val,bitn)   (val |= (/*1 << */(bitn)))
#define Clr_Bit(val,bitn)   (val &= ~(/*1 << */(bitn)))
#define Get_Bit(val,bitn)   (val &  (1 <<bitn))

//LED1
#define LED1_RED_DIR        P1DIR
#define LED1_RED_OUT        P1OUT
#define LED1_RED_SEL        P1SEL
#define LED1_RED_Pin_Num    (BIT0)      //P1^0

#define LED1_RED_IO_Init()  (Set_Bit(LED1_RED_DIR,LED1_RED_Pin_Num))        //初始化IO为输出模式
#define LED1_RED_Set()      (Set_Bit(LED1_RED_OUT,LED1_RED_Pin_Num))
#define LED1_RED_Clr()      (Clr_Bit(LED1_RED_OUT,LED1_RED_Pin_Num))

//LED2
#define LED2_GREEN_DIR      P4DIR
#define LED2_GREEN_OUT      P4OUT
#define LED2_GREEN_SEL      P4SEL
#define LED2_GREEN_Pin_Num  (BIT7)      //P4^7

#define LED2_GREEN_IO_Init()    (Set_Bit(LED2_GREEN_DIR,LED2_GREEN_Pin_Num))
#define LED2_GREEN_Set()        (Set_Bit(LED2_GREEN_OUT,LED2_GREEN_Pin_Num))
#define LED2_GREEN_Clr()        (Clr_Bit(LED2_GREEN_OUT,LED2_GREEN_Pin_Num))

#endif /*_BSP_LED_H*/

bsp_key.h

#ifndef _BSP_KEY_H
#define _BSP_KEY_H
#include<msp430.h>

#define Set_Bit(val,bitn)   (val |= (/*1 << */(bitn)))
#define Clr_Bit(val,bitn)   (val &= ~(/*1 << */(bitn)))
#define Get_Bit(val,bitn)   (val &  (1 <<bitn))

//s1
#define KEY1_DIR        P2DIR
#define KEY1_SEL        P2SEL
#define KEY1_OUT        P2OUT
#define KEY1_IN         P2IN        //按键需读入IO口状态值
#define KEY1_Pin_Num    (BIT1)

#define KEY1_IO_Init()  (Clr_Bit(KEY1_DIR,KEY1_Pin_Num))    //初始化IO状态为读取输入电平状态
#define KEY1_Set()      (Set_Bit(KEY1_OUT,KEY1_Pin_Num))
#define KEY1_Clr()      (Clr_Bit(KEY1_OUT,KEY1_Pin_Num))

#endif /*BSP_LED_H*/

main.c

#include <msp430.h>
#include "bsp_led.h"
#include "bsp_key.h"

#define delay_s(x)  __delay_cycles(x*1000000)
unsigned int n = 0;

void main()
{
    WDTCTL = WDTPW + WDTHOLD;
    LED1_RED_IO_Init();         //初始化设置IO口方向为输出
    LED2_GREEN_IO_Init();

    LED1_RED_Clr();             //关闭LED_RED
    LED2_GREEN_Clr();           //关闭LED_Green

    KEY1_IO_Init();             //读取电平输入
    KEY1_Set();
    P2REN |= KEY1_Pin_Num;      //使能s1按键端口的寄存器
    P2IE  |= KEY1_Pin_Num;      //使能s1按键端口中断
    P2IES |= KEY1_Pin_Num;      //s1中断沿触发控制寄存器
    P2IFG &= ~KEY1_Pin_Num;     //s1中断标志寄存器
    
    _EINT();                    //使能全局中断  __enable_interrupt()
    while(1)
    {
        if(n==0)                //当按键一次都没有按下时,红色和绿色LED都不亮
        {
            LED1_RED_Clr();
            LED2_GREEN_Clr();
        }
        else if(n==1)           //当按键s1按下一次时,红色LED亮1s后灭
        {
            LED1_RED_Set();
            LED2_GREEN_Clr();
            delay_s(1);
            n=0;
        }
        else if(n==2)           //当按键s1快速按下两次时,绿色LED亮1s后灭
        {
            LED1_RED_Clr();
            LED2_GREEN_Set();
            delay_s(1);
            n=0;
        }
    }
}

#pragma vector = PORT2_VECTOR
__interrupt void Port2()
{
    unsigned int i=0;
    if(!(P2IN & KEY1_Pin_Num))      //如果s1被按下   -->  按键共地
    {
        __delay_cycles(5000);       //消抖
        if(!(P2IN & KEY1_Pin_Num))
        {
            while(!(P2IN & KEY1_Pin_Num)){}        //松手检测
            n = 1;
            P2IFG &= ~KEY1_Pin_Num;

            while((P2IN & KEY1_Pin_Num))           //500ms-1000ms内如果不按下,视为只按一次
            {
                i++;
                __delay_cycles(1000);
                if(i>1000)
                    return;
            }
            if(!(P2IN & KEY1_Pin_Num))
            {
              __delay_cycles(5000);       //消抖
               if(!(P2IN & KEY1_Pin_Num))
               {
                 while(!(P2IN & KEY1_Pin_Num)){}  //第二次松手
                 n = 2;
                 P2IFG &= ~KEY1_Pin_Num;
               }
             }
          }
       }
  }
            

代码适用的开发板类型

上述代码可直接烧录到如下图所示的开发板中,作为上手程序:
在这里插入图片描述

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值