查看: 341|回复: 6
打印 上一主题 下一主题

【MSP430F149学习】14 外部中断

[复制链接] qrcode

36

主题

42

帖子

123

积分

注册会员

Rank: 2

积分
123
楼主
跳转到指定楼层
发表于 2015-12-7 07:31 PM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


【MSP430F149学习】14 外部中断



准备工具:电脑;TS8900--MSP430F149开发板;USB线一根


开发环境:IAR EW for MSP430 V5.30


用中断方式读取四个独立式按键的键值,同时将按键的键值在数码管上显示出来


与I/O中断相关寄存器

PxIFG  中断标志寄存器




该寄存器只有 P1 和 P2 口才有,该寄存器有 8 个标志位,标志相应引脚是否有中断请求。


PxIFG .x:中断标志
0:  该引脚无中断请求
1:  该引脚有中断请求

PxIE  中断允许寄存器




该寄存器只有 P1 和 P2 口才有,该寄存器有 8 个标志位,标志相应引脚是否能响应中断请求。


PxIFG .x:中断允许标志
0:  该引脚中断禁止

1:  该引脚中断允许


PxIES  中断触发沿控制寄存器




该寄存器只有 P1 和 P2 口才有,该寄存器有 8 个标志位,标志相应引脚的中断触发沿。


PxIFG .x:中断触发沿选择
0:  上升沿产生中断

1:  下降沿产生中断


程序代码:


/***************************************************
程序功能:用中断方式读取四个独立式按键的键值,同时将
          按键的键值在数码管上显示出来
----------------------------------------------------
测试说明:按动K1~k4四个按键,观察数码管显示
***************************************************/
#include 

#define uchar unsigned char 
#define uint  unsigned int

#define keyin    (P1IN & 0x0f)

#define wei_h    P5OUT |= BIT5
#define wei_l    P5OUT &= ~BIT5
#define duan_l   P6OUT &= ~BIT6
#define duan_h   P6OUT |= BIT6
//数码管7位段码:0--f
uchar scandata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                      0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uchar KeyVal = 0;   // 按键的键值

void delay(void);

/********************主函数********************/
void main( void )
{   
    
    /*下面六行程序关闭所有的IO口*/
    P1DIR = 0XFF1OUT = 0XFF;
    P2DIR = 0XFF2OUT = 0XFF;
    P3DIR = 0XFF3OUT = 0XFF;
    P4DIR = 0XFF4OUT = 0XFF;
    P5DIR = 0XFF5OUT = 0XFF;
    P6DIR = 0XFF6OUT = 0XFF;
    
    WDTCTL = WDTPW + WDTHOLD;   //关闭看门狗
    
    P1IES = 0x0f;               // P1.0~P1.3选择下降沿中断
    P1IE  = 0x0f;               // 打开中断使能
    P1DIR = 0xf0;               //设置P1.0~P.3为输入状态
    P1OUT = 0x0f;               //设置P1.0~P.3输出高电平
    
    _EINT();                    //打开全局中断控制位
    
    while(1)
    {
        P4OUT = scandata[KeyVal]; //P4口输出段码值
        duan_h;
        duan_l;
        P4OUT=0x00;             //输出位选信号
        wei_h;
        wei_l;
    }
}
/*******************************************
函数名称:delay
功    能:用于消抖的延时
参    数:无
返回值  :无
********************************************/
void delay(void)
{
    uint tmp;
    
    for(tmp = 12000;tmp > 0;tmp--);
}
/*******************************************
函数名称:PORT1_ISR 
功    能:P1端口的中断服务函数
参    数:无
返回值  :无
********************************************/
#pragma vector=PORT1_VECTOR
__interrupt void  PORT1_ISR(void)
{
    if(P1IFG & 0x0f)
    {
        switch(P1IFG)
        {
        case 0x01:
                    if(keyin == 0x0e)   //如果是第一个按键被按下
                    {
                        delay();
                        if(keyin == 0x0e)
                        {
                            while(keyin != 0x0f);   //等待按键放开
                            KeyVal = 1;           //更新键值               
                            P1IFG = 0;           //清除中断标志
                            return;
                        }
                    }
        case 0x02:
                    if(keyin == 0x0d)       //如果是第二个按键被按下
                    {
                        delay();
                        if(keyin == 0x0d)
                        {
                            while(keyin != 0x0f);       //等待按键放开
                            KeyVal = 2;                //更新键值  
                            P1IFG = 0;                //清除中断标志
                            return;
                        }
                    }
        case 0x04:
                    if(keyin == 0x0b)   //如果是第三个按键被按下
                    {
                        delay();
                        if(keyin == 0x0b)
                        {
                            while(keyin != 0x0f);       //等待按键放开
                            KeyVal = 3;              //更新键值  
                            P1IFG = 0;            //清除中断标志
                            return;
                        }
                    }
        case 0x08:
                    if(keyin == 0x07)   //如果是第四个按键被按下
                    {
                        delay();
                        if(keyin == 0x07)
                        {
                            while(keyin != 0x0f);       //等待按键放开
                            KeyVal = 4;                //更新键值  
                            P1IFG = 0;                //清除中断标志
                            return;
                        }
                    }
        default:
                    while(keyin != 0x0f);       //等待按键放开
                    KeyVal = 0;                 //更新键值  
                    P1IFG = 0;                  //清除中断标志
                    return;
        }
    }
} 



下载运行效果:






【MSP430F149学习】汇总贴



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

0

主题

76

帖子

10

积分

新手上路

Rank: 1

积分
10
沙发
发表于 2015-12-8 10:20 AM | 只看该作者
资料很棒
回复 支持 反对

使用道具 举报

0

主题

73

帖子

6

积分

新手上路

Rank: 1

积分
6
板凳
发表于 2015-12-8 10:44 AM | 只看该作者
 谢谢分享
回复 支持 反对

使用道具 举报

0

主题

92

帖子

6

积分

新手上路

Rank: 1

积分
6
地板
发表于 2015-12-8 01:57 PM | 只看该作者

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

1

主题

87

帖子

25

积分

新手上路

Rank: 1

积分
25
5#
发表于 2015-12-8 01:58 PM | 只看该作者

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

0

主题

78

帖子

6

积分

新手上路

Rank: 1

积分
6
6#
发表于 2015-12-10 11:08 AM | 只看该作者
很厉害,,楼主有没有群啊,,求一起交流,讨论
回复 支持 反对

使用道具 举报

45

主题

354

帖子

605

积分

高级会员

Rank: 4

积分
605
7#
发表于 2015-12-10 03:38 PM | 只看该作者

这个还真么有看着郭老师的视频自学中不懂就找度娘

社区群里也可以交流的222951503

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表