首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

新人~关于51单片机中断的一个小疑点

2012-12-19 
新人~关于51单片机中断的一个小问题我把51单片机的P3^3口也就是INT1,连着一个按键,我想按键按下LED灯走一

新人~关于51单片机中断的一个小问题
    我把51单片机的P3^3口也就是INT1,连着一个按键,我想按键按下LED灯走一次马灯。(低电平触发)  
    现在中断执行什么的都没问题,但我想在中断例程结束前判断按键有没有放开,没放开的话,程序就停滞,那么问题来了,我一开始想直接判断P3^3口是否是0,如果是就循环,但我发现一点用都没有,然后我改变方法变成去判断中断标志位IE1是否为1,这下就有效果了,不知道为什么?求大家解答

这段是没有效果的中断代码(低电平触发):


void  my_int1(void) interrupt 2
{
   int i=0,scan=0xfe;
   for(i=0;i<8;i++)
   {
  LED=scan;
  scan=scan<<1|0x01;
  delay(10);
   }
  
  while((P3^3)==0);
  delay(10);
}


这段是有效果的中断代码(低电平触发)

void  my_int1(void) interrupt 2
{
   int i=0,scan=0xfe;
   for(i=0;i<8;i++)
   {
  LED=scan;
  scan=scan<<1|0x01;
  delay(10);
   }
  
  while(IE1==1);
  delay(10);
}

[最优解释]
不给出答案。

什么是中断?中断比查询方式的优势是什么?中断函数的基本规则是什么?  -- 从楼主的代码可以看到,你不懂中断。
while(1)
{
  if(Key_Flag)
   {
       Key_Flag = 0;
      //run_led();  --自己封装成函数  
   }
}

void  my_int1(void) interrupt 2 

   IF1 = 0;
   Key_Flag = 1;



你上面代码问题:
1、中断函数不简洁,中断里面while(键状态); -- 这个史无前例
                   中断里面延时函数,这个违背了中断的意义。
                   中断不清楚标志位,这个能出中断吗?
2、既然是中断,你一定是配置了电平变化中断或者是边沿触发中断,符合条件的动作出现,进中断一次,没有必要检测按键是否松开,画蛇添足。
3、LED操作,请封装成函数,调用。  
 


[其他解释]
这个,我觉得在中断外面做比较好。。。

中断里置一个标志比如:Isign == T;

main里

if Isign 
   //禁外中断
   //等IO变位
   //恢复标志
   //开外中断
循环以上


[其他解释]
人工置顶
[其他解释]

万分感谢楼上两位高人给小弟的指点,你们太好了~~!!!

热点排行