打印

请教XWJ 键盘扫描问题

[复制链接]
1609|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yanhuale|  楼主 | 2008-4-13 00:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我看到你的键盘程序是这样的,现在不懂的地方请教一下

void KeyScan(void)                    //键扫描
    {
    unsigned char sccode,recode;
    KEYPIN_L = KEYPIN_L|0x0f;                    //  P1低四位为列线输入         //
    KEYPIN_H = KEYPIN_H&0x0f;                    //  P1高四位为行线发全零扫描码 //
    if ((KEYPIN_L&0x0f) !=  0x0f)    //有键按下
        {
        key_temp = 键值;             //键扫描,获得键值
        if (key_temp == key_bak)
            {
            key_old++;
            if (key_old==KEYDELAY)                //连续键,不要则把此if屏蔽
                {
                key_ok=1;
                key_data=fnKeycode(key_temp);    //键解码
                key_old=KEYDELAY-KEYLOOP;
            }
        }
        else
            {
            key_old=0;
            key_bak=key_temp;
        }
    }
    else                            //键抬起
        {
        if (key_old)      ///这里KEY_OLD == 1??为什么这样?条件会成立吗?
            {
            key_ok=1;
            key_data=fnKeycode(key_temp);    //键解码
/*            if (key_old==100)                //加上时间,不同时间不同功能,与连续键冲突
                {
                bp(1);
                key_data    +=    0x10;
            }
            if (key_old==200)
                {
                bp(2);
                key_data    +=    0x20;
            }
*/
        }
        key_old=0;
    }
    KEYPIN_H = KEYPIN_H|0xf0;  ///这里是什么意思呢????
}

你的键盘程序的长按功能是不是等按键抬高才能实现的呢?
还有可否给个简单的例子呢?

相关帖子

沙发
xwj| | 2008-4-13 09:45 | 只看该作者

不是==1,而是非0

这是个状态机,怎么执行是看前面几次扫描结果的,然后修改状态给后面的扫描用
不能只看一次哦

使用特权

评论回复
板凳
xwj| | 2008-4-13 09:52 | 只看该作者

至于长按

有多种方案的:
1.按键一定时间或释放才有效
2.按键一定时间后开始发加速键
3.按键不同时间是不同的键值(/*   */注释部分)

要根据实际操作要求来定的
自己去想去领悟吧:-)

使用特权

评论回复
地板
yanhuale|  楼主 | 2008-4-13 17:24 | 只看该作者

我的修改的程序为什么不行呢?

//判断是否有键按下,有返回1,否则返回0
uint8 KeyRead(void)
{

   key=key_pin;
     key|=0x00;
     if(key==0x7f)
             return (key_value = browse);
            else if(key==0xfD)
           return (key_value=mater);
            else if(key==0xfB)
            return (key_value = conver);
      else if(key==0xf7)
            return (key_value=impact);
            else if(key == 0xef )
            return (key_value = del);
            else if(key == 0xbf)
            return (key_value = time);
             else
             {
              return 0;
             }  
}


    //  P1口行列式键盘  //
//---------------------------------------------------------------------------//
void KeyScan(void)                    //键扫描
    {
    unsigned char sccode,recode;
    key_temp = KeyRead();            //键扫描,获得键值
    if (key_temp != 0)    //有键按下
        {
        
        if (key_temp == key_bak)
            {
            key_old++;
            if (key_old==KEYDELAY)                //连续键,不要则把此if屏蔽
                {
                      
                key_ok=1;
                key_data=key_value;    //键解码
                key_old=KEYDELAY-KEYLOOP;
            }
            
 
        }
        else
            {
            key_old=0;
            key_bak=key_temp;
        }
    }
    else                            //键抬起
        {
        if (key_old)
            {
            key_ok=1;
            key_data=key_value;    //键解码
       if (key_old==2000)                //加上时间,不同时间不同功能,与连续键冲突
                {
   

                  long_flag = 1;//在这里设个标志位 ,在主程序扫描得到长按功能
                
            }
 /*            if (key_old==200)
                {
                bp(2);
                key_data    +=    0x20;////这里为什么要加0X20呢?不懂
            }
*/
        }
        key_old=0;
    }

    key = key|0xff;  //这里我不懂得怎么样改啊
}

上面这个程序我是按照你的修改的,但我的长按功能不行.不知为什么呢....帮我看看吗?我的是一个IO接一按键的.....

使用特权

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

本版积分规则

1

主题

2

帖子

0

粉丝