打印

PIC12F629的中断优先级

[复制链接]
3800|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cuianbin|  楼主 | 2009-12-4 17:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PIC12F629没有中断优先级,但是我想要实现两个按键同时按下去的时候只有一被响应,怎么办?单片机平时要工作在睡眠模式下,所以检测按键用查询的方法不可以了,只能用引脚电平变化中断或INT中断。但是想不出能够实现的方法,请问众位PIC高手的思路是?不胜感激!!
沙发
andy2003hu| | 2009-12-4 17:30 | 只看该作者
在电平变化中断里面用查询解决。

使用特权

评论回复
板凳
cuianbin|  楼主 | 2009-12-4 21:50 | 只看该作者
楼上的朋友,可否说的再详细一下。即使进入电平变化中断又如何呢?查询也只能查询标志位,两个按键同时按下,GBIF=1;没法区分,更没法用软件优先响应了。
今天我在板子上焊了个LED,上电后单片机进入睡眠,按下接在GPI1上的按键KEY1,引脚电平变化中断唤醒单片机,GPIF置位;也可以按下GPI2上的按键KEY2后,通过INT下降沿中断唤醒单片机并置位INTF。总中断GIE=0;这样就不会进入中断函数,但是某一个按键按下后都会有相应的中断标志位置位。通过查询这两个标志位可以做出响应,无须进入中断函数
  while(1)
  {
  SLEEP();
    if(INTIF==1)//KEY2按下或者KEY1,KEY2同时都按下熄灭LED
       {LED=0;//熄灭LED
        INTF=0;
        GBIF=0;}

    if(GBIF==1&&INTF==0)//仅KEY1按下时点亮LED
       {
          LED=1;//点亮LED
        
        }
     }

这个程序单个按键按下时可以很好的响应,两个一起按下就乱了,并非灭掉LED, 灭掉后很快亮了;按理说不应该这样。

使用特权

评论回复
地板
andy2003hu| | 2009-12-5 17:25 | 只看该作者
你这个按键怎么不消一抖动?
while(1)
  {
  SLEEP();
    if(INTIF==1)//KEY2按下或者KEY1,KEY2同时都按下熄灭LED
       {
         Delay10ms();
        if(INTIF==1)
         {      
         LED=0;//熄灭LED
        INTF=0;
        GBIF=0;
        }
    }

    if(GBIF==1&&INTF==0)//仅KEY1按下时点亮LED
       {
          Delay10ms():
         if(GBIF==1&&INTF==0)
         {
          LED=1;//点亮LED
        }
        }
     }

使用特权

评论回复
5
cuianbin|  楼主 | 2009-12-7 12:21 | 只看该作者
andy2003hu说的是检测按键时候去抖动。我这里用的是查询中断标志的方法。只要发生中断,中断标志位肯定置位。不过你说的到提醒了我,我加了延时,不过不是去抖动,而是让单片机去查询一个稳定的中断标志,还有一个问题是,电平变化触发中断,按下按键时会触发一次,按键抬起时也会触发一次,开始我忽视了这一点,所以就乱了,必须把按键抬起时那个响应用程序屏蔽掉,才不会出错!谢谢andy2003hu!!

使用特权

评论回复
6
yewuyi| | 2009-12-7 14:20 | 只看该作者
MY GOD!


这个产品谁买了要倒霉的。。。

使用特权

评论回复
7
牛牛特工| | 2009-12-13 00:55 | 只看该作者
本帖最后由 牛牛特工 于 2009-12-13 00:58 编辑

嘎嘎~~ 不晓得 俺键盘现在是扫描的
1ms扫一次 除非你的APM实在太高了 不然貌似不至于检测不出先后~~
~~~~ 俺不懂高级的键盘程序~~

使用特权

评论回复
8
aoeivu| | 2009-12-15 22:22 | 只看该作者
程序有点毛病
while(1)
  {
  SLEEP();
    if(INTIF==1)//KEY2按下或者KEY1,KEY2同时都按下熄灭LED
       {LED=0;//熄灭LED
        INTF=0;
        GBIF=0;}

    if(GBIF==1&&INTF==0)//仅KEY1按下时点亮LED
       {
          LED=1;//点亮LED
        
        }
     }
假设KEY1,KEY2同时按下,那么先执行if(INTF==1)//  LED熄灭
执行完后,INTIF被你清零了,接着跑到  if(GBIF==1&&INTF==0)//LED点亮了
if 语句用的不对
while(1)
  {
  SLEEP();
    if(INTIF==1)//KEY2按下或者KEY1,KEY2同时都按下熄灭LED
       {LED=0;//熄灭LED
        INTF=0;
        GBIF=0;}
   else
         if(GBIF==1)//仅KEY1按下时点亮LED
                  {
                    LED=1;//点亮LED
                    }
     }

使用特权

评论回复
9
cuianbin|  楼主 | 2009-12-23 20:38 | 只看该作者
程序会一步步改进,人也会一步步提高。

使用特权

评论回复
10
cuianbin|  楼主 | 2009-12-23 20:39 | 只看该作者
MY GOD!


这个产品谁买了要倒霉的。。。
yewuyi 发表于 2009-12-7 14:20

别动不动就扯到产品的高度。

使用特权

评论回复
11
cuianbin|  楼主 | 2009-12-23 20:41 | 只看该作者
程序有点毛病
while(1)
  {
  SLEEP();
    if(INTIF==1)//KEY2按下或者KEY1,KEY2同时都按下熄灭LED
       {LED=0;//熄灭LED
        INTF=0;
        GBIF=0;}

    if(GBIF==1&&INTF==0)//仅KEY1按下时点亮LED
...
aoeivu 发表于 2009-12-15 22:22

谢谢你,自己C语言还很不扎实,以后多学习!

使用特权

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

本版积分规则

86

主题

439

帖子

5

粉丝