打印

基于MSP430G2553简单的多按键中断例程

[复制链接]
4149|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dirtwillfly|  楼主 | 2015-4-21 15:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*
* 基于MSP430G2553简单的多按键中断例程
* 硬件描述:Launchpad G2553开发板上P2.2\P2.3\P2.4\P2.5分别接四个按钮
* P1.0\P1.1\P1.2\P1.2分别接四个LED灯
* 功能描述:按键按下的瞬间,相对于的LED灯亮,其他的灯灭
*  Created on: 2015-4-3
*  Author: SMU 万有文
*/
#include "MSP430G2553.h"
//-----在main函数前提前申明函数-----
void P2_IODect();                      //时间检测函数
void P22_Onclick();                    //中断函数1
void P23_Onclick();                    //中断函数2
void P24_Onclick();                    //中断函数3
void P25_Onclick();                    //中断函数4
void GPIO_init();                      //端口初始化函数
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关狗
GPIO_init();    //IO初始化
_enable_interrupts();  //使能总中断
_bis_SR_register(LPM3_bits);//休眠
}
/******************************************************************************************************
* 名       称:GPIO_Init()
* 功       能:设定按键和LED控制IO的方向,启用按键IO的上拉电阻
* 入口参数:无
* 出口参数:无
* 说       明:无
* 范       例:无
******************************************************************************************************/
void GPIO_init()
{
//-----设定P1.0和P1.6的输出初始值-----
//P1DIR |= BIT0+BIT1+BIT2+BIT3;  //设定P1.0和P1.3为输出
//P1OUT &= ~(BIT0+BIT1+BIT2+BIT3); //设定P1.0初值
//-----配合机械按键,启用内部上拉电阻-----
P2REN |= BIT2+BIT3+BIT4+BIT5;  //启用P2.2...内部上下拉电阻
P2OUT |= BIT2+BIT3+BIT4+BIT5;  //将电阻设置为上拉
//-----配置P1.3中断参数-----
P2DIR &= ~(BIT2+BIT3+BIT4+BIT5); // P2.2....设为输入(可省略)
P2IES |= BIT2+BIT3+BIT4+BIT5;    // P2.2....设为下降沿中断
P2IE  |= BIT2+BIT3+BIT4+BIT5;    // 允许P2.2..中断
}
/******************************************************************************************************
* 名       称:PORT1_ISR()
* 功       能:响应P1口的外部中断服务
* 入口参数:无
* 出口参数:无
* 说       明:P1.0~P1.8共用了PORT1中断,所以在PORT1_ISR()中必须查询标志位P1IFG才能知道
*       具体是哪个IO引发了外部中断。P1IFG必须手动清除,否则将持续引发PORT1中断。
* 范       例:无
******************************************************************************************************/
#pragma vector = PORT2_VECTOR                      //端口2的中断向量
__interrupt void PORT2_ISR(void)
{
//-----启用Port1事件检测函数-----
P2_IODect();       //检测通过,则会调用事件处理函数
    P2IFG=0;                   //退出中断前必须手动清除IO口中断标志
}
/******************************************************************************************************
* 名       称:P1_IODect()
* 功       能:判断具体引发中断的IO,并调用相应IO的中断事件处理函数
* 入口参数:无
* 出口参数:无
* 说       明:该函数兼容所有8个IO的检测,请根据实际输入IO激活“检测代码”。
*       本例中,仅有P1.3被用作输入IO,所以其他7个IO的“检测代码”没有被“激活”。
* 范       例:无
******************************************************************************************************/
void P2_IODect()
{
unsigned int Push_Key=0;
//-----排除输出IO的干扰后,锁定唯一被触发的中断标志位-----
Push_Key=P2IFG&(~P2DIR);
//-----延时一段时间,避开机械抖动区域-----
__delay_cycles(10000);   //消抖延时
//----判断按键状态是否与延时前一致-----
if((P2IN&Push_Key)==0)          //如果该次按键确实有效
   {
  //----判断具体哪个IO被按下,调用该IO的事件处理函数-----
   switch(Push_Key){
//  case BIT0: P10_Onclick();  break;
//  case BIT1:  P11_Onclick();  break;
  case BIT2:  P22_Onclick();  break;
  case BIT3:  P23_Onclick();  break;
  case BIT4:  P24_Onclick();  break;
  case BIT5:  P25_Onclick();  break;
//  case BIT6:  P16_Onclick();  break;
//  case BIT7:  P17_Onclick();  break;
  default:       break;  //任何情况下均加上default
  }
   }
}
/******************************************************************************************************
* 名       称:P2_Onclick()
* 功       能:P2.的中断事件处理函数,即当P2.键被按下后,下一步干什么
* 入口参数:无
* 出口参数:无
* 说       明:使用事件处理函数的形式,可以增强代码的移植性和可读性
* 范       例:无
******************************************************************************************************/
void P22_Onclick()                               //可换作用户执行的相应函数
{
    P1DIR |= BIT0;
//-----翻转IO电平-----
P1OUT ^= BIT0;
P1OUT &= ~(BIT1+BIT2+BIT3);
}
void P23_Onclick()                                //可换作用户执行的相应函数
{
  P1DIR |= BIT1;
//-----翻转IO电平-----
P1OUT ^= BIT1;
P1OUT &= ~(BIT0+BIT2+BIT3);
}
void P24_Onclick()                                //可换作用户执行的相应函数
{
  P1DIR |= BIT2;
//-----翻转IO电平-----
P1OUT ^= BIT2;
P1OUT &= ~(BIT0+BIT1+BIT3);
}
void P25_Onclick()                                //可换作用户执行的相应函数
{
  P1DIR |= BIT3;
//-----翻转IO电平-----
P1OUT ^= BIT3;
P1OUT &= ~(BIT0+BIT1+BIT2);
}

相关帖子

沙发
ccw1986| | 2015-4-21 20:07 | 只看该作者
谢谢分享
我想问一下,按键用扫描的好还是用中断的好呢?

使用特权

评论回复
板凳
dirtwillfly|  楼主 | 2015-4-21 21:37 | 只看该作者
ccw1986 发表于 2015-4-21 20:07
谢谢分享
我想问一下,按键用扫描的好还是用中断的好呢?

肯定用中断好,用扫描会浪费很多mcu的执行时间

使用特权

评论回复
地板
perry_peng| | 2015-4-22 08:36 | 只看该作者
谢谢分享。

使用特权

评论回复
5
smilingangel| | 2015-4-22 19:50 | 只看该作者
楼上这种用法我还没理解的。。:L

使用特权

评论回复
6
ccw1986| | 2015-4-29 09:18 | 只看该作者
dirtwillfly 发表于 2015-4-21 21:37
肯定用中断好,用扫描会浪费很多mcu的执行时间

有没有那种单片机通用的键盘,想ps2那样的
有了键盘直接和单片机相连就可以的

使用特权

评论回复
7
dirtwillfly|  楼主 | 2015-4-29 10:19 | 只看该作者
ccw1986 发表于 2015-4-29 09:18
有没有那种单片机通用的键盘,想ps2那样的
有了键盘直接和单片机相连就可以的 ...

没有通用的,都是个人设计的
一般常用的也就是4*4键盘

使用特权

评论回复
8
cowboy2014| | 2015-4-29 14:35 | 只看该作者
多按键的是不是和单片机的用法差不多?

使用特权

评论回复
9
quray1985| | 2015-4-30 08:36 | 只看该作者
非常好的例程
这下入门可以方便多了

使用特权

评论回复
10
cowboy2014| | 2015-4-30 10:57 | 只看该作者
按键程序是不是最锻炼一个人的思维?

使用特权

评论回复
11
冰河w| | 2015-5-19 21:19 | 只看该作者
学习了,谢谢

使用特权

评论回复
12
dirtwillfly|  楼主 | 2015-5-19 21:25 | 只看该作者
cowboy2014 发表于 2015-4-30 10:57
按键程序是不是最锻炼一个人的思维?

一般吧。算法比较锻炼思维

使用特权

评论回复
13
dirtwillfly|  楼主 | 2015-5-19 21:25 | 只看该作者
cowboy2014 发表于 2015-4-29 14:35
多按键的是不是和单片机的用法差不多?

msp430也属于单片机

使用特权

评论回复
14
baimiaocun2015| | 2015-5-21 17:56 | 只看该作者
这个是需要采用中断完成的啊。

使用特权

评论回复
15
FireRiver9| | 2015-6-12 21:20 | 只看该作者
学习了

使用特权

评论回复
16
comeon201208| | 2015-6-13 18:55 | 只看该作者
这个要看下是上升沿中断的还是下降沿中断的。。

使用特权

评论回复
17
comeon201208| | 2015-6-13 18:56 | 只看该作者
按键处理的时候还需要延时的重新判断下的,看是否稳定中断的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:欢迎进入TI MCU论坛      21ic TI技术交流1群:61549143(已满),  21ic TI技术交流2群:311421422 我的博客:http://blog.timcu.com/

1180

主题

34818

帖子

1116

粉丝