打印

请问2131关于按键检测的问题!

[复制链接]
1454|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
无冕之王|  楼主 | 2010-1-19 15:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想检测key1-key6的那个键按下了,我是这样做的
while(1)
{
   if(IO0PIN&KEY1==0)
   {
      for(i=0;i<5000;i++) //去抖动
      if(IO0PIN&KEY1==0)
      while(IO0PIN&KEY1!=0)  //等待按键弹起
      dokey1fun();
}
   ...  //其他键的检测跟以上结构类试
}

程序烧写后,按键没有反映,估计是速度太快了来不及检测到?是不是要用定时计数的输入捕获来产生中断,再执行中断服务才能实现按键检测啊?

相关帖子

沙发
gxgclg| | 2010-1-19 21:03 | 只看该作者
可以不用中断,发个程序你参考下
unsigned char read()
{
        unsigned char temp,key_value,row,column;                       
       
           PORTA &= 0xF0; //低四位输出低电平
           delay_nus(5);  // 延时5us
           if((((PORTB<<3)&0xF0)|(PORTA&0x0F) & 0xF0)!= 0xF0) // 作初检查有否键按下,没有,就返回
          {                                                                 // 如果行线不全为1,可能有键按下
                delay_nus(500);// 延时去抖动
                 //设置列线初始值3~0=1110                 
                for(column=0,PORTA&=0xFE,PORTA|=0xFE;column<4;column++)
                {                                  
                        for(row=0,temp=0b11101111;row<4;row++)// 设置行线初始值7~4=1110
                  {   
                          while((((PORTB<<3)&0xF0)|(PORTA&0x0F) & 0xF0)==(temp & 0xF0))// 输入行线,查看这行有否键按下
                          {
                          key_value=(row<<2)+column;// 键编码=4*行输入值+列扫描值
                         // key_value=Key_table[key_value];// 键盘编码转换键值
                          delay_nus(500);// 延时去抖
                          if((((PORTB<<3)&0xF0)|(PORTA&0x0F) & 0xF0)== 0xF0) // 检查按键是否松开
                                {                         
                                  return (key_value);
                                }                         
                          }
                         temp<<=1;// 行线左移1位
                   }
                 PORTA &=(~(2<<column));// 列线扫描值左移1位,扫描下一行
                }
          }
          return (0x0ff);

使用特权

评论回复
板凳
pkat| | 2010-1-19 21:44 | 只看该作者
楼上是个非常经典的4*4矩阵的处理方式,呵呵

使用特权

评论回复
地板
司徒老鹰| | 2010-1-19 22:50 | 只看该作者
不用中断?太有创意了

使用特权

评论回复
5
火箭球迷| | 2010-1-20 22:09 | 只看该作者
没必要逐个IO口判断,可以一次读取所有连接有按键的引脚状态,然后再进行判断、去抖、按键处理。
如果能用中断那程序对用户的响应将更灵敏。

使用特权

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

本版积分规则

个人签名:喜欢远行

160

主题

3331

帖子

0

粉丝