msp430学习笔记_按键点亮LED(每个代码都有详解,也就是为什么这么做)

本文介绍了如何使用MSP430单片机实现通过按键控制发光二极管(LED)状态改变。通过设置P1口为输入,P2口为输出,并配置中断,当检测到P1口按键按下(下降沿触发)时,相应的LED状态翻转。在中断服务函数中,进行了按键消抖处理,确保了稳定可靠的控制效果。
摘要由CSDN通过智能技术生成
//在系统上实现按一次按键,对应的发光二极管状态改变一次
#include <msp430x14x.h>

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;  //关闭看门狗
  P2DIR = 0XfF;             //全部P2口设置为输出
  P2OUT = 0Xff;             // 全部P2口设置为高电平 灯全灭
  P1OUT = 0Xff;            //P1口全部设置为高电平
  P1DIR = 0Xf0;            //全部P1口按键设置为输入,其他的为输出
  P1IES = 0X0f;            //P1口按键设置为下降沿触发
  P1IFG = 0;                //设置P1口全部无中断请求
  P1IE = 0X0f;            //P1.0~P1.3中断允许
  _EINT();                //开总中断
  while(1)
  _BIS_SR(LPM4_bits);     //进入低功耗模式4
}

//#pragma它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。
/*MSP430内部有一个中断向量表,只要往里面对应向量(实际也是某地址)填相应函数的首地址,
该中断发生时,就能根据填入的函数首地址自动跳转到该函数。
#pragma vector=这句话就是给这个中断向量表进行赋值的。
#pragma vector=PORT1_VECTOR表示给这个向量表中的外部端口中断所对应的地址进行赋值,
并赋值为函数void Port_1(void)的首地址。
其中,关键字__interrupt则表示这个函数是中断服务函数这种特殊函数。*/

#pragma vector = PORT1_VECTOR       //“告诉”编译器把PORT1_VECTOR作为中断函数处理
__interrupt void  PORT1_ISR(void)   //键盘中断
{
  unsigned int i;
  unsigned char temp;
  temp = P1IFG;
  for(i=0;i<0x1fff;i++);        //按键消抖
  if((P1IN&temp) == (!temp))		//判断按键是否按了一次
  {
    switch(temp)
    {
    case 1: P2OUT ^= 0X01;break;      //P2.0状态改变,即LED1状态改变
    case 2: P2OUT ^= 0X02;break;      //P2.1状态改变,即LED2状态改变
    case 3: P2OUT ^= 0X04;break;      //P2.2状态改变,即LED3状态改变
    case 4: P2OUT ^= 0X08;break;      //P2.3状态改变,即LED4状态改变
    }
  }
  P1IFG = 0;      //清楚中断请求位,为什么要清楚中断请求位
                  //中断标志位不清除, 结果是完成中断处理程序后,
                  //它就继续再进中断, 根本不会回到主程序。
}

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值