打印

8x16矩阵键盘的管理

[复制链接]
1924|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
helezh|  楼主 | 2014-6-20 14:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
要求:1,要实按键单按 2,要实现组合按  3,矩阵实现的方法是16列扫描,读行码
我这边的思想是实现组合按时,先得到第一个扫描到的单键(只处理按键按下有先后顺序的事件)然后按上次的单按键扫描码与本次的复合按键扫描码求出后面复合键增加的扫描码后面按下第三个时就根据上两个案件的扫描码又求出增加的单键扫描码,。。。。。
现在这个算法不好实现 有那位有跟好的方法,欢迎指导!

相关帖子

沙发
helezh|  楼主 | 2014-6-20 14:25 | 只看该作者
关键是求出后来者按键

使用特权

评论回复
板凳
tyw| | 2014-6-20 14:32 | 只看该作者
本帖最后由 tyw 于 2014-6-20 14:33 编辑

每个键设一标志,有按下就置1
对16字节键标志进行查表,求得组合键代码
按代码进行键处理
处理结束后恢复键标志

使用特权

评论回复
地板
helezh|  楼主 | 2014-6-20 18:13 | 只看该作者
tyw 发表于 2014-6-20 14:32
每个键设一标志,有按下就置1
对16字节键标志进行查表,求得组合键代码
按代码进行键处理

那不是要设100多个标志?

使用特权

评论回复
5
tyw| | 2014-6-20 18:21 | 只看该作者
helezh 发表于 2014-6-20 18:13
那不是要设100多个标志?

占用16个字节内存,哈哈,谁让你勒么多键同时用

使用特权

评论回复
6
helezh|  楼主 | 2014-6-20 19:22 | 只看该作者
没有啊 现在开发一个标准键盘 就是矩阵案件管理没搞定了

使用特权

评论回复
7
helezh|  楼主 | 2014-6-20 19:23 | 只看该作者
tyw 发表于 2014-6-20 18:21
占用16个字节内存,哈哈,谁让你勒么多键同时用

不晓得行业做法是怎样的 没有啊 现在开发一个标准键盘 就是矩阵案件管理没搞定了

使用特权

评论回复
8
helezh|  楼主 | 2014-6-21 13:15 | 只看该作者
补发目前状况
while(1)
        {
       
         part[0]=hal_matris_read();//接收扫描码
         Process_scan_code(&part);
         Generate_usb_code(&tx_buf,&part);
         
        }

long int  hal_matris_read()//char* queue,char *sign)
{       
         static unsigned int andbit2 = 0x01;  
         char key[3];       
         unsigned long int scan_data;
         int k;
                
                         //设置P1口 某根线为低扫描 j行       
                        P2= (~andbit2 & 0xff00)>>8;               
                        P1=  ~andbit2 &0x00ff;
                        P2= (~andbit2 & 0xff00)>>8;
  
                        for(k=0;k<0xffff;k++);//30ms         //延时去抖处理
                        key[0] = P2;
                        key[1] = P1;
                        key[2] = P0;
                        memcpy(&scan_data,key,3);
                    scan_data=scan_data>>8;                         //得到当前扫描码                                                         
                    andbit2=(andbit2>>(16-1))|(andbit2<<1);
                        return  scan_data;
}                                                                                                                                          
void Process_scan_code(unsigned long *part)
{       

                                                 //列按键分离
                                                 part[1]=part[0]|0xfe;
                                                 part[2]=part[0]|0xfd;
                                                 part[3]=part[0]|0xfb;
                                                 part[4]=part[0]|0xf7;
                                                 part[5]=part[0]|0xef;
                                                 part[6]=part[0]|0xdf;
                                                 part[7]=part[0]|0xbf;
                                                 part[8]=part[0]|0x7f;

}

void Generate_usb_code(unsigned char *tx_buf,unsigned long int* scan_code)
{
                         //根据扫描码生成usb码
                         //填充usb数据表
        unsigned char usb,i;
        unsigned long tmp;
       
        for(i=0;i<8;i++)
                {       
                        tmp=scan_code[1+i];       
                        switch(tmp)
                                    {                            //usb
                                      case 0xfffeff: usb=0xE3; break; // L GUI
                                      case 0xfffefe: usb=0xE4; break; // R ctrl
                                      case 0xfffefd: usb=0xE7; break; // R GUI
                                      case 0xfffefb: usb=0xE6; break; // R ALT
                                      case 0xfffef7: usb=0x65; break; // APP
                                      case 0xfffeef: usb=0x49; break; // Keyboard insert
                                      case 0xfffedf: usb=0x4A; break; // Keyboard home
                                      case 0xfffebf: usb=0x4B; break; // Keyboard page up
                                      case 0x00007f: usb=0x4C; break; // Keyboard delete     
                                      default: usb=0;
                                    }
                          tx_buf[i]=usb;
                }
}

使用特权

评论回复
9
helezh|  楼主 | 2014-6-21 13:17 | 只看该作者
欢迎补冲

使用特权

评论回复
10
helezh|  楼主 | 2014-6-21 16:09 | 只看该作者
附上protuse工程 16X8按键管理支持多键组合, 理论上多少键都行,发现问题欢迎指正

中断.zip

87.98 KB

使用特权

评论回复
11
helezh|  楼主 | 2014-6-21 18:22 | 只看该作者
呼叫管理员 为什么我上传的文件 被通知要下架?

使用特权

评论回复
12
beanandpeach| | 2014-6-29 18:03 | 只看该作者

使用特权

评论回复
13
lgdjade| | 2014-6-29 19:16 | 只看该作者
:)

使用特权

评论回复
14
xxlin1984| | 2014-6-30 09:14 | 只看该作者
这么多键,不考虑外接标准电脑键盘吗

使用特权

评论回复
15
myxiaonia| | 2015-9-29 10:29 | 只看该作者
纯粹的矩阵键盘是不支持任意的组合键的,因为#字型按键时无**确区分,但是可以支持同行或者同列上的多个组合键

要想使用类似于电脑上的组合键,像ctrl,shift,alt这几个键,必须是独立按键,才能自由组合

其实想想就知道了,行列组合和任意键组合根本就无法形成一一映射,怎么可能做到真正的独立按键呢

使用特权

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

本版积分规则

5

主题

140

帖子

0

粉丝