搜索
bottom↓
回复: 78

线反转法扫描矩阵程序

[复制链接]

出0入0汤圆

发表于 2010-10-8 18:12:35 | 显示全部楼层 |阅读模式
uchar key(void)
{
    uchar key,key1,key2,k;
    P1=0XF0;
    k=0xff;
    if((P1&0XF0)!=0XF0)
    {
        delay();
        if((P1&0XF0)!=0XF0)
        key1=P1&0XF0;
        P1=0X0F;
        if((P1&0X0F)!=0X0F)
        {
            delay();
            if((P1&0X0F)!=0X0F)
            {
                key2=P1&0X0F;
                key=key1|key2;
                if(key!=0xff)
                {
                    switch(key)
                    {
                        case 0xee: k=0;break;                       
                        case 0xed: k=1;break;                        
                        case 0xeb: k=2;break;                       
                        case 0xe7: k=3; break;
                        case 0xde: k=4;break;                       
                        case 0xdd: k=5;break;                        
                        case 0xdb: k=6;break;                       
                        case 0xd7: k=7; break;
                         case 0xbe: k=8;break;                       
                        case 0xbd: k=9;break;                        
                        case 0xbb: k=10;break;                       
                        case 0xb7: k=11; break;
                         case 0x7e: k=12;break;                       
                        case 0x7d: k=13;break;                        
                        case 0x7b: k=14;break;                       
                        case 0x77: k=15; break;
                    }
                }
            }
        }
    }
    return(k);
}


只做了键盘扫描程序,说明问题,

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2010-10-9 06:57:50 | 显示全部楼层
代码太多没必要,刚在另一帖子里回的,顺手复制过来吧, 假定4X4,使用P1口反转扫描法:

unsigned char keystatus;
//键扫描,大家真正关心的部分
keystatus = 0;
P1 = 0xF0; keystatus |= (P1&0x0F);
P1 = 0x0F; keystatus |= (P1&0xF0);

//以下是键处理,这部分与键扫描无关了.
switch(keystatus){
case 16种排列组合:~[1000,0100,0010,0001] * [1000,0100,0010,0001]  
}

键扫描为红色部分,就这么几行而已.

出0入0汤圆

发表于 2010-10-9 09:03:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-9 09:36:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-9 19:04:54 | 显示全部楼层
学习下

出0入0汤圆

发表于 2010-10-9 19:41:44 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-10 20:17:21 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-22 23:30:23 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-10 14:24:51 | 显示全部楼层
经典啊,学习了

出0入0汤圆

发表于 2010-12-13 08:45:57 | 显示全部楼层

出0入0汤圆

发表于 2010-12-13 08:53:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-14 17:00:24 | 显示全部楼层
DING!

出0入0汤圆

发表于 2010-12-14 18:12:31 | 显示全部楼层
支持.学习了

出0入0汤圆

发表于 2010-12-14 20:04:55 | 显示全部楼层
是应该这么简短的,行扫描法其实也是不错的

出0入0汤圆

发表于 2010-12-14 20:16:30 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-12-25 13:58:42 | 显示全部楼层
看看

出0入0汤圆

发表于 2010-12-25 14:00:16 | 显示全部楼层
mark!!!

出0入0汤圆

发表于 2010-12-29 09:20:41 | 显示全部楼层
收下

出0入0汤圆

发表于 2011-2-6 20:30:29 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-6 20:57:52 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-8 14:34:13 | 显示全部楼层
呵呵,都是高手。

出0入0汤圆

发表于 2011-4-7 14:12:15 | 显示全部楼层
mark 按键扫描

出0入0汤圆

发表于 2011-4-8 15:51:47 | 显示全部楼层
学习中

出100入0汤圆

发表于 2011-5-7 13:52:54 | 显示全部楼层
思路很好

出0入0汤圆

发表于 2011-5-8 08:27:59 | 显示全部楼层
mark 一下

出0入0汤圆

发表于 2011-5-9 10:56:39 | 显示全部楼层
cool

出0入0汤圆

发表于 2011-5-9 15:51:10 | 显示全部楼层
标记

出0入0汤圆

发表于 2011-7-3 15:37:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-4 10:02:33 | 显示全部楼层
高~

出0入0汤圆

发表于 2011-7-6 10:51:59 | 显示全部楼层
膜拜二楼

出0入0汤圆

发表于 2011-7-6 16:02:01 | 显示全部楼层
回复【1楼】rainyss
-----------------------------------------------------------------------

这个貌似有错误,当两个IO口短接时,是把电平变低,就是说P01是1,P05是0.那么按键按下后应该是P01,P05都为0.按照你所说,那么KEYSTATUE一直是0X00,应该
P1 = 0xF0; keystatus |= (P1&0xF0);  
P1 = 0x0F; keystatus |= (P1&0x0F);

出0入0汤圆

发表于 2011-7-10 13:03:31 | 显示全部楼层
关注一下,

出0入0汤圆

发表于 2011-7-10 15:22:29 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-16 10:06:33 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-18 14:35:02 | 显示全部楼层
回复【30楼】wj78681969  
回复【1楼】rainyss
-----------------------------------------------------------------------
这个貌似有错误,当两个io口短接时,是把电平变低,就是说p01是1,p05是0.那么按键按下后应该是p01,p05都为0.按照你所说,那么keystatue一直是0x00,应该
p1 = 0xf0; keystatus |= (p1&0xf0);  
p1 = 0x0f; keystatus |= (p1&0x0f);  

-----------------------------------------------------------------------
正解!得到keystatus后可以转换编码变成0-15的形式用switch 。。。case

出0入0汤圆

发表于 2011-8-18 14:53:55 | 显示全部楼层
m k

出0入0汤圆

发表于 2011-8-20 19:10:22 | 显示全部楼层
这个必须mark

出0入0汤圆

发表于 2011-8-30 15:43:36 | 显示全部楼层
回复【1楼】rainyss  
代码太多没必要,刚在另一帖子里回的,顺手复制过来吧, 假定4x4,使用p1口反转扫描法:
unsigned char keystatus;
//键扫描,大家真正关心的部分
keystatus = 0;
p1 = 0xf0; keystatus |= (p1&0x0f);
p1 = 0x0f; keystatus |= (p1&0xf0);

//以下是键处理,这部分与键扫描无关了.
switch(keystatus){
case 16种排列组合:~[1000,0100,0010,0001] * [1000,0100,0010,0001]  
}
键扫描为红色部分,就这么几行而已.
-----------------------------------------------------------------------

mark,马克,马可,马科,吗可

出0入0汤圆

发表于 2011-8-30 16:58:11 | 显示全部楼层
这个精简版本需要mark
头像被屏蔽

出0入0汤圆

发表于 2011-8-30 20:18:54 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2011-8-30 22:38:34 | 显示全部楼层

出0入0汤圆

发表于 2011-9-3 11:24:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-3 21:14:49 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-9-4 10:10:19 | 显示全部楼层
非常好的反转法,学习了!

出0入0汤圆

发表于 2011-9-4 11:03:28 | 显示全部楼层
回复【1楼】rainyss
-----------------------------------------------------------------------

出0入0汤圆

发表于 2011-9-12 17:42:41 | 显示全部楼层
马克

出0入0汤圆

发表于 2011-9-13 00:38:22 | 显示全部楼层
扫描法呢 给个代码看看

出0入0汤圆

发表于 2011-9-13 09:26:29 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-9-15 00:14:56 | 显示全部楼层
回复【1楼】rainyss
-----------------------------------------------------------------------

不太明白

出0入0汤圆

发表于 2011-9-15 03:44:04 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-9-15 17:02:37 | 显示全部楼层
二楼经典啊,mark

出0入0汤圆

发表于 2011-10-13 12:57:37 | 显示全部楼层
顶下二楼

出0入0汤圆

发表于 2011-10-13 20:11:10 | 显示全部楼层
二楼的用法好像用过,嗯,不错。

出0入0汤圆

发表于 2011-10-19 19:43:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-21 16:11:36 | 显示全部楼层
回复【48楼】dawmoon
-----------------------------------------------------------------------
扫描法 是逐行扫描查询 假如按键很多  按下的键位于最后1列时 那么要扫描到最后一列才能知道按键位置
反转法 无论按下是第一列 还是最后1列,只需要2步便可获得按键位置
所以反转法更加方便实用

出0入0汤圆

发表于 2011-10-21 16:25:31 | 显示全部楼层
回复【48楼】dawmoon
-----------------------------------------------------------------------
扫描法 代码更多
unsigned int keyboar()           //键盘检测函数,返回键值
{
    P2=0xfe;
    temp=P2;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
          delay1ms(10);
         temp=P2;
             switch(temp)
             {
                   case 0xee:
                              key=0;
                             break;
                   case 0xde:
                              key=1;
                              break;
                   case 0xbe:
                              key=2;
                              break;
                   case 0x7e:
                              key=3;
                              break;         
             }
         while(temp!=0xf0)          
         {
               temp=P2;
               temp=temp&0xf0;
         }  
    }

    P2=0xfd;
    temp=P2;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
          delay1ms(10);
             temp=P2;
             switch(temp)
             {
                   case 0xed:
                               key=4;
                               break;
                   case 0xdd:
                               key=5;
                               break;
                   case 0xbd:
                               key=6;
                              break;
                   case 0x7d:
                               key=7;
                              break;         
             }
             while(temp!=0xf0)          
             {
                  temp=P2;
                  temp=temp&0xf0;
             }   
    }

    P2=0xfb;
    temp=P2;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
          delay1ms(10);
             temp=P2;
             switch(temp)
             {
                   case 0xeb:
                              key=8;
                             break;
                   case 0xdb:
                              key=9;
                             break;
                   case 0xbb:
                              key=10;
                             break;
                   case 0x7b:
                              key=11;
                             break;         
             }
             while(temp!=0xf0)          
             {
                   temp=P2;
                   temp=temp&0xf0;
             }   
    }

    P2=0xf7;
    temp=P2;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
         delay1ms(10);
             temp=P2;
             switch(temp)
             {
                   case 0xe7:
                              key=12;
                             break;
                   case 0xd7:
                              key=13;
                             break;
                   case 0xb7:
                              key=14;
                             break;
                   case 0x77:
                              key=15;
                             break;         
             }
             while(temp!=0xf0)          
             {
                   temp=P2;
                   temp=temp&0xf0;
             }   
    }
    return key;
}

出0入0汤圆

发表于 2011-10-21 16:46:01 | 显示全部楼层
回复【58楼】yao1
-----------------------------------------------------------------------

代码太长 重新简化
int keyscan()
{
       unsigned char k k_temp;
       P1=0xf0;      //低位置0,准备查询按键
       k=P1;         //取得当前P1口状态
       if(k!=0xf0)   //如果有变化则表示有按键按下
       {
              delay(10);    //延迟 消抖
              k_temp=p1;
              if(k==k_temp)  //确实有键按下
              {
                     k=0xfe;
                     do         //循环扫描每一行
                     {
                            p1=k;
                            if(k!=p1)
                            {
                           
                                  switch(P1)  //判断按键 并返回键值
                                  {
                                     //第1行
                                     case 0x7e:{return 0;break;}
                                     case 0xbe:{return 0;break;}
                                     case 0xde:{return 0;break;}
                                     case 0xee:{return 0;break;}
                                     //第2行
                                     case 0x7d:{return 0;break;}
                                     case 0xbd:{return 0;break;}
                                     case 0xdd:{return 0;break;}
                                     case 0xed:{return 0;break;}
                                     //第3行
                                     case 0x7b:{return 0;break;}
                                     case 0xbb:{return 0;break;}
                                     case 0xdb:{return 0;break;}
                                     case 0xeb:{return 0;break;}
                                     //第4行
                                     case 0x77:{return 0;break;}
                                     case 0xb7:{return 0;break;}
                                     case 0xd7:{return 0;break;}
                                     case 0xe7:{return 0;break;}
                             
                                  }                                                                                
                            }
                            k=_crol_(k,1);   //移位 进入下一行扫描               
                     }
                     while(k!=0xef); //超过列范围 退出扫描                        
              }         
       }
}

出0入0汤圆

发表于 2011-10-21 17:36:06 | 显示全部楼层
回复【59楼】yao1
-----------------------------------------------------------------------

修正return 数
     //第1行
                                     case 0x7e:{return 0; break;}
                                     case 0xbe:{return 1; break;}
                                     case 0xde:{return 2; break;}
                                     case 0xee:{return 3; break;}
                                     //第2行
                                     case 0x7d:{return 4; break;}
                                     case 0xbd:{return 5; break;}
                                     case 0xdd:{return 6; break;}
                                     case 0xed:{return 7; break;}
                                     //第3行
                                     case 0x7b:{return 8; break;}
                                     case 0xbb:{return 9; break;}
                                     case 0xdb:{return 10;break;}
                                     case 0xeb:{return 11;break;}
                                     //第4行
                                     case 0x77:{return 12;break;}
                                     case 0xb7:{return 13;break;}
                                     case 0xd7:{return 14;break;}
                                     case 0xe7:{return 15;break;}

出0入0汤圆

发表于 2011-11-8 22:28:08 | 显示全部楼层
回复【楼主位】GOOOOL  
-----------------------------------------------------------------------

多谢分享

出0入0汤圆

发表于 2011-11-8 23:06:59 | 显示全部楼层
太精典了

出0入0汤圆

发表于 2011-12-1 15:54:11 | 显示全部楼层
不错,不错,高手如云!

出0入0汤圆

发表于 2011-12-27 11:51:49 | 显示全部楼层
MARK!

出0入0汤圆

发表于 2011-12-28 13:13:16 | 显示全部楼层
30楼说的应该是正确的,模拟可以,方法也如1楼所说,比较简洁了~~!!

出0入0汤圆

发表于 2011-12-28 13:19:45 | 显示全部楼层
学习

出0入0汤圆

发表于 2012-5-27 10:17:05 | 显示全部楼层
嗯,不错的,但是线转发没有松手检测啊,这样的键盘程序你是没用的啊,实际一起中要是没有松手检测一般都会出问题的

出0入0汤圆

发表于 2012-8-16 18:01:33 | 显示全部楼层
mark,马克,马可,马科,吗可
头像被屏蔽

出0入0汤圆

发表于 2012-8-25 13:58:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
头像被屏蔽

出0入0汤圆

发表于 2012-8-28 15:52:54 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2013-4-8 14:03:04 | 显示全部楼层
mark   4x4 key

出0入0汤圆

发表于 2013-4-8 14:29:50 | 显示全部楼层
貌似很强大的说。~

出0入0汤圆

发表于 2014-2-10 23:01:03 | 显示全部楼层
4x4矩阵键盘,mark

出0入0汤圆

发表于 2014-2-10 23:03:32 | 显示全部楼层
mark      

出0入0汤圆

发表于 2015-12-22 11:27:24 | 显示全部楼层
mark,学无止境

出0入0汤圆

发表于 2018-9-28 16:57:30 | 显示全部楼层
mark......

出0入0汤圆

发表于 2019-4-17 13:54:42 | 显示全部楼层
按键扫描   MARK.....

出0入0汤圆

发表于 2019-5-7 12:02:56 | 显示全部楼层
OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-8 18:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表