打印

**中,pc键盘8042,pc大概安排有16个字节的缓冲

[复制链接]
3207|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LastNew|  楼主 | 2008-1-13 18:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
做了个键盘,有按键缓冲,想做长按键功能
于是有了关于这方面的问题:
    (此时暂不考虑缓冲的必要性问题,即默认有缓冲情况下)
如果做成加速键,那么多长时间重发一次比较合适,如果是100ms的样子,那缓冲会不会很快就满了?
如果做成长按键,那如果一直按着不放,怎么样处理比较合适使它不重复发长按键?(也就是只在第一次长按有效,要不很别扭啊;这个问题普通键也有吧,因为有的情况下可能复用的键没有安排长按功能)

好了,还有个问题就是缓冲究竟有没有必要?因为这就是个很简单的系统,实时的任务只有遥控,连串口通讯都没有

最普遍的方法应该就是最好的方法吧(对于这些常见问题)

相关帖子

沙发
computer00| | 2008-1-13 18:27 | 只看该作者

这个问题找所长比较好...他有个通用的键盘程序。

我的键盘程序我都是根据需要,临时定制的,所以不怎么通用。

使用特权

评论回复
板凳
LastNew|  楼主 | 2008-1-13 18:29 | 只看该作者

00谦虚了

随便透露下你的看法呗

主要是想学习点大家的好经验

所长的通用键盘我还没有怎么看明白

使用特权

评论回复
地板
high| | 2008-1-13 18:34 | 只看该作者

**中,pc键盘8042,pc大概安排有16个字节的缓冲

长按会间隔性发送make code,这个周期可配置,释放后发送break code.缓冲满了就不接收新的,并鸣一声.这个是电脑键盘的情况.

写一个驱动的原则,在底层驱动中尽量不要带策略,提供机制就好了.上层来处理

使用特权

评论回复
5
LastNew|  楼主 | 2008-1-13 18:34 | 只看该作者

闲着也是闲着,贴出代码让高手指点下

#define    _keyscan_h_

#include <keyscan.h>

void KeyInit(void)
{
    keyread_index=0;
    keywaiting_index=0;
    key_counter=0;
    key_ok=0;
    KeybuffCount=0;
}

void KeyScan(unsigned char * key)
{
    unsigned char key_temp=0x00;

    if (KeyPressed(&key_temp))    //有键按下    //键扫描,获得键值
    {
        if (key_temp == last_key)
        {
            key_counter++;
            if (key_counter>=KEYDELAY)                //连续键
            {
                *key=key_temp+0x80;                //连续键码值在单键基础上加0x80
                key_counter-=KEYLOOP;

                key_ok=1;
            }
        }
        else
        {
            key_counter=0;
            last_key=key_temp;
        }
    }
    else                            //键抬起
    {
        if ((key_counter>=3)&&(key_counter<(KEYDELAY-KEYLOOP)))
        {
            key_ok=1;
            *key=last_key;            //step key decode    //单键解码
        }
        key_counter=0;
    }
 
}

void KeyUpdate(void)
{
    unsigned char key;

    KeyScan(&key);

    if(key_ok==0)
        return;

    key_ok=0;
    
    if(KeybuffCount<KEYPAD_RECV_BUFFERF_LENGTH+1)
    {
        KeybuffCount++;
        
        keyrev_buff[keywaiting_index++]=key;    
    
        if(keywaiting_index>KEYPAD_RECV_BUFFERF_LENGTH)
        {
            keywaiting_index=0;
        }
    }
    else
    {
        keyrev_buff[keywaiting_index]=key;        
    }
}

bit GetKeyCode(unsigned char *  key)
{
    KeyUpdate();

    if(KeybuffCount)
    {
        *key=keyrev_buff[keyread_index++];

        if(keyread_index>KEYPAD_RECV_BUFFERF_LENGTH)
        {
            keyread_index=0;
        }

        KeybuffCount--;
        return 1;
    }
    return 0;
}

bit KeyPressed(unsigned char *  getkey)
{
//  bit fgKeyRelease = 1;
  unsigned char bKeySatus = 0;

  //init KEY1-KEY4
  KEY1 = 1;KEY2 = 1;KEY3 = 1;KEY4 = 1;
  
 //KEY:4/3/2/1
 if (KEY1 == 0)
     {
     bKeySatus = 1;
     }
 else if (KEY2 == 0)
     {
     bKeySatus = 2;
     }
 else if (KEY3 == 0)
     {
     bKeySatus = 3;
     }
 else if (KEY4 == 0)
     {
     bKeySatus = 4;
     }
 else
     {
    //KEY:1-2/1-3/1-4
    //init KEY1-KEY4
    KEY1 = 0;KEY2 = 1;KEY3 = 1;KEY4 = 1;

    if (KEY2 == 0)
        {
        bKeySatus = 5;
        }
    else if (KEY3 == 0)
        {
        bKeySatus = 6;
        }
    else if (KEY4 == 0)
        {
        bKeySatus = 7;
        }

    //KEY: 2-3/2-4
    //init KEY1-KEY4
    KEY1 = 1;KEY2 = 0;KEY3 = 1;KEY4 = 1;
    
    if (KEY3 == 0)
        {
        bKeySatus = 8;
        }
    else if (KEY4 == 0)
        {
        bKeySatus = 9;
        }

    //KEY: 3-4/
    //init KEY1-KEY4
    KEY1 = 1;KEY2 = 1;KEY3 = 0;KEY4 = 1;
    
    if (KEY4 == 0)
        {
        bKeySatus = 10;
        }
     }

  if (bKeySatus != 0)
   {    
    *getkey=bKeySatus ;
     return 1;
  }
  return 0;
}

使用特权

评论回复
6
LastNew|  楼主 | 2008-1-13 18:37 | 只看该作者

high说的好

研究下high的说法

点支烟继续等大虾们的高见

00看出来了吧(  *key=key_temp+0x80;    //连续键码值在单键基础上加0x80)

^_^

使用特权

评论回复
7
computer00| | 2008-1-13 18:41 | 只看该作者

我的键盘是没有缓冲的,等待处理完之后,才能继续按键

连续按键的处理跟你一样,就是时间达到一定值后,每隔一段时间发送一个键值。
长按键则是在按键释放时判断键按下的时间。

使用特权

评论回复
8
LastNew|  楼主 | 2008-1-13 18:45 | 只看该作者

按high说的,应该

按high说的,我应该加一个Key_hold,在上层用函数里面判断,在那里处理是否发按键对么

愚见,多多包涵!确实新手

使用特权

评论回复
9
LastNew|  楼主 | 2008-1-13 18:49 | 只看该作者

00

使用特权

评论回复
10
LastNew|  楼主 | 2008-1-13 18:51 | 只看该作者

呵呵

如果我在按键释放的时候判断长按键就可以做到只在第一次检测按键的时候按键有效了,谢谢提点

这样就没法做加速键了对吧

使用特权

评论回复
11
sz_kd| | 2008-1-13 19:07 | 只看该作者

看Hotpower的键盘程序

使用特权

评论回复
12
LastNew|  楼主 | 2008-1-13 19:23 | 只看该作者

零耗时?OK

改了之后,对这块理解的更深了

底层驱动只能判断单键和长按,因为单按时间长了就变成了长按

底层并不知道需要的是单按或者长按,只有放在上层处理才更结合自然逻辑,加速键也是如此,对否?哈哈

虽然是小小的键盘,可是学到不少哦,谢谢ls各位

使用特权

评论回复
13
LastNew|  楼主 | 2008-1-13 19:31 | 只看该作者

好像还是不对

好像还是不对,上面想的处理单按或长按还可以,若是加速键了,它需要不释放就开始处理啊,貌似加速度一样,越按越快,在上面这样的程序思路里需要如何解决啊

使用特权

评论回复
14
LastNew|  楼主 | 2008-1-13 19:38 | 只看该作者

虽然只想做长按键

虽然只想做长按键,现在也好了,只不过没有搞清楚加速键怎么办,心里还是耿耿于怀

再点起一支烟,继续学习零耗时、通用键盘和各位高手的状态机键盘....

期待关于加速键的指点...

使用特权

评论回复
15
hotpower| | 2008-1-13 20:00 | 只看该作者

哈哈~~~还有什么键盘俺搞不定的???不过还是先学习别的回头

使用特权

评论回复
16
LastNew|  楼主 | 2008-1-13 20:12 | 只看该作者

大叔说地是

大叔说地是,俺躬耕于雁塔农地,这可是俺地追求

(追求:农妇,山泉,有点田!)

大叔可要给我分点地哦

使用特权

评论回复
17
sz_kd| | 2008-1-13 20:17 | 只看该作者

将Hotpower 大叔的0耗时键盘发扬光大

使用特权

评论回复
18
LastNew|  楼主 | 2008-1-13 20:20 | 只看该作者

俺地红塔山哦

俺地红塔山快没了,继续等指点...

等盒子空了回家米西米西去...

使用特权

评论回复
19
LastNew|  楼主 | 2008-1-13 20:59 | 只看该作者

回家咯

买包红塔回家了,大家晚安

使用特权

评论回复
20
hotpower| | 2008-1-13 21:04 | 只看该作者

哈哈~~~回家闭眼就知道你的问题很简单~~~

使用特权

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

本版积分规则

62

主题

352

帖子

0

粉丝