单片机/MCU论坛
直播中

蒋岩风

6年用户 9经验值
私信 关注
[问答]

msp430执行中断服务程序后主函数退出了循环体或循环体不执行是为什么?

主函数while(1)循环体为led亮灭,中断服务程序为开关移动12864的光标,但是一旦有进入中断服务程序过后led就不再亮灭了,不知道是什么问题
  1. /*************************************************************
  2. 程序功能:读取DS18B20进行温度测量以后的结果并在1602液晶上显示
  3. ---------------------------------------------------------------
  4. 测试说明:观察显示温度数值。
  5. *************************************************************/

  6. #include  "msp430.h"
  7. #include  "12864.h"
  8. #include "DS18B20.h"
  9. #define KEYIN    (P1IN & 0x0f)

  10. typedef unsigned char uchar;
  11. typedef unsigned int  uint;

  12. //要显示的6位温度数字
  13. uchar DN[7];
  14. uchar cursor_state = 0;                         //光标开关状态
  15. /*************************主函数*************************/
  16. void main( void )
  17. {
  18.     /*下面六行程序关闭所有的IO口*/
  19.     P1DIR = 0XFF;P1OUT = 0XFF;
  20.     P2DIR = 0xFF;P2OUT = 0xFF;
  21.     P3DIR = 0XFF;P3OUT = 0XFF;
  22.     P4DIR = 0XFF;P4OUT = 0XFF;
  23.     P5DIR = 0XFF;P5OUT = 0XFF;
  24.     P6DIR = 0XFF;P6OUT = 0XFF;
  25.   
  26.     uchar i;
  27.     uint a;
  28.     WDTCTL = WDTPW + WDTHOLD;           //关狗
  29.     P6DIR |= BIT2;P6OUT |= BIT2;        //关闭电平转换
  30.     /*------选择系统主时钟为8MHz-------*/
  31.     BCSCTL1 &= ~XT2OFF;                 //打开XT2高频晶体振荡器
  32.     do
  33.     {
  34.         IFG1 &= ~OFIFG;                 //清除晶振失败标志
  35.         for (i = 0xFF; i > 0; i--);     //等待8MHz晶体起振
  36.     }
  37.     while ((IFG1 & OFIFG));             //晶振失效标志仍然存在?
  38.     BCSCTL2 |= SELM_2 + SELS;           //MCLK和SMCLK选择高频晶振
  39.    
  40.     //计数时钟选择SMLK=8MHz,1/8分频后为1MHz
  41.     TACTL |= TASSEL_2 + ID_3;
  42.     //打开全局中断
  43.     _EINT();
  44.     P1DIR = 0x00;               //P1为输入状态
  45.     P1IES = 0x0f;               // P1.0~P1.3选择下降沿中断
  46.     P1IE = 0x0f;                // 打开中断使能
  47.     while(1)
  48.     {
  49.         for(a = 0; a < 1000; a++)
  50.           DelayNus(1000);
  51.         P2OUT ^= BIT1;
  52.         for(a = 0; a < 1000; a++)
  53.           DelayNus(1000);
  54.         P2OUT ^= BIT1;
  55.         for(a = 0; a < 1000; a++)
  56.           DelayNus(1000);
  57.         P2OUT ^= BIT1;
  58.     }
  59. }

  60. #pragma vector = PORT1_VECTOR
  61. __interrupt void P1_ISR(void)
  62. {
  63.     uchar temp,i,KEY;
  64.     temp = 0x01;
  65.     P2OUT ^= BIT1;
  66.     for(i = 0; i < 4; i++)
  67.     {
  68.         if(!(temp & P1IN))
  69.         {
  70.             KEY = i;
  71.             break;
  72.         }
  73.         temp <<= 1;
  74.     }
  75.     if(P1IFG & 0x0f)
  76.     {
  77.         switch(P1IFG)
  78.         {
  79.         case 0x01:
  80.                     if(KEY == 0)
  81.                     {
  82.                         DelayNus(100);
  83.                         while(KEYIN != 0x0f);
  84.                         if(cursor_state == 0)
  85.                         {
  86.                             cursor_state++;
  87.                             Write_Cmd(0x0F);
  88.                         }
  89.                         else
  90.                         {
  91.                             cursor_state--;
  92.                             Write_Cmd(0x0C);
  93.                         }
  94.                         P1IFG = 0;
  95.                     }
  96.                     break;
  97.         case 0x02:
  98.                     if(KEY == 1)
  99.                     {
  100.                         DelayNus(100);
  101.                         while(KEYIN != 0x0f);
  102.                         Write_Cmd(0x14);
  103.                         P1IFG = 0;
  104.                     }
  105.                     break;
  106.         case 0x04:
  107.                     if(KEY == 2)
  108.                     {
  109.                         DelayNus(100);
  110.                         while(KEYIN != 0x0f);
  111.                         Write_Cmd(0x10);
  112.                         P1IFG = 0;
  113.                     }
  114.                     break;
  115.         case 0x08:
  116.                     if(KEY == 3)
  117.                     {
  118.                         DelayNus(100);
  119.                         while(KEYIN != 0x0f);
  120.                         Write_Cmd(0x10);
  121.                         P1IFG = 0;
  122.                     }
  123.                     break;
  124.         default:
  125.                     while(KEYIN != 0x0f);       //等待按键放开
  126.                     //KeyVal = 0;
  127.                     //LPM1_EXIT;
  128.                     P1IFG = 0;
  129.                     break;
  130.         }
  131.     }
  132. }



已退回2积分

回帖(2)

阿信509

2020-4-28 14:41:12
怀疑是进入中断后就出不来了
1 举报
  • 蒋岩风: 应该不是这个问题,430进入中断以后会自动关总中断吧,我中断里有一句ledIO口取反控制亮灭的语句,之后触发外部中断以后还是有led亮灭的现象,所以应该是有出来的

chenwei6991627

2020-4-28 21:26:18
中端里面用延时?
2 举报
  • 蒋岩风: 不可以这么做吗?
  • 阿信509 回复 蒋岩风: 绝对不可以
    为啥呢,中断就是把你正常的工作停下后才去做事情,当然是越快越好了,否则影响正常工作就不好了,你说对不

更多回帖

发帖
×
20
完善资料,
赚取积分