打印

矩阵键盘一个按键能实现两种功能吗,怎样编写程序呢?

[复制链接]
5210|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
开始的梦想|  楼主 | 2010-9-17 07:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问各位,矩阵键盘中用同一个按键,如何实现两种功能呢?部分程序如下:
unsigned char getkey(void)
{
   unsigned  char rcode,ccode;
   while (key_scan())   //判断是否有按键按下
   delay_key(1);
   P2=0x0f;            //行线输出全为0
   rcode=P2&0x0f;     //读入列线值
   if(rcode!=0x0f)    //先检测有无按键按下
     {
       delay_key(1);        
       if(rcode!=0x0f)
          {
      rcode=P2&0x0f;    //读入列线值
      P2=rcode|0xf0;    //输出当前列线值
      ccode=P2&0xf0;     //读入行线值
      return(rcode+ccode);  //键盘最后组合码
          }
     }
return(0xff);     //返回该值
}

unsigned char keyscan(void)
{
   getkey();
   beep();
   switch(keybord)
      {
   case 0xee:keynum=1;break;
   case 0xed:keynum=2;break;
   case 0xeb:keynum=3;break;
   case 0xe7:keynum=11;break;
   
   case 0xde:keynum=4;break;
   case 0xdd:keynum=5;break;
   case 0xdb:keynum=6;break;
   case 0xd7:keynum=13;break;
   
   case 0xbe:keynum=7;break;
   case 0xbd:keynum=8;break;
   case 0xbb:keynum=9;break;
   case 0xb7:keynum=14;break;
   
   case 0x7e:keynum=10;break;
   case 0x7d:keynum=0;break;
   case 0x7b:keynum=12;break;
   case 0x77:keynum=15;break;
   default:break;
     }
    while (~key_scan()) //松手检测
    delay_key(1);
    return 0;
}

程序中要求当keynum=15时,根据条件,能分别实现两种功能。

相关帖子

沙发
zzf119| | 2010-9-17 15:26 | 只看该作者
不知道循环计数行不行,就是按奇数下是功能1,按偶数下是功能2.

使用特权

评论回复
板凳
Gin_HK| | 2010-9-17 15:30 | 只看该作者
可用延时或定时器的方法实现长按/短按的判断

使用特权

评论回复
地板
Galway-Zhang| | 2010-9-29 17:06 | 只看该作者
直接用判断+消抖+判断.再判断

如按下1S.是if()
按下1.5S是else

使用特权

评论回复
5
不亦心| | 2010-9-29 20:58 | 只看该作者
不想用长短键处理
那就用定一个功能键吧,如同Shift键,此键按下矩阵中其它那一堆键是A功能,此键松开,那一堆键是B功能
……

使用特权

评论回复
6
fm0597| | 2011-5-28 17:27 | 只看该作者
:handshake

使用特权

评论回复
7
hotpower| | 2011-5-28 18:35 | 只看该作者
可用延时或定时器的方法实现长按/短按的判断
Gin_HK 发表于 2010-9-17 15:30

使用特权

评论回复
8
moreand| | 2011-7-9 11:08 | 只看该作者
受益匪浅:)

使用特权

评论回复
9
joyme| | 2011-7-9 11:18 | 只看该作者
程序中要求当keynum=15时,根据条件,能分别实现两种功能。


你都说了是根据条件实现两种功能,那就是你知道条件了,在按键处理子函数里做就好了

Key_Process()
{
       switch(keynum)
       {
              ....
              case 15:
                       if(ActAs_A)
                             A_Func();
                       else
                             B_Func();
                       break;
              default:
                       break;
       }
}

使用特权

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

本版积分规则

0

主题

58

帖子

1

粉丝