GOOOOL 发表于 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);
}


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

rainyss 发表于 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种排列组合:~ *
}

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

kunpeng032 发表于 2010-10-9 09:03:03

mark

zhuhanliang 发表于 2010-10-9 09:36:14

mark

wuyi 发表于 2010-10-9 19:04:54

学习下

cuikai12345 发表于 2010-10-9 19:41:44

mark

afei8856 发表于 2010-10-10 20:17:21

mark

AilesArgentees 发表于 2010-10-22 23:30:23

mark

jiongeyes 发表于 2010-11-10 14:24:51

经典啊,学习了

wxhland 发表于 2010-12-13 08:45:57

fzkqi 发表于 2010-12-13 08:53:51

mark

zhangli2020 发表于 2010-12-14 17:00:24

DING!

shenrongze 发表于 2010-12-14 18:12:31

支持.学习了

chener13 发表于 2010-12-14 20:04:55

是应该这么简短的,行扫描法其实也是不错的

yywin 发表于 2010-12-14 20:16:30

学习

tfavr2008 发表于 2010-12-25 13:58:42

看看

mozilaam 发表于 2010-12-25 14:00:16

mark!!!

lixupeng 发表于 2010-12-29 09:20:41

收下

xidxid 发表于 2011-2-6 20:30:29

mark

downtoearth 发表于 2011-2-6 20:57:52

mark

ERDTxiduoduo 发表于 2011-2-8 14:34:13

呵呵,都是高手。

Bati-Gol 发表于 2011-4-7 14:12:15

mark 按键扫描

zuogm 发表于 2011-4-8 15:51:47

学习中

focus012 发表于 2011-5-7 13:52:54

思路很好

zhao_jian_xin 发表于 2011-5-8 08:27:59

mark 一下

eryueniao 发表于 2011-5-9 10:56:39

cool

anvy178 发表于 2011-5-9 15:51:10

标记

guoyin 发表于 2011-7-3 15:37:42

mark

CSU_David 发表于 2011-7-4 10:02:33

高~

wj78681969 发表于 2011-7-6 10:51:59

膜拜二楼

wj78681969 发表于 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);

hepday 发表于 2011-7-10 13:03:31

关注一下,./emotion/em025.gif

bluelool 发表于 2011-7-10 15:22:29

mark

bingshuihuo888 发表于 2011-8-16 10:06:33

mark

sxbgfz 发表于 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

23216 发表于 2011-8-18 14:53:55

m k

hzc171 发表于 2011-8-20 19:10:22

这个必须mark

28182900 发表于 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种排列组合:~ *
}
键扫描为红色部分,就这么几行而已.
-----------------------------------------------------------------------

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

ssmart 发表于 2011-8-30 16:58:11

这个精简版本需要mark

ky51 发表于 2011-8-30 20:18:54

comway 发表于 2011-8-30 22:38:34

l09046162 发表于 2011-9-3 11:24:49

mark

renwocai 发表于 2011-9-3 21:14:49

MARK

dazhi 发表于 2011-9-4 10:10:19

非常好的反转法,学习了!

zzq4169 发表于 2011-9-4 11:03:28

回复【1楼】rainyss
-----------------------------------------------------------------------

Wangwy 发表于 2011-9-12 17:42:41

马克

dawmoon 发表于 2011-9-13 00:38:22

扫描法呢 给个代码看看

pwfeng520 发表于 2011-9-13 09:26:29

MARK

zzq4169 发表于 2011-9-15 00:14:56

回复【1楼】rainyss
-----------------------------------------------------------------------

不太明白

Tankng 发表于 2011-9-15 03:44:04

MARK

xjx41 发表于 2011-9-15 17:02:37

二楼经典啊,mark

renwocai 发表于 2011-10-13 12:57:37

顶下二楼

tcpln 发表于 2011-10-13 20:11:10

二楼的用法好像用过,嗯,不错。

henry 发表于 2011-10-19 19:43:47

mark

yao1 发表于 2011-10-21 16:11:36

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

yao1 发表于 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;
}

yao1 发表于 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); //超过列范围 退出扫描                        
            }         
       }
}

yao1 发表于 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;}

yanghongguo 发表于 2011-11-8 22:28:08

回复【楼主位】GOOOOL
-----------------------------------------------------------------------

多谢分享

yanghongguo 发表于 2011-11-8 23:06:59

太精典了

552467160 发表于 2011-12-1 15:54:11

不错,不错,高手如云!

rpg_9527 发表于 2011-12-27 11:51:49

MARK!

senzh01 发表于 2011-12-28 13:13:16

30楼说的应该是正确的,模拟可以,方法也如1楼所说,比较简洁了~~!!

xhe332523 发表于 2011-12-28 13:19:45

学习

dongfo 发表于 2012-5-27 10:17:05

嗯,不错的,但是线转发没有松手检测啊,这样的键盘程序你是没用的啊,实际一起中要是没有松手检测一般都会出问题的

lbxx135 发表于 2012-8-16 18:01:33

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

Q28182900 发表于 2012-8-25 13:58:00

Q28182900 发表于 2012-8-28 15:52:54

jackmo 发表于 2013-4-8 14:03:04

mark   4x4 key

nixiu520 发表于 2013-4-8 14:29:50

貌似很强大的说。~

loliweive 发表于 2014-2-10 23:01:03

4x4矩阵键盘,mark

busterace 发表于 2014-2-10 23:03:32

mark      

xiaoluo2009 发表于 2015-12-22 11:27:24

mark,学无止境

sumec_jszx 发表于 2018-9-28 16:57:30

mark......

diego2003 发表于 2019-4-17 13:54:42

按键扫描   MARK.....

bill_shd 发表于 2019-5-7 12:02:56

OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!
页: [1]
查看完整版本: 线反转法扫描矩阵程序