这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » EasyARM2131 EasyARM2131的键盘查询?

共2条 1/1 1 跳转至

EasyARM2131 EasyARM2131的键盘查询?

院士
2006-09-17 18:14:16     打赏
EasyARM2131 EasyARM2131的键盘查询?



关键词: EasyARM2131     键盘     查询    

院士
2006-12-22 22:43:00     打赏
2楼
问 在EasyARM2131开发板上,我做键盘的查询:
先定义宏:
#define   KEY1     (1<<16)            // P0.16
#define   KEY2     (1<<17)            // P0.17
#define   KEY3     (1<<18)
#define   KEY4     (1<<19)
#define   KEY5     (1<<20)
#define   KEY6     (1<<21)
#define   KEY      (0x3f<<16)

在查询的程序里这么写:
R=((!IO0PIN) &KEY);
          switch (R)
          {
              case KEY1:
                  DelayNS(1);            //软件延时,去抖动
                   if((IO0PIN&KEY1) == 0)
                   {
                       while((IO0PIN&KEY1) == 0);//等按键松开
                       ……
                   }
                   
                   break;
          }
为什么不行啊。就是没反应,观察R的值,居然是0!
1: 跳线和配置如何???void KeyTask (void) __task {
  KeyInit();
  for (;;) {
    if ((!(IOPIN0 & (1 << KEY1))) && (IOPIN1 & (1 << LED1))) {//有KEY1键压下且LED未亮
      os_evt_set (0x0001, Led_Task);//
    }
    else if ((IOPIN0 & (1 << KEY1)) && (!(IOPIN1 & (1 << LED1)))) {//无KEY1键压下且LED在亮
      os_evt_set (0x8001, Led_Task);//
    }
    if ((!(IOPIN0 & (1 << KEY2))) && (IOPIN1 & (1 << LED2))) {//有KEY2键压下且LED未亮
      os_evt_set (0x0002, Led_Task);//
    }
    else if ((IOPIN0 & (1 << KEY2)) && (!(IOPIN1 & (1 << LED2)))){//无KEY2键压下且LED在亮
      os_evt_set (0x8002, Led_Task);//
    }
    if ((!(IOPIN0 & (1 << KEY3))) && (IOPIN1 & (1 << LED3))) {//有KEY3键压下且LED未亮
      os_evt_set (0x0003, Led_Task);//
    }
    else if ((IOPIN0 & (1 << KEY3)) && (!(IOPIN1 & (1 << LED3)))){//无KEY3键压下且LED在亮
      os_evt_set (0x8003, Led_Task);//
    }
    if ((!(IOPIN0 & (1 << KEY4))) && (IOPIN1 & (1 << LED4))) {//有KEY4键压下且LED未亮
      os_evt_set (0x0004, Led_Task);//
    }
    else if ((IOPIN0 & (1 << KEY4)) && (!(IOPIN1 & (1 << LED4)))){//无KEY4键压下且LED在亮
      os_evt_set (0x8004, Led_Task);//
    }
    if ((!(IOPIN0 & (1 << KEY5))) && (IOPIN1 & (1 << LED5))) {//有KEY5键压下且LED未亮
      os_evt_set (0x0005, Led_Task);//
    }
    else if ((IOPIN0 & (1 << KEY5)) && (!(IOPIN1 & (1 << LED5)))){//无KEY5键压下且LED在亮
      os_evt_set (0x8005, Led_Task);//
    }
    if ((!(IOPIN0 & (1 << KEY6))) && (IOPIN1 & (1 << LED6))) {//有KEY6键压下且LED未亮
      os_evt_set (0x0006, Led_Task);//
    }
    else if ((IOPIN0 & (1 << KEY6)) && (!(IOPIN1 & (1 << LED6)))){//无KEY6键压下且LED在亮
      os_evt_set (0x8006, Led_Task);//
    }
    os_dly_wait (2);//延时20mS
  }
}

void LedTask (void) __task {
OS_RESULT result;
unsigned int i;    
  LedInit();
  for (;;) {
    result = os_evt_wait_or(0xffff, 0xffff);//等待LedTask任务事件发生
    if(result == OS_R_EVT) {
      i = os_evt_get();
      switch(i) {
        case 0x0001:  IOCLR1 = (1 << LED1);//点亮LED1
                      break;
        case 0x0002:  IOCLR1 = (1 << LED2);//点亮LED2
                      break;
        case 0x0003:  IOCLR1 = (1 << LED3);//点亮LED3
                      break;
        case 0x0004:  IOCLR1 = (1 << LED4);//点亮LED4
                      break;
        case 0x0005:  IOCLR1 = (1 << LED5);//点亮LED5
                      break;
        case 0x0006:  IOCLR1 = (1 << LED6);//点亮LED6
                      break;

        case 0x8001:  IOSET1 = (1 << LED1);//关掉LED1
                      break;
        case 0x8002:  IOSET1 = (1 << LED2);//关掉LED2
                      break;
        case 0x8003:  IOSET1 = (1 << LED3);//关掉LED3
                      break;
        case 0x8004:  IOSET1 = (1 << LED4);//关掉LED4
                      break;
        case 0x8005:  IOSET1 = (1 << LED5);//关掉LED5
                      break;
        case 0x8006:  IOSET1 = (1 << LED6);//关掉LED6
                      break;
      }
      os_evt_set (i, Beep_Task);//开关BEEP
      os_evt_set (i, Lednum_Task);//开关Lednum
    }
    os_dly_wait (2);//延时20mS
  }
} 2: ARM水鸟的16个水鸟实习包 3: 键盘判断处理程序uint8 (*KeyProTabl[25])()={NoKey,Key0,Key1,Key2,Key3,Key4,Key5,Key6,Key7,Key8,Key9,Keydian,OK,Resetsystem,Cheliang,Biaoding,NoShiZhong,LeftShiZhong,RightShizhog,Memory, SelfTest,InputParameter,SaveData,ReadData,SystemBackup};

       
/***
****************************************************************************
* 名称:GetKey()
* 功能:键盘判断处理程序
* 入口参数:
* 出口参数:返回值为此键的处理函数在键盘处理函数指针数组的位置
****************************************************************************
***/

uint8 GetKey(void)
{
uint32  i;

  IO0CLR=Key_Type;    //使列扫描信号为全为0
  Key_value1=(IO0PIN>>8)&0X7;
  
  if (Key_value1!=0x07)   //先判断是否有键按下不等于0X07表明有键按下
    
    {
      for (i=0;i<80000;i++);       //延时去颤
      
      Key_value=(IO0PIN>>8)&0X7;           //再次判断是不是干扰
      if (Key_value == Key_value1)   //确实有键按下而不是干扰
       
        {
           
         IO0SET=Key_Type;        //开始扫描键盘
         for ( i=0; i<8; i++)
           {
   
             IO0CLR=1<<i;               //行扫描信号
             Key_value=(IO0PIN>>8)&0X7;              //读行值
             if ( Key_value!=0x07)
                break;
             IO0SET=Key_Type;               //恢复列信号为高为下一次扫描做准备
            }  //end of for
          Key=(Key_value<<8)|(0XFF&(~(1<<i)));           //得到键码
          //IO0CLR=Key_Type;                     
          while ((IO0PIN & 0X0000007ff)==Key);    //等待按键放开    
          for (i=0;i<24;i++)                      //查取按键在按键处理程序的数组元素位置
             
              if ( Key==Key_Tble[i] )
               {
           
                return i+1;                         //返回按键所对应的在按键处理程序的数组元素位置
               }  //end of if
                                          
        }  //end of if
      
     }  //end of if
     return 0;                                    //没有键按下时返回0   
}
4: 如果菜农的水鸟包能在ADS下就好了唉,就这个小的键盘扫描搞了一天也没搞定,最后还是用if嵌套,不用witch case,就好了。真不知为什么,,,,, 5: 你就是打死水鸟也不会用ADS的... 6: 改成R=((~IO0PIN) &KEY);或R=((IO0PIN ^ KEY) &KEY);调试技术一定要"过硬",一种方法不行就用其他的替换.

再可R=((IO0PIN ^ 0xfffffff) &KEY);

一般数据要取反而不能逻辑非.

再:KEY等的定义个人认为不好... 7: hotpower
我试了你上面的所有方法还是不行!我改成:
if((IO0PIN&KEY1) == 0)        //如KEY1按下,则向上位机发送一串实验字符
       {
           DelayNS(1);            //软件延时,去抖动
           if((IO0PIN&KEY1) == 0)
           {
               while((IO0PIN&KEY1) == 0);//当按键松开下              
           }
       }
       else
就没问题了。不知道为什么会这样。hotpower你还有别的办法吗?
另:1、LPC213XDEF.H(情人节修正版)应该怎么用呢,这个头文件是替换ZLG的启  动代码里的哪个文件的?
        2、你的blog里的好冬冬真的很多,我要系统的学习一下。 8: 我真让上善若水给气晕了!!!R=((!IO0PIN) &KEY);
          switch (R)
          {
              case KEY1:
                  DelayNS(1);            //软件延时,去抖动
                   if((IO0PIN&KEY1) == 0)
                   {
                       while((IO0PIN&KEY1) == 0);//等按键松开
                       ……
                   }
                   
                   break;
          }
上面的写法允许多键压下.

#define   KEY1     (1<<16)            // P0.16
#define   KEY2     (1<<17)            // P0.17
#define   KEY3     (1<<18)
#define   KEY4     (1<<19)
#define   KEY5     (1<<20)
#define   KEY6     (1<<21)
#define   KEY      (0x3f<<16)

KEY表明你最多要6个键(16~21)(0b00000000001111110000000000000000)

故2^6=64.

即有case 0~case63...
你只取压下的6个,却放跑了58个可能的组合!!!

不管任何情况下,switch肯定要运行的.

所以,应该用switch+case+default捕捉错误,就如同if+elseif+else一样捕捉错误

所以,你就产生了if行,switch不行的苦恼....

像键盘之类很好用软件仿真的,在程序构造,一般不要加入太多及复杂的实践处理...

等框架运行好后,再一个一个加入...当然也可分别做,直到最后在连接...

否则,把你栓着没商量... 9: Hotpower 息怒^_^我又试了几次,
我把R=((!IO0PIN) &KEY);改成R=((IO0PIN ^ 0xfffffff) &KEY);最后成功了,我加上了default:break;但是我取掉它还是可以。你说的没错,你只取压下的6个,却放跑了58个可能的组合,但是,既然我触发了按键,switch运行到那里就应该有相应的动作啊。
10: 我更气晕过劲了---干脆把ADS编译器"砸了"解气R=((!IO0PIN) &KEY);改成R=((IO0PIN ^ 0xfffffff) &KEY);最后成功了

我晕菜!!!

我认为
R=((~IO0PIN) &KEY);与R=((IO0PIN ^ 0xffffffff) &KEY);等值

因为KEY中有6个1 (00000000 00111111 00000000 00000000)

所以,IO0PIN ^   (xxxxxxxx xxpppppp xxxxxxxx xxxxxxxx)都对!!!

其中x为无关项,p是实测管脚位值.

我晕到了!!!  &KEY实际已过滤了其他58个引脚.

都到现在你也不愿弃暗投明???

晕到~~~非让我"宣布非Keil免谈"吗??? 11: 我也荤了我又试了5次,的的确确就是出在取反和异或上,R=((!IO0PIN) &KEY)不行,改成R=((IO0PIN ^ 0xfffffff) &KEY);就可以了。下次在做程序时,我决定改用KEIL,因为好像深入研究KEIL的人远远多于搞ADS的。这次的嘛,已经做完了。 12: 期待关注一下 13: 问题所在!在ARM群里几个热心朋友的帮助下,最终本质的问题已经找到了。

R=((!IO0PIN) &KEY); R=((IO0PIN ^ 0xfffffff) &KEY); R=((~IO0PIN) &KEY);中只有第一个是不行的!‘!’运算为逻辑非,(!IO0PIN)的值只有两个,0或者1,它的值再与KEY相与不出错才怪的。而~是按位取反,效果和^ 0xfffffff是相同的。
谢谢大家。
14: 我试过程序了。我调试过了程序,
R=((IO0PIN ^ 0xfffffff) &KEY); R=((~IO0PIN) &KEY);
是对的。

  有的朋友没有理解端口的实况定义含义。 15: d关注一下

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]