世纪电源网社区logo
社区
Datasheet
标题
返回顶部
讨论

关于msp430外部中断的问题,程序只能中断一次,然后就不能中断了。请高...

[复制链接]
查看: 214 |回复: 4
1
kimacer
  • 积分:487
  • |
  • 主题:14
  • |
  • 帖子:67
积分:487
LV6
高级工程师
  • 2023-3-20 14:52:09
#include <msp430x24x.h>
void main()
{WDTCTL = WDTPW + WDTHOLD;
_DINT();
P4DIR=0XFF;
P4SEL=0X00;
P4OUT=0xFF;
P1SEL=0x00;
P1DIR=0x00;
P1IES=0x00;
P1IE=0xff;
P1IFG=0X00;
_EINT();
while(1);
}

#pragma vector=PORT1_VECTOR
__interrupt void port_1(void)
{P1IE=0x00;
P4OUT=~P4OUT;
P1OUT=0x00;
P1IE=0xff;
P1IFG=0x00;
}
_DINT();
次句去掉。
收藏收藏
pipibao
  • 积分:396
  • |
  • 主题:14
  • |
  • 帖子:68
积分:396
LV4
初级工程师
  • 2023-3-20 15:12:15
  • 倒数4
 
传一个例程给你看看
/***************************************************
程序功能:用中断方式读取四个**式按键的键值,同时将
按键的键值在数码管上显示出来
----------------------------------------------------
测试说明:按动K1~k4四个按键,观察数码管显示
***************************************************/
#include <msp430x14x.h>
#include "BoardConfig.h"

#define keyin (P1IN & 0x0f)

//数码管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 )
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
BoardConfig(0x88); //打开数码管,关闭流水灯和电平转换

P1IES = 0x0f; // P1.0~P1.3选择下降沿中断,按键按下时为低电平
P1IE = 0x0f; // 打开中断使能
P1DIR = BIT7; //设置P1.0~P.3为输入状态,P.7为输出
P1OUT = 0;
P4DIR = 0xff;
P5DIR = 0xff;
P4OUT = 0x3f;
P5OUT = 0xf7;
_EINT(); //打开全局中断控制位
while(1)
{
LPM1;
P4OUT = scandata[KeyVal];
}
}
/*******************************************
函数名称: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;
LPM1_EXIT;
P1IFG = 0;
return;
}
}
case 0x02:
if(keyin == 0x0d) //如果是第二个按键被按下
{
delay();
if(keyin == 0x0d)
{
while(keyin != 0x0f); //等待按键放开
KeyVal = 2;
LPM1_EXIT;
P1IFG = 0;
return;
}
}
case 0x04:
if(keyin == 0x0b) //如果是第三个按键被按下
{
delay();
if(keyin == 0x0b)
{
while(keyin != 0x0f); //等待按键放开
KeyVal = 3;
LPM1_EXIT;
P1IFG = 0;
return;
}
}
case 0x08:
if(keyin == 0x07) //如果是第四个按键被按下
{
delay();
if(keyin == 0x07)
{
while(keyin != 0x0f); //等待按键放开
KeyVal = 4;
LPM1_EXIT;
P1IFG = 0;
return;
}
}
default:
while(keyin != 0x0f); //等待按键放开
//KeyVal = 0;
//LPM1_EXIT;
P1IFG = 0;
return;
}
}
}
//例程来自LT-1B的程序例子
z443233785
  • 积分:5343
  • |
  • 主题:117
  • |
  • 帖子:1003
积分:5343
LV8
副总工程师
最新回复
  • 2023-4-5 18:03:59
  • 倒数1
 
430默认的是关闭中断嵌套的,除非你在一个中断程序中再次开总中断EINT
xuyiyi
  • xuyiyi
  • 离线
  • LV4
  • 初级工程师
  • 积分:358
  • |
  • 主题:10
  • |
  • 帖子:58
积分:358
LV4
初级工程师
  • 2023-3-20 15:21:40
  • 倒数3
 
多源中断不能硬件自动开中断,得软件开中断,在中断服务函数最后加个_DINT();就行了
qlnveder164
  • 积分:600
  • |
  • 主题:19
  • |
  • 帖子:67
积分:600
LV6
高级工程师
  • 2023-4-4 10:26:24
  • 倒数2
 
程序好像没什么问题,是不是仿真有问题
热门技术、经典电源设计资源推荐

世纪电源网总部

地 址:天津市南开区黄河道大通大厦8层

电 话:400-022-5587

传 真:(022)27690960

邮 编:300110

E-mail:21dy#21dianyuan.com(#换成@)

世纪电源网分部

广 东:(0755)82437996 /(138 2356 2357)

北 京:(010)69525295 /(15901552591)

上 海:(021)24200688 /(13585599008)

香 港:HK(852)92121212

China(86)15220029145

网站简介 | 网站帮助 | 意见反馈 | 联系我们 | 广告服务 | 法律声明 | 友情链接 | 清除Cookie | 小黑屋 | 不良信息举报 | 网站举报

Copyright 2008-2024 21dianyuan.com All Rights Reserved    备案许可证号为:津ICP备10002348号-2   津公网安备 12010402000296号