打印

我写的按键扫描程序,欢迎排砖!

[复制链接]
2047|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vimman|  楼主 | 2007-9-30 08:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#define KEYSCAN_TICK     5   //50ms

#define KEY_PRESS_INTERVAL   4

#define KEY_SHORTUP_TICK 18   //900ms
#define KEY_LONGUP_TICK  30  //1000ms

#define DOWN_MASK_BIT    16
#define PRESS_MASK_BIT   17
#define SHORTUP_MASK_BIT 18
#define LONGUP_MASK_BIT  19
INT32U  Key = 0;
INT32U  preKeyValue = 0xffffffff;
INT32U  keyTimer = 0;
void KeyScan(void)//Interrup Service Routin
{
INT32U keyValue;
Key = 0;
keyValue = GetKeyValue();
if(keyValue)
{
 if(keyTimer == 0)
   Key = keyValue + ((INT32U)1<<16);//down
 else if(keyTimer >= KEY_SHORTUP_TICK )
     {
      if(keyTimer % KEY_PRESS_INTERVAL == 0)
         {
             Key = keyValue + ((INT32U)1<<17);//press
         }
     }
}
else
{
  if(keyTimer > 0 && keyTimer < KEY_SHORTUP_TICK)
      {
      Key = preKeyValue  + ((INT32U)1<<18);//short up
      }
  else if(keyTimer >= KEY_LONGUP_TICK)
      {
        Key = preKeyValue + ((INT32U)1<<19);//long up
      }
  keyTimer = 0;
}
if(keyValue == preKeyValue )
{
   keyTimer++;
}
if(keyValue)
   preKeyValue = keyValue;
}
第一个写按键扫描程序,欢迎大侠拍转,指出偶程序的bug!

相关帖子

沙发
vimman|  楼主 | 2007-9-30 08:42 | 只看该作者

错了,是第一次写;不是第一个写!呵呵

使用特权

评论回复
板凳
ayb_ice| | 2007-10-4 16:58 | 只看该作者

代码能不能搞整齐点...

使用特权

评论回复
地板
freebenben| | 2007-10-4 17:34 | 只看该作者

INT32U==ULONG??

使用特权

评论回复
5
vimman|  楼主 | 2007-10-5 16:32 | 只看该作者

是的,32位无符号型

代码在Source Insight上是整齐的,粘贴过来就不行了。

使用特权

评论回复
6
ayb_ice| | 2007-10-5 17:05 | 只看该作者

我来整理一下。。。

#define KEYSCAN_TICK        5   // 50ms

#define KEY_PRESS_INTERVAL  4

#define KEY_SHORTUP_TICK    18  // 900ms
#define KEY_LONGUP_TICK     30  // 1000ms

#define DOWN_MASK_BIT       16
#define PRESS_MASK_BIT      17
#define SHORTUP_MASK_BIT    18
#define LONGUP_MASK_BIT     19

INT32U  Key = 0;
INT32U  preKeyValue = 0xffffffff;
INT32U  keyTimer = 0;

void KeyScan(void)    // Interrup Service Routin
{
    INT32U keyValue;

    Key = 0;
    keyValue = GetKeyValue();
    if(keyValue)
    {
        if(keyTimer == 0)
           Key = keyValue + ((INT32U)1<<16);        // down
        else if(keyTimer >= KEY_SHORTUP_TICK )
        {
            if(keyTimer % KEY_PRESS_INTERVAL == 0)
            {
                Key = keyValue + ((INT32U)1<<17);    // press
            }
        }
    }
    else
    {
        if(keyTimer > 0 && keyTimer < KEY_SHORTUP_TICK)
        {
            Key = preKeyValue  + ((INT32U)1<<18);    // short up
        }
        else if(keyTimer >= KEY_LONGUP_TICK)
        {
            Key = preKeyValue + ((INT32U)1<<19);    // long up
        }
        keyTimer = 0;
    }
    if(keyValue == preKeyValue)
    {
        keyTimer++;
    }
    if(keyValue) preKeyValue = keyValue;
}
第一个写按键扫描程序,欢迎大侠拍转,指出偶程序的bug!

使用特权

评论回复
7
ayb_ice| | 2007-10-5 20:05 | 只看该作者

随便说说

INT32U  Key = 0;
INT32U  preKeyValue = 0xffffffff;
INT32U  keyTimer = 0;
这些变量都用32位数表示太浪费了吧,当然32位机除外。。。

Key = keyValue + ((INT32U)1<<16);// down
这里的((INT32U)1<<16)表示看不出什么意思,可读性太差。。。
总之这样的程序在8位机上效率太低。。。

使用特权

评论回复
8
vimman|  楼主 | 2007-10-6 13:34 | 只看该作者

在32bit-ARM7上实现的

本帖最后由 vimman 于 2014-4-9 13:56 编辑

高16BIT表示按键状态,比如DOWN,PRESS,SHORTUP,LONGUP;低16bit表示具体哪个按键!

使用特权

评论回复
9
vimman|  楼主 | 2007-11-21 16:44 | 只看该作者

咋没人关注我的按键扫描程序呀?

使用特权

评论回复
10
ayb_ice| | 2007-11-21 16:49 | 只看该作者

高16BIT表示按键状态

太多状态了吧,是人就会晕

使用特权

评论回复
11
eraychen| | 2007-11-21 23:22 | 只看该作者

GetKeyValue();这个函数呢?

使用特权

评论回复
12
ayb_ice| | 2007-11-22 08:00 | 只看该作者

此程序置于中断中不好吧

扫键程序要求又不高

使用特权

评论回复
13
vimman|  楼主 | 2007-11-22 16:57 | 只看该作者

是定时扫描的

没有在中断里,仿照计算机键盘区分按键的各种状态而已,有的应用有这个需求呀!

使用特权

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

本版积分规则

12

主题

81

帖子

0

粉丝