8x16矩阵键盘的管理

[复制链接]
2447|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多个标志?
tyw 发表于 2014-6-20 18:21 | 显示全部楼层
helezh 发表于 2014-6-20 18:13
那不是要设100多个标志?

占用16个字节内存,哈哈,谁让你勒么多键同时用
 楼主| helezh 发表于 2014-6-20 19:22 | 显示全部楼层
没有啊 现在开发一个标准键盘 就是矩阵案件管理没搞定了
 楼主| helezh 发表于 2014-6-20 19:23 | 显示全部楼层
tyw 发表于 2014-6-20 18:21
占用16个字节内存,哈哈,谁让你勒么多键同时用

不晓得行业做法是怎样的 没有啊 现在开发一个标准键盘 就是矩阵案件管理没搞定了
 楼主| 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;
                }
}
 楼主| helezh 发表于 2014-6-21 13:17 | 显示全部楼层
欢迎补冲
 楼主| helezh 发表于 2014-6-21 16:09 | 显示全部楼层
附上protuse工程 16X8按键管理支持多键组合, 理论上多少键都行,发现问题欢迎指正

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| helezh 发表于 2014-6-21 18:22 | 显示全部楼层
呼叫管理员 为什么我上传的文件 被通知要下架?
beanandpeach 发表于 2014-6-29 18:03 | 显示全部楼层
lgdjade 发表于 2014-6-29 19:16 | 显示全部楼层
xxlin1984 发表于 2014-6-30 09:14 | 显示全部楼层
这么多键,不考虑外接标准电脑键盘吗
myxiaonia 发表于 2015-9-29 10:29 | 显示全部楼层
纯粹的矩阵键盘是不支持任意的组合键的,因为#字型按键时无**确区分,但是可以支持同行或者同列上的多个组合键

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

其实想想就知道了,行列组合和任意键组合根本就无法形成一一映射,怎么可能做到真正的独立按键呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

140

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部