2317|5

68

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

键盘抖动问题 [复制链接]


  1.   for (;;)
  2.   {
  3.     dwVal = rINTPND;   
  4.     if ((dwVal & MASK_BIT(21)) == 0)
  5.     {
  6.       continue;
  7.     }

  8.     //EXTINTPND 寄存器,判断是哪个外部中断触发
  9.     dwVal = rEXTINTPND;

  10.     if ((dwVal & MASK_BIT(EXTINT4)) != 0)
  11.     {
  12.       rEXTINTPND |= MASK_BIT(EXTINT4);
  13.       //外部中断4 产生了,点亮LED1
  14.       if(rPDATC & MASK_BIT(LED1))
  15.       {
  16.                sysUtilsLightLed (LED1, FALSE);
  17.                printf("Turn off %s",leds[LED1 - 1]);
  18.       }
  19.       else
  20.       {
  21.               sysUtilsLightLed (LED1, TRUE);
  22.               printf("Turn on %s",leds[LED1 - 1]);
  23.       }
  24.             printf(" *** rINTPND = %02X , rPDATC = %02X ***\n",rINTPND, rPDATC);
  25.             sysUtilsDelay(10000000);  //延时
  26.             rEXTINTPND &= ~MASK_BIT(EXTINT4);//在这里清零
  27.             rINTPND = 8;              //还原rINTPND
  28.             continue;
  29.     }

  30.     if ((dwVal &  MASK_BIT(EXTINT5)) != 0)
  31.     {
  32.         //......
  33.     }

  34.     if ((dwVal &  MASK_BIT(EXTINT6)) != 0)
  35.     {
  36.         //......
  37.     }

  38.     if ((dwVal &  MASK_BIT(EXTINT7)) != 0)
  39.     {
  40.       rEXTINTPND |= MASK_BIT(EXTINT7);
  41.       //外部中断7 产生了,点亮LED1,2,3
  42.       sysUtilsLightLed (LED_ALL, FALSE);
  43.     }
  44.     //最后清除中断位
  45.     rI_ISPC |= MASK_BIT(21);
  46.     rI_ISPC = dwVal;
  47.   }
复制代码

我用以上代码实现按键控制LED(按一次灯亮,再按一次灯熄灭),开始的时候灯不亮,按下按键,灯亮后进入sysUtilsDelay延时,但是延时完之后灯又熄灭了
是不是我代码有问题?
我用ARM7+S3C44B0X(SUMSUNG)

最新回复

不错 看看~~~~~~~~~~~~  详情 回复 发表于 2009-5-19 11:45
点赞 关注

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
ARM啊
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
自己顶!
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

4
 
if(rPDATC & MASK_BIT(LED1))
      {
           sysUtilsLightLed (LED1, FALSE);
           printf("Turn off %s",leds[LED1 - 1]);
      }

看了一下,像是没有中断的时候

你这句执行了,呵呵,把你的灯给关了

再理一下逻辑看看
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

5
 
感谢两位参与,后来我发现是键盘缓存的问题,用以下方法解决了:
#define INTERNVAL 0x0000a000   //有效间隔

void KeyLedTest (void)
{
  U32 dwVal;
  int internval = INTERNVAL;
  int i;

  //设置IO 口PORT G
  rPCONG |= 0xff00;

  //设置中断
  rINTMOD &= ~MASK_BIT(21);
  rINTCON &= ~MASK_BIT(1);

  //设置EXTINT4,5,6,7中断模式,我们这里使用低电平触发
  rEXTINT &= 0xffff;    //先清除EXTINT4,5,6,7的相应设置bit位

  for (;;)
  {
    dwVal = rINTPND;
                internval++;
                if(internval >= INTERNVAL)
                        internval = INTERNVAL;
    if((dwVal & MASK_BIT(21)) == 0)
    {
            for(i = 0;i < 10000;i++){}
                        continue;
                }

    //EXTINTPND 寄存器,判断是哪个外部中断触发
    dwVal = rEXTINTPND;

    if (((dwVal & MASK_BIT(EXTINT4)) != 0) && (internval >= INTERNVAL))
    {
            printf("Status of LED1 is going to be changed.");
            internval = 0;
      rEXTINTPND |= MASK_BIT(EXTINT4);
      //外部中断4 产生了,点亮LED1
      if(rPDATC & MASK_BIT(LED1))
      {
               sysUtilsLightLed (LED1, FALSE);
               printf("Turn off %s",leds[LED1 - 1]);
      }
      else
      {
              sysUtilsLightLed (LED1, TRUE);
              printf("Turn on %s",leds[LED1 - 1]);
      }
    }

    if ((dwVal &  MASK_BIT(EXTINT5)) != 0)
    {
        //......
    }

    if (((dwVal &  MASK_BIT(EXTINT6)) != 0) && (internval >= INTERNVAL))
    {
        //......
    }

    if (((dwVal &  MASK_BIT(EXTINT7)) != 0) && (internval >= INTERNVAL))
    {
      rEXTINTPND |= MASK_BIT(EXTINT7);
      //外部中断7 产生了,点亮LED1,2,3
      sysUtilsLightLed (LED_ALL, FALSE);
    }
    //最后清除中断位
    rI_ISPC |= MASK_BIT(21);
    //rI_ISPC = dwVal;
    rEXTINTPND &= ~(MASK_BIT(EXTINT4)|MASK_BIT(EXTINT5)|MASK_BIT(EXTINT6));
  }
}
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

6
 
不错 看看~~~~~~~~~~~~
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表